xref: /plugin/discussion/admin.php (revision 264b73272ebcbccec9920e099b7167f8a9cb3d9b)
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 :