1a768ba62Swikidesign<?php 2*264b7327Swikidesign/** 3*264b7327Swikidesign * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 4*264b7327Swikidesign * @author Esther Brunner <wikidesign@gmail.com> 5*264b7327Swikidesign */ 6*264b7327Swikidesign 7*264b7327Swikidesign// must be run within Dokuwiki 8*264b7327Swikidesignif (!defined('DOKU_INC')) die(); 9*264b7327Swikidesign 10a768ba62Swikidesignif (!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 11a768ba62Swikidesignif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 12*264b7327Swikidesignif (!defined('DOKU_LF')) define('DOKU_LF', "\n"); 13*264b7327Swikidesignif (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); 14*264b7327Swikidesign 15a768ba62Swikidesignrequire_once(DOKU_PLUGIN.'admin.php'); 16a768ba62Swikidesign 17a768ba62Swikidesignclass admin_plugin_discussion extends DokuWiki_Admin_Plugin { 18a768ba62Swikidesign 19a768ba62Swikidesign function getInfo(){ 20a768ba62Swikidesign return array( 21*264b7327Swikidesign 'author' => 'Esther Brunner', 22*264b7327Swikidesign 'email' => 'wikidesign@gmail.com', 23*264b7327Swikidesign 'date' => '2007-02-22', 24*264b7327Swikidesign 'name' => 'Discussion Plugin (admin component)', 25*264b7327Swikidesign 'desc' => 'Manage all discussions', 26*264b7327Swikidesign 'url' => 'http://www.wikidesign.ch/en/plugin/discussion/start', 27a768ba62Swikidesign ); 28a768ba62Swikidesign } 29a768ba62Swikidesign 30*264b7327Swikidesign function getMenuSort(){ return 200; } 31*264b7327Swikidesign function handle(){} 32*264b7327Swikidesign function forAdminOnly(){ return false; } 33a768ba62Swikidesign 34a768ba62Swikidesign /** 35a768ba62Swikidesign * output appropriate html 36a768ba62Swikidesign */ 37a768ba62Swikidesign function html(){ 38*264b7327Swikidesign global $conf; 39*264b7327Swikidesign 40*264b7327Swikidesign echo '<h1>'.$this->getLang('menu').'</h1>'; 41*264b7327Swikidesign 42*264b7327Swikidesign $my =& plugin_load('helper', 'discussion'); 43*264b7327Swikidesign 44*264b7327Swikidesign $threads = $my->getThreads('', $conf['recent'], true); 45*264b7327Swikidesign foreach ($threads as $thread){ 46*264b7327Swikidesign echo $this->_threadHead($thread); 47*264b7327Swikidesign if (($thread['status'] == 0) || ($thread['num'] == 0)){ 48*264b7327Swikidesign echo '</div>'; 49*264b7327Swikidesign continue; 50*264b7327Swikidesign } 51*264b7327Swikidesign $comments = $my->getFullComments($thread); 52*264b7327Swikidesign 53*264b7327Swikidesign echo '<form action="'.script().'">'. 54*264b7327Swikidesign '<div class="no">'. 55*264b7327Swikidesign '<input type="hidden" name="id" value="'.$thread['id'].'" />'. 56*264b7327Swikidesign '<input type="hidden" name="do" value="admin" />'. 57*264b7327Swikidesign '<input type="hidden" name="page" value="discussion" />'; 58*264b7327Swikidesign echo html_buildlist($comments, 'admin_discussion', array($this, '_commentItem'), array($this, '_li_comment')); 59*264b7327Swikidesign echo $this->_actionButtons($thread['id']); 60*264b7327Swikidesign } 61*264b7327Swikidesign } 62*264b7327Swikidesign 63*264b7327Swikidesign /** 64*264b7327Swikidesign * Header, page ID and status of a discussion thread 65*264b7327Swikidesign */ 66*264b7327Swikidesign function _threadHead($thread){ 67*264b7327Swikidesign $label = array( 68*264b7327Swikidesign $this->getLang('off'), 69*264b7327Swikidesign $this->getLang('open'), 70*264b7327Swikidesign $this->getLang('closed') 71*264b7327Swikidesign ); 72*264b7327Swikidesign $status = $label[$thread['status']]; 73*264b7327Swikidesign return '<h2>'.hsc($thread['title']).'</h2>'. 74*264b7327Swikidesign '<div class="rightalign">'.$this->getLang('status').': '.$status. 75*264b7327Swikidesign ' '.$this->getLang('btn_change').'</div>'. 76*264b7327Swikidesign '<div class="level2">'. 77*264b7327Swikidesign '<a href="'.wl($thread['id']).'" class="wikilinik1">'.$thread['id'].'</a> '; 78*264b7327Swikidesign } 79*264b7327Swikidesign 80*264b7327Swikidesign /** 81*264b7327Swikidesign * Checkbox and info about a comment item 82*264b7327Swikidesign */ 83*264b7327Swikidesign function _commentItem($comment){ 84*264b7327Swikidesign global $conf; 85*264b7327Swikidesign 86*264b7327Swikidesign // prepare variables 87*264b7327Swikidesign if (is_array($comment['user'])){ // new format 88*264b7327Swikidesign $name = $comment['user']['name']; 89*264b7327Swikidesign $mail = $comment['user']['mail']; 90*264b7327Swikidesign } else { // old format 91*264b7327Swikidesign $name = $comment['name']; 92*264b7327Swikidesign $mail = $comment['mail']; 93*264b7327Swikidesign } 94*264b7327Swikidesign if (is_array($comment['date'])){ // new format 95*264b7327Swikidesign $created = $comment['date']['created']; 96*264b7327Swikidesign } else { // old format 97*264b7327Swikidesign $created = $comment['date']; 98*264b7327Swikidesign } 99*264b7327Swikidesign $abstract = strip_tags($comment['xhtml']); 100*264b7327Swikidesign if (utf8_strlen($abstract) > 160) $abstract = utf8_substr($abstract, 0, 160).'...'; 101*264b7327Swikidesign 102*264b7327Swikidesign return '<input type="checkbox" name="cid['.$comment['id'].']" value="'.$comment['id'].'" /> '.$this->email($mail, $name, 'email').', '. 103*264b7327Swikidesign date($conf['dformat'], $created).': <span class="abstract">'.$abstract.'</span>'; 104*264b7327Swikidesign } 105*264b7327Swikidesign 106*264b7327Swikidesign /** 107*264b7327Swikidesign * list item tag 108*264b7327Swikidesign */ 109*264b7327Swikidesign function _li_comment($comment){ 110*264b7327Swikidesign $show = ($comment['show'] ? '' : ' hidden'); 111*264b7327Swikidesign return '<li class="level'.$comment['level'].$show.'">'; 112*264b7327Swikidesign } 113*264b7327Swikidesign 114*264b7327Swikidesign /** 115*264b7327Swikidesign * Show buttons to bulk remove, hide or show comments 116*264b7327Swikidesign */ 117*264b7327Swikidesign function _actionButtons($id){ 118*264b7327Swikidesign global $lang; 119*264b7327Swikidesign 120*264b7327Swikidesign return '<div class="comment_buttons">'. 121*264b7327Swikidesign '<input type="submit" name="comment" value="'.$this->getLang('btn_show').'" class="button" title="'.$this->getLang('btn_show').'" />'. 122*264b7327Swikidesign '<input type="submit" name="comment" value="'.$this->getLang('btn_hide').'" class="button" title="'.$this->getLang('btn_hide').'" />'. 123*264b7327Swikidesign '<input type="submit" name="comment" value="'.$lang['btn_delete'].'" class="button" title="'.$lang['btn_delete'].'" />'. 124*264b7327Swikidesign '</div>'. 125*264b7327Swikidesign '</div>'. 126*264b7327Swikidesign '</form>'. 127*264b7327Swikidesign '</div>'; // class="level2" 128*264b7327Swikidesign } 129*264b7327Swikidesign 130*264b7327Swikidesign /** 131*264b7327Swikidesign * function by iDo 132*264b7327Swikidesign */ 133*264b7327Swikidesign function _html() { 134434f5172SiLoveiDo require_once(DOKU_PLUGIN.'action.php'); 135434f5172SiLoveiDo $actionDiscussion= new action_plugin_discussion(); 136434f5172SiLoveiDo 137a768ba62Swikidesign global $conf; 138434f5172SiLoveiDo global $INFO; 139434f5172SiLoveiDo global $ID; 140434f5172SiLoveiDo global $ADMDISCUSSION; 141434f5172SiLoveiDo 1425ef1705fSiLoveiDo $oID=$ID; 1435ef1705fSiLoveiDo $ADMDISCUSSION['page']="adm"; 1445ef1705fSiLoveiDo //Execute action for page 1455ef1705fSiLoveiDo if (isset($_REQUEST['comment'])) { 1465ef1705fSiLoveiDo if ($_REQUEST['comment']!='edit') { 1475ef1705fSiLoveiDo 1485ef1705fSiLoveiDo if (($_REQUEST['comment']=='add') && (isset($_REQUEST['cid']))) { 1495ef1705fSiLoveiDo 1505ef1705fSiLoveiDo } else { 1515ef1705fSiLoveiDo $obj=new unusedclass(); 1525ef1705fSiLoveiDo $actionDiscussion->comments($obj, null); 1535ef1705fSiLoveiDo } 1545ef1705fSiLoveiDo } 1555ef1705fSiLoveiDo } 1565ef1705fSiLoveiDo 157a768ba62Swikidesign $chem=DOKU_INC.$conf['savedir']."/meta/"; 158a768ba62Swikidesign $arr=$this->globr($chem,"*.comments"); 159a768ba62Swikidesign $com =array(); 160a768ba62Swikidesign foreach ($arr as $v) { 161a768ba62Swikidesign $ap=unserialize(io_readFile($v, false)); 162a768ba62Swikidesign if (isset($ap['comments'])){ 163434f5172SiLoveiDo $ID=substr(str_replace(array($chem,".comments",'/'),array("","",':'),$v),1); 164434f5172SiLoveiDo $ADMDISCUSSION['page']=' : <a href="'.wl($ID,'').'">'.str_replace("/doku.php/","",wl($ID,'')).'</a>'; 165a768ba62Swikidesign 1665ef1705fSiLoveiDo if ((isset($_REQUEST['comment'])) && ($_REQUEST['comment']=='edit')) 1675ef1705fSiLoveiDo $actionDiscussion->_show(NULL, $_REQUEST['cid']); 1685ef1705fSiLoveiDo else 1695ef1705fSiLoveiDo $actionDiscussion->_show((($oID==$ID)?@$_REQUEST['cid']:null)); 1705ef1705fSiLoveiDo 1715ef1705fSiLoveiDo } 1725ef1705fSiLoveiDo } 1735ef1705fSiLoveiDo $ID = $oID; 1745ef1705fSiLoveiDo $ADMDISCUSSION['breakaction']=true; 175a768ba62Swikidesign } 176a768ba62Swikidesign 177a768ba62Swikidesign /** 178a768ba62Swikidesign * Recursive version of glob 179a768ba62Swikidesign * 180a768ba62Swikidesign * @return array containing all pattern-matched files. 181a768ba62Swikidesign * 182a768ba62Swikidesign * @param string $sDir Directory to start with. 183a768ba62Swikidesign * @param string $sPattern Pattern to glob for. 184a768ba62Swikidesign * @param int $nFlags Flags sent to glob. 185a768ba62Swikidesign */ 186a768ba62Swikidesign function globr($sDir, $sPattern, $nFlags = NULL) { 187a768ba62Swikidesign $sDir = escapeshellcmd($sDir); 188a768ba62Swikidesign // Get the list of all matching files currently in the 189a768ba62Swikidesign // directory. 190a768ba62Swikidesign $aFiles = glob("$sDir/$sPattern", $nFlags); 191a768ba62Swikidesign // Then get a list of all directories in this directory, and 192a768ba62Swikidesign // run ourselves on the resulting array. This is the 193a768ba62Swikidesign // recursion step, which will not execute if there are no 194a768ba62Swikidesign // directories. 195a768ba62Swikidesign foreach (glob("$sDir/*", GLOB_ONLYDIR) as $sSubDir) { 196a768ba62Swikidesign $aSubFiles = $this->globr($sSubDir, $sPattern, $nFlags); 197a768ba62Swikidesign $aFiles = array_merge($aFiles, $aSubFiles); 198a768ba62Swikidesign } 199a768ba62Swikidesign // The array we return contains the files we found, and the 200a768ba62Swikidesign // files all of our children found. 201a768ba62Swikidesign return $aFiles; 202a768ba62Swikidesign } 203a768ba62Swikidesign 2045ef1705fSiLoveiDo} 205*264b7327Swikidesign 206*264b7327Swikidesign//Setup VIM: ex: et ts=4 enc=utf-8 :