1*c2a7577fSLarsGit223 2f0fda08aSwikidesign<?php 3f0fda08aSwikidesign/** 4f0fda08aSwikidesign * Discussion Plugin, threads component: displays a list of recently active discussions 5f0fda08aSwikidesign * 6f0fda08aSwikidesign * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 7f0fda08aSwikidesign * @author Esther Brunner <wikidesign@gmail.com> 8f0fda08aSwikidesign */ 9f0fda08aSwikidesign 10f0fda08aSwikidesign// must be run within Dokuwiki 11f0fda08aSwikidesignif(!defined('DOKU_INC')) die(); 12f0fda08aSwikidesign 13e7ac9adaSGerrit Uitslag/** 14e7ac9adaSGerrit Uitslag * Class syntax_plugin_discussion_threads 15e7ac9adaSGerrit Uitslag */ 16f0fda08aSwikidesignclass syntax_plugin_discussion_threads extends DokuWiki_Syntax_Plugin { 17f0fda08aSwikidesign 18e7ac9adaSGerrit Uitslag /** 19e7ac9adaSGerrit Uitslag * Syntax Type 20e7ac9adaSGerrit Uitslag * 21e7ac9adaSGerrit Uitslag * @return string 22e7ac9adaSGerrit Uitslag */ 23f0fda08aSwikidesign function getType() { return 'substition'; } 24e7ac9adaSGerrit Uitslag 25e7ac9adaSGerrit Uitslag /** 26e7ac9adaSGerrit Uitslag * Paragraph Type 27e7ac9adaSGerrit Uitslag * 28e7ac9adaSGerrit Uitslag * @see Doku_Handler_Block 29e7ac9adaSGerrit Uitslag * @return string 30e7ac9adaSGerrit Uitslag */ 31f0fda08aSwikidesign function getPType() { return 'block'; } 32e7ac9adaSGerrit Uitslag 33e7ac9adaSGerrit Uitslag /** 34e7ac9adaSGerrit Uitslag * Sort for applying this mode 35e7ac9adaSGerrit Uitslag * 36e7ac9adaSGerrit Uitslag * @return int 37e7ac9adaSGerrit Uitslag */ 38f0fda08aSwikidesign function getSort() { return 306; } 395fc512fbSwikidesign 40e7ac9adaSGerrit Uitslag /** 41e7ac9adaSGerrit Uitslag * @param string $mode 42e7ac9adaSGerrit Uitslag */ 435fc512fbSwikidesign function connectTo($mode) { 445fc512fbSwikidesign $this->Lexer->addSpecialPattern('\{\{threads>.+?\}\}', $mode, 'plugin_discussion_threads'); 455fc512fbSwikidesign } 46f0fda08aSwikidesign 47e7ac9adaSGerrit Uitslag /** 48e7ac9adaSGerrit Uitslag * Handler to prepare matched data for the rendering process 49e7ac9adaSGerrit Uitslag * 50e7ac9adaSGerrit Uitslag * @param string $match The text matched by the patterns 51e7ac9adaSGerrit Uitslag * @param int $state The lexer state for the match 52e7ac9adaSGerrit Uitslag * @param int $pos The character position of the matched text 53e7ac9adaSGerrit Uitslag * @param Doku_Handler $handler The Doku_Handler object 54e7ac9adaSGerrit Uitslag * @return array Return an array with all data you want to use in render 55e7ac9adaSGerrit Uitslag */ 56e7ac9adaSGerrit Uitslag function handle($match, $state, $pos, Doku_Handler $handler) { 57f0fda08aSwikidesign global $ID; 585644a1afSlupo49 $customFlags = array(); 59f5b180ccSwikidesign 600e0effa1Swikidesign $match = substr($match, 10, -2); // strip {{threads> from start and }} from end 61e2c227dfSwikidesign list($match, $flags) = explode('&', $match, 2); 620e0effa1Swikidesign $flags = explode('&', $flags); 63912b9053Slupo49 645644a1afSlupo49 // Identify the count/skipempty flag and remove it before passing it to pagelist 65912b9053Slupo49 foreach($flags as $key => $flag) { 66912b9053Slupo49 if (substr($flag, 0, 5) == "count") { 675644a1afSlupo49 $tmp = explode('=', $flag); 685644a1afSlupo49 $customFlags['count'] = $tmp[1]; 69912b9053Slupo49 unset($flags[$key]); 70*c2a7577fSLarsGit223 } elseif (substr($flag, 0, 9) == "skipempty") { 715644a1afSlupo49 $customFlags['skipempty'] = true; 725644a1afSlupo49 unset($flags[$key]); 73*c2a7577fSLarsGit223 } elseif (substr($flag, 0, 15) == "nonewthreadform") { 74*c2a7577fSLarsGit223 $customFlags['nonewthreadform'] = true; 75*c2a7577fSLarsGit223 unset($flags[$key]); 76912b9053Slupo49 } 77912b9053Slupo49 } 78912b9053Slupo49 795644a1afSlupo49 // Ignore params if invalid values have been passed 805644a1afSlupo49 if(!array_key_exists('count', $customFlags) || $customFlags['count'] <= 0 || !is_numeric($customFlags['count'])) $customFlags['count'] = false; 815644a1afSlupo49 if(!array_key_exists('skipempty', $customFlags) && !$customFlags['skipempty']) $customFlags['skipempty'] = false; 82912b9053Slupo49 83e2c227dfSwikidesign list($ns, $refine) = explode(' ', $match, 2); 84f0fda08aSwikidesign 855fc512fbSwikidesign if (($ns == '*') || ($ns == ':')) $ns = ''; 86f0fda08aSwikidesign elseif ($ns == '.') $ns = getNS($ID); 87f5b180ccSwikidesign else $ns = cleanID($ns); 88f0fda08aSwikidesign 895644a1afSlupo49 return array($ns, $flags, $refine, $customFlags); 90f5b180ccSwikidesign } 91f5b180ccSwikidesign 92e7ac9adaSGerrit Uitslag /** 93e7ac9adaSGerrit Uitslag * Handles the actual output creation. 94e7ac9adaSGerrit Uitslag * 95e7ac9adaSGerrit Uitslag * @param $mode string output format being rendered 96e7ac9adaSGerrit Uitslag * @param $renderer Doku_Renderer the current renderer object 97e7ac9adaSGerrit Uitslag * @param $data array data created by handler() 98e7ac9adaSGerrit Uitslag * @return boolean rendered correctly? 99e7ac9adaSGerrit Uitslag */ 100e7ac9adaSGerrit Uitslag function render($mode, Doku_Renderer $renderer, $data) { 1015644a1afSlupo49 list($ns, $flags, $refine, $customFlags) = $data; 1025644a1afSlupo49 $count = $customFlags['count']; 1035644a1afSlupo49 $skipEmpty = $customFlags['skipempty']; 104*c2a7577fSLarsGit223 $noNewThreadForm = $customFlags['nonewthreadform']; 105912b9053Slupo49 $i = 0; 1060e0effa1Swikidesign 107e7ac9adaSGerrit Uitslag $pages = array(); 108e7ac9adaSGerrit Uitslag /** @var helper_plugin_discussion $my */ 109e7ac9adaSGerrit Uitslag if ($my =& plugin_load('helper', 'discussion')) $pages = $my->getThreads($ns, null, $skipEmpty); 110e2c227dfSwikidesign 111e2c227dfSwikidesign // use tag refinements? 112e2c227dfSwikidesign if ($refine) { 113e7ac9adaSGerrit Uitslag /** @var helper_plugin_tag $tag */ 114e2c227dfSwikidesign if (plugin_isdisabled('tag') || (!$tag = plugin_load('helper', 'tag'))) { 115e2c227dfSwikidesign msg('The Tag Plugin must be installed to use tag refinements.', -1); 116e2c227dfSwikidesign } else { 117e2c227dfSwikidesign $pages = $tag->tagRefine($pages, $refine); 118e2c227dfSwikidesign } 119e2c227dfSwikidesign } 120e2c227dfSwikidesign 12181cc6d2cSwikidesign if (!$pages) { 12277f39d56Swikidesign if ((auth_quickaclcheck($ns.':*') >= AUTH_CREATE) && ($mode == 'xhtml')) { 12377f39d56Swikidesign $renderer->info['cache'] = false; 124*c2a7577fSLarsGit223 if ($noNewThreadForm !== true) { 12581cc6d2cSwikidesign $renderer->doc .= $this->_newThreadForm($ns); 12677f39d56Swikidesign } 127*c2a7577fSLarsGit223 } 12881cc6d2cSwikidesign return true; // nothing to display 12981cc6d2cSwikidesign } 130f0fda08aSwikidesign 131f0fda08aSwikidesign if ($mode == 'xhtml') { 132e7ac9adaSGerrit Uitslag /** @var $renderer Doku_Renderer_xhtml */ 133f0fda08aSwikidesign // prevent caching to ensure content is always fresh 134f0fda08aSwikidesign $renderer->info['cache'] = false; 135f0fda08aSwikidesign 136cc497149Swikidesign // show form to start a new discussion thread? 137*c2a7577fSLarsGit223 if ($noNewThreadForm !== true) { 138cc497149Swikidesign $perm_create = (auth_quickaclcheck($ns.':*') >= AUTH_CREATE); 139*c2a7577fSLarsGit223 if ($perm_create && ($this->getConf('threads_formposition') == 'top')) { 140cc497149Swikidesign $renderer->doc .= $this->_newThreadForm($ns); 141*c2a7577fSLarsGit223 } 142*c2a7577fSLarsGit223 } 143cc497149Swikidesign 1445fc512fbSwikidesign // let Pagelist Plugin do the work for us 145e7ac9adaSGerrit Uitslag /** @var $pagelist helper_plugin_pagelist */ 146fa4ae107Swikidesign if (plugin_isdisabled('pagelist') 147fa4ae107Swikidesign || (!$pagelist =& plugin_load('helper', 'pagelist'))) { 1485fc512fbSwikidesign msg('The Pagelist Plugin must be installed for threads lists to work.', -1); 1495fc512fbSwikidesign return false; 1505fc512fbSwikidesign } 151fbb94835Swikidesign $pagelist->column['comments'] = true; 1520e0effa1Swikidesign $pagelist->setFlags($flags); 1535fc512fbSwikidesign $pagelist->startList(); 154e7ac9adaSGerrit Uitslag foreach ($pages as $page) { 155c5b0470aSMichael Klier $page['class'] = 'discussion_status'.$page['status']; 1565fc512fbSwikidesign $pagelist->addPage($page); 157912b9053Slupo49 158912b9053Slupo49 $i++; 159912b9053Slupo49 if($count != false && $i >= $count) break; // Only display the n discussion threads specified by the count flag 1607a292a0dSwikidesign } 1615fc512fbSwikidesign $renderer->doc .= $pagelist->finishList(); 162f0fda08aSwikidesign 163f0fda08aSwikidesign // show form to start a new discussion thread? 164*c2a7577fSLarsGit223 if ($noNewThreadForm !== true) { 165*c2a7577fSLarsGit223 if ($perm_create && ($this->getConf('threads_formposition') == 'bottom')) { 166cc497149Swikidesign $renderer->doc .= $this->_newThreadForm($ns); 167*c2a7577fSLarsGit223 } 168*c2a7577fSLarsGit223 } 169f0fda08aSwikidesign 170f0fda08aSwikidesign return true; 171f0fda08aSwikidesign 172f0fda08aSwikidesign // for metadata renderer 173f0fda08aSwikidesign } elseif ($mode == 'metadata') { 174e7ac9adaSGerrit Uitslag /** @var $renderer Doku_Renderer_metadata */ 175f0fda08aSwikidesign foreach ($pages as $page) { 1765fc512fbSwikidesign $renderer->meta['relation']['references'][$page['id']] = true; 177f0fda08aSwikidesign } 178f0fda08aSwikidesign 179f0fda08aSwikidesign return true; 180f0fda08aSwikidesign } 181f0fda08aSwikidesign return false; 182f0fda08aSwikidesign } 183f0fda08aSwikidesign 1845fc512fbSwikidesign /* ---------- (X)HTML Output Functions ---------- */ 185f0fda08aSwikidesign 186f0fda08aSwikidesign /** 187f0fda08aSwikidesign * Show the form to start a new discussion thread 188e7ac9adaSGerrit Uitslag * 189e7ac9adaSGerrit Uitslag * @param string $ns 190e7ac9adaSGerrit Uitslag * @return string 191f0fda08aSwikidesign */ 192cc497149Swikidesign function _newThreadForm($ns) { 193f0fda08aSwikidesign global $ID; 194f0fda08aSwikidesign global $lang; 195f0fda08aSwikidesign 1965fc512fbSwikidesign return '<div class="newthread_form">'.DOKU_LF. 1975fc512fbSwikidesign '<form id="discussion__newthread_form" method="post" action="'.script().'" accept-charset="'.$lang['encoding'].'">'.DOKU_LF. 1985fc512fbSwikidesign DOKU_TAB.'<fieldset>'.DOKU_LF. 19981cc6d2cSwikidesign DOKU_TAB.DOKU_TAB.'<legend> '.$this->getLang('newthread').': </legend>'.DOKU_LF. 2005fc512fbSwikidesign DOKU_TAB.DOKU_TAB.'<input type="hidden" name="id" value="'.$ID.'" />'.DOKU_LF. 2015fc512fbSwikidesign DOKU_TAB.DOKU_TAB.'<input type="hidden" name="do" value="newthread" />'.DOKU_LF. 2025fc512fbSwikidesign DOKU_TAB.DOKU_TAB.'<input type="hidden" name="ns" value="'.$ns.'" />'.DOKU_LF. 2035fc512fbSwikidesign DOKU_TAB.DOKU_TAB.'<input class="edit" type="text" name="title" id="discussion__newthread_title" size="40" tabindex="1" />'.DOKU_LF. 2045fc512fbSwikidesign DOKU_TAB.DOKU_TAB.'<input class="button" type="submit" value="'.$lang['btn_create'].'" tabindex="2" />'.DOKU_LF. 2055fc512fbSwikidesign DOKU_TAB.'</fieldset>'.DOKU_LF. 2065fc512fbSwikidesign '</form>'.DOKU_LF. 2075fc512fbSwikidesign '</div>'.DOKU_LF; 208f0fda08aSwikidesign } 209f0fda08aSwikidesign} 210530693fbSMichael Klier// vim:ts=4:sw=4:et:enc=utf-8: 211