OSDN Git Service

git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/plugin@836 1ca29b6e-896d...
[nucleus-jp/nucleus-plugins.git] / trunk / NP_TodoList / NP_TodoList.php
1 <?php \r
2 /*\r
3         NP_TodoList\r
4         by yu (http://nucleus.datoka.jp/)\r
5 \r
6         This program is free software; you can redistribute it and/or\r
7         modify it under the terms of the GNU General Public License\r
8         as published by the Free Software Foundation; either version 2\r
9         of the License, or (at your option) any later version.\r
10         (see nucleus/documentation/index.html#license for more info)\r
11         \r
12         USAGE\r
13         -----\r
14         <%TodoList%>\r
15         <%TodoList(nodate)%> //date setting\r
16         <%TodoList(normal,1)%> //date setting, memberid\r
17         \r
18         HISTORY\r
19         -------\r
20         2008-12-02 Ver0.44: [Fix] "Add TODO" bug fix. (hilbert)\r
21                             [Chg] Improve quote_smart() function. (yu)\r
22         2008-05-19 Ver0.43: [Fix] "Delete TODO" bug fix. (yu)\r
23         2006-09-30 Ver0.42: [Fix] Security fix. (yu)\r
24         2004-09-29 Ver0.41: [Fix] Check edit authority. (yu)\r
25         2004-05-30 Ver0.4 : [New] Blog members can own each todo list. (yu)\r
26 */\r
27 \r
28 // plugin needs to work on Nucleus versions <=2.0 as well\r
29 if (!function_exists('sql_table')) {\r
30         function sql_table($name) {\r
31                 return 'nucleus_' . $name;\r
32         }\r
33 }\r
34 \r
35 class NP_TodoList extends NucleusPlugin { \r
36         function getName()      { return 'Todo List'; } \r
37         function getAuthor()    { return 'yu'; } \r
38         function getURL()       { return 'http://works.datoka.jp/index.php?itemid=231'; } \r
39         function getVersion()   { return '0.44'; } \r
40         function getMinNucleusVersion() { return 200; }\r
41         function getTableList() { return array( sql_table('plug_todolist') ); }\r
42         function getEventList() { return array(); }\r
43         function supportsFeature($what) {\r
44                 switch($what) {\r
45                         case 'SqlTablePrefix':\r
46                                 return 1;\r
47                         default:\r
48                                 return 0;\r
49                 }\r
50         }\r
51 \r
52         function getDescription() { \r
53                 return 'Show Todo List. [USAGE] <%TodoList(mode,memberid)%> ex. <%TodoList%>, <%TodoList(nodate)%>, <%TodoList(normal,1)%>';\r
54         } \r
55 \r
56 \r
57         function install(){ \r
58                 sql_query ("CREATE TABLE IF NOT EXISTS ". sql_table('plug_todolist') ." (\r
59                         tid      INT UNSIGNED NOT NULL AUTO_INCREMENT,\r
60                         title    VARCHAR(255) NOT NULL DEFAULT '',\r
61                         rank     INT UNSIGNED NOT NULL DEFAULT 0,\r
62                         cond     INT UNSIGNED NOT NULL DEFAULT 0,\r
63                         regdate  DATE NOT NULL DEFAULT '1999-01-01',\r
64                         enddate  DATE NOT NULL DEFAULT '1999-01-01',\r
65                         memberid INT UNSIGNED NOT NULL DEFAULT 1,\r
66                         primary key (tid))");\r
67                 \r
68                 if(getNucleusVersion() < 220) {\r
69                         $this->createOption('canedit','Edit authority [self | team | self+admin]', 'text', 'self');\r
70                 }\r
71                 else {\r
72                         $this->createOption('canedit','Edit authority [self | team | self+admin]', 'select', 'self', 'Self|self|Team|team|Self + Admin|self+admin');\r
73                 }\r
74                 \r
75                 $this->createOption('dateFormat','Date format', 'text', 'm/d(D)');\r
76                 $this->createOption('flg_pluglink','Show plugin link.','yesno','yes');\r
77                 $this->createOption('flg_erase', 'Erase data on uninstall.', 'yesno', 'no');\r
78         } \r
79         \r
80         function unInstall() { \r
81                 if ($this->getOption(flg_erase) == 'yes') {\r
82                         sql_query ('DROP TABLE '. sql_table('plug_todolist') );\r
83                 }\r
84         } \r
85         \r
86         \r
87         // .../action.php?action=plugin&name=TodoList&type=verup&vernum=X.X\r
88         // it need login to update\r
89         function versionUpdate($oldver) { \r
90                 switch ($oldver) {\r
91                         case 0.1:\r
92                         case 0.2:\r
93                         case 0.3:\r
94                                 sql_query ("ALTER TABLE ". sql_table('plug_todolist'). " ADD (\r
95                                         memberid INT UNSIGNED NOT NULL DEFAULT 1)");\r
96                                 break;\r
97                         case 0.4:\r
98                         default:\r
99                                 //nothing to do\r
100                                 break;\r
101                 }\r
102         } \r
103         \r
104         \r
105         function init() {\r
106                 $this->rankname  = array('*','**','***');\r
107                 $this->condname  = array('notyet','working','finished','pending');\r
108                 $this->condstyle = array('background:#fff','background:#fd6','background:#add','background:#999;color:white','background:#f00;color:white');\r
109                 \r
110                 $query = "SHOW TABLES LIKE '". sql_table('plug_todolist') ."'";\r
111                 $table = sql_query($query);\r
112                 if (mysql_num_rows($table) > 0){\r
113                         $query = "SELECT * FROM ". sql_table('plug_todolist') ." ORDER BY cond, enddate";\r
114                         $res = sql_query($query);\r
115                         while ($data = mysql_fetch_object($res)) {\r
116                                 $this->list[$data->memberid][] = $data; //set data by memberid\r
117                         }\r
118                 }\r
119         }\r
120         \r
121         function doSkinVar($skinType, $showmode='normal',$memid='') {\r
122                 global $memberid;\r
123                 \r
124                 if (!$memid) $memid = $memberid; //in member page\r
125                 if (!$memid) $memid = 1; //default\r
126                 \r
127                 $editmode = intRequestVar('todoedit'); //get or post\r
128                 $this->showTodoList($editmode, $showmode, $memid);\r
129         }\r
130         \r
131         function isLoggedIn() {\r
132                 global $member;\r
133                 return $member->isLoggedIn();\r
134         }\r
135         \r
136         function canEdit($memid) {\r
137                 global $blog, $member;\r
138                 \r
139                 if ($blog) $b =& $blog; \r
140                 else $b =& $manager->getBlog($CONF['DefaultBlog']);\r
141                 $bid = $b->getID();\r
142                 \r
143                 if (!$member->isLoggedIn()) return 0;\r
144                 \r
145                 switch ($this->getOption('canedit')) {\r
146                         case 'self':\r
147                                 return ($member->getID() == $memid);\r
148                                 break;\r
149                         case 'team':\r
150                                 return ($member->teamRights($bid));\r
151                                 break;\r
152                         case 'self+admin':\r
153                                 return ($member->getID() == $memid || $member->blogAdminRights($bid));\r
154                                 break;\r
155                         default:\r
156                                 return 0;\r
157                 }\r
158         }\r
159         \r
160         \r
161         function showEntryForm($editmode, $showmode, $memid) {\r
162                 global $CONF;\r
163                 \r
164                 if (!$editmode) return;\r
165 ?>\r
166 <form class="todolist" method="post" action="<?php echo $CONF['ActionURL'] ?>">\r
167 <input type="hidden" name="action" value="plugin"/>\r
168 <input type="hidden" name="name" value="TodoList" />\r
169 <input type="hidden" name="type" value="add" />\r
170 <input type="hidden" name="memid" value="<?php echo $memid ?>" />\r
171 <select name="rank">\r
172 <?php\r
173                 for($i = count($this->rankname)-1; $i>=0; $i--){\r
174                         echo "<option value='$i'>{$this->rankname[$i]}</option>\n";\r
175                 }\r
176 ?>\r
177 </select>\r
178 <select name="cond">\r
179 <?php\r
180                         $i = 0;\r
181                         foreach($this->condname as $cname){\r
182                                 echo "<option value='$i'>$cname</option>\n";\r
183                                 $i++;\r
184                         }\r
185 ?>\r
186 </select>\r
187 <?php\r
188                 if ($showmode != 'nodate') {\r
189 ?>\r
190 <input class="formfield"  type="text" name="enddate" value="<?php echo date('Y-m-d', mktime(0,0,0,date('m'),date('d')+1,date('Y'))) ?>" size="9" maxlength="10" />\r
191 <?php\r
192                 }\r
193 ?>\r
194 <input class="formfield"  type="text" name="title" value="" size="20" maxlength="255" />\r
195 <input class="formbutton" type="submit" value="Submit" />\r
196 </form>\r
197 <?php\r
198         }\r
199         \r
200         \r
201         function showTodoList($editmode, $showmode, $memid) {\r
202                 global $CONF, $member;\r
203                 \r
204                 $img_path = $this->getAdminURL();\r
205                 \r
206                 $this->showEntryForm($editmode, $showmode, $memid);\r
207                 \r
208                 if (empty($this->list[$memid])) {\r
209                         echo "<p>No data found.</p>";\r
210                 }\r
211                 else {\r
212                         //sort by rank\r
213                         foreach($this->list[$memid] as $l) {\r
214                                 //if ($l->memberid != $memid) continue; // id check\r
215                                 $byrank[ $l->rank ][] = $l;\r
216                         }\r
217                         $sortlist = array();\r
218                         for($i=count($this->rankname); $i>0; $i--) {\r
219                                 $sortlist = array_merge($sortlist, (array)$byrank[$i-1]);\r
220                         }\r
221                         \r
222                         echo "<ul class='todolist'>\n";\r
223                         \r
224                         foreach($sortlist as $l) {\r
225                                 $tid = $l->tid;\r
226                                 $title = htmlspecialchars($l->title, ENT_QUOTES);\r
227                                 $enddate = $l->enddate;\r
228                                 $rank = $this->rankname[$l->rank];\r
229                                 $cond = $this->condname[$l->cond];\r
230                                 \r
231                                 if ($editmode) {\r
232 ?>\r
233 <form class="todolist" method="post" action="<?php echo $CONF['ActionURL'] ?>">\r
234 <input type="hidden" name="action" value="plugin"/>\r
235 <input type="hidden" name="name" value="TodoList" />\r
236 <input type="hidden" name="type" value="update" />\r
237 <input type="hidden" name="tid"  value="<?php echo $tid ?>" />\r
238 <select name="rank">\r
239 <?php\r
240                                         for($i = count($this->rankname)-1; $i>=0; $i--){\r
241                                                 $selected = '';\r
242                                                 if ($i == $l->rank) $selected = 'selected';\r
243                                                 echo "<option value='$i' $selected>{$this->rankname[$i]}</option>\n";\r
244                                         }\r
245 ?>\r
246 </select>\r
247 <?php\r
248                                 }\r
249                                 else {\r
250                                         echo "<li>";\r
251                                         $img_file = 'rank'.$l->rank.'.gif';\r
252                                         $img_title = $this->rankname[$l->rank];\r
253                                 echo "<img class='icon-mid' src='$img_path$img_file' width='14' height='14' alt='$img_title' title='$img_title' />";\r
254                                 }\r
255                                 \r
256                                 if ($editmode) {\r
257 ?>\r
258 <select name="cond">\r
259 <?php\r
260                                         $cstyle = $this->condstyle;\r
261                                         $i = 0;\r
262                                         foreach($this->condname as $cname){\r
263                                                 $selected = '';\r
264                                                 if ($i == $l->cond) $selected = 'selected';\r
265                                                 echo "<option style='$cstyle[$i]' value='$i' $selected>$cname</option>\n";\r
266                                                 $i++;\r
267                                         }\r
268                                         echo "<option style='$cstyle[$i]' value='$i'>[delete]</option>\n";\r
269 ?>\r
270 </select>\r
271 <?php\r
272                                 }\r
273                                 else {\r
274                                         $img_file = 'cond'.$l->cond.'.gif';\r
275                                         $img_title = $this->condname[$l->cond];\r
276                                 echo " <img class='icon-mid' src='$img_path$img_file' width='52' height='14' alt='$img_title' title='$img_title' />";\r
277                                 }\r
278                                 \r
279                                 if ($editmode and $showmode != 'nodate') {\r
280 ?>\r
281 <input class="formfield"  type="text" name="enddate" value="<?php echo $enddate ?>" size="9" maxlength="10" />\r
282 <?php\r
283                                 }\r
284                                 else if($showmode != 'nodate') {\r
285                                         $date_style = 'enddate';\r
286                                         if ( $enddate == date('Y-m-d', mktime( 0,0,0,date('m'),date('d')+1,date('Y'))) ) {\r
287                                                 $date_style = 'enddate2'; //tomorrow\r
288                                         }\r
289                                         else if ($enddate == date('Y-m-d')) {\r
290                                                 $date_style = 'enddate3'; //today\r
291                                         }\r
292                                         else if ($enddate < date('Y-m-d')) {\r
293                                                 $date_style = 'enddate4'; //past\r
294                                         }\r
295                                         \r
296                                         //apply date format\r
297                                         $enddate = date($this->getOption('dateFormat'), strToTime($enddate));\r
298                                         echo " <span class='$date_style'>$enddate</span>";\r
299                                 }\r
300                                 \r
301                                 if ($editmode) {\r
302 ?>\r
303 <input class="formfield"  type="text" name="title" value="<?php echo $title ?>" size="20" maxlength="255" />\r
304 <?php\r
305                                 }\r
306                                 else {\r
307                                         echo " <span class='title'>$title</span></li>\n";\r
308                                 }\r
309                                 \r
310                                 if ($editmode) {\r
311                                         if ($this->getOption('canedit') == 'team' \r
312                                                 and $member->getID() != $memid) $disstr = 'disabled';\r
313                                         else $disstr = '';\r
314 ?>\r
315 <input class="formbutton" type='submit' value='Update' <?php echo $disstr?> />\r
316 </form>\r
317 <?php\r
318                                 }\r
319                         } //end of foreach($sortlist)\r
320                         \r
321                         echo "</ul>\n";\r
322                         \r
323                 }// end of if(isset($this->list))\r
324                 \r
325                 //edit switch\r
326                 if ($this->canEdit($memid)) {\r
327                         if ($editmode) $str_edit = "checked";\r
328                         else $str_show = "checked"; \r
329 ?>\r
330 <form class="todolist-r" method="post" action="<?php echo $CONF['ActionURL'] ?>">\r
331 <input type="hidden" name="action" value="plugin"/>\r
332 <input type="hidden" name="name" value="TodoList" />\r
333 <input type="hidden" name="type" value="mode" />\r
334 <input type="radio"  name="todoedit" value="0" <?php echo $str_show ?> />Show\r
335 <input type="radio"  name="todoedit" value="1" <?php echo $str_edit ?> />Edit\r
336 <input class="formbutton" type='submit' value='Change' />\r
337 </form>\r
338 <?php\r
339                 }\r
340                 \r
341                 //plugin link\r
342                 if ($this->getOption('flg_pluglink') == 'yes') {\r
343                         $pluglink_url = $this->getURL();\r
344                         \r
345                         echo "<a href='$pluglink_url' title='Jump to the site of this plugin'>";\r
346                         echo "<span style='font-size:9px'>&raquo; Get \"".$this->getName()."\"</span></a>";\r
347                 }\r
348                 \r
349         } //end of function\r
350         \r
351         \r
352         function doAction($type) {\r
353                 global $CONF, $manager, $blog;\r
354                 \r
355                 if (! $this->isLoggedIn()) return;\r
356                 \r
357                 if ($blog) $b = &$blog;\r
358                 else $b = &$manager->getBlog($CONF['DefaultBlog']);\r
359                 \r
360                 switch($type) {\r
361                         case 'mode':\r
362                                 $editmode = intRequestVar('todoedit'); //get or post\r
363                                 $return = serverVar('HTTP_REFERER');\r
364                                 $return = preg_replace('/[?&]todoedit=[^&]*/', '', $return); //delete old parameter\r
365                                 if ( preg_match('/\?/',$return) ) $rvalue = "&todoedit=".$editmode;\r
366                                 else $rvalue = "?todoedit=".$editmode;\r
367                                 header("Location: $return$rvalue");\r
368                                 return;\r
369                                 break;\r
370                         case 'add':\r
371                                 $query = sprintf("INSERT INTO %s SET title=%s, rank=%d, cond=%d, regdate=%s, enddate=%s, memberid=%s",\r
372                                         sql_table('plug_todolist'),\r
373                                         $this->quote_smart(postVar('title')),\r
374                                         $this->quote_smart(intPostVar('rank')),\r
375                                         $this->quote_smart(intPostVar('cond')),\r
376                                         date("'Y-m-d'", $b->getCorrectTime()),\r
377                                         $this->quote_smart(postVar('enddate')),\r
378                                         $this->quote_smart(intPostVar('memid')) );\r
379                                 sql_query($query);\r
380                                 break;\r
381                         case 'update':\r
382                                 if (intPostVar('cond') >= count($this->condname)) { //cond = del\r
383                                         $query = sprintf("DELETE FROM %s WHERE tid=%d",\r
384                                                 sql_table('plug_todolist'),\r
385                                                 $this->quote_smart(intPostVar('tid')) );\r
386                                 }\r
387                                 else {\r
388                                         $query = sprintf("UPDATE %s SET title=%s, rank=%d, cond=%d, enddate=%s WHERE tid=%d",\r
389                                                 sql_table('plug_todolist'),\r
390                                                 $this->quote_smart(postVar('title')),\r
391                                                 $this->quote_smart(intPostVar('rank')),\r
392                                                 $this->quote_smart(intPostVar('cond')),\r
393                                                 $this->quote_smart(postVar('enddate')),\r
394                                                 $this->quote_smart(intPostVar('tid')) );\r
395                                 }\r
396                                 sql_query($query);\r
397                                 break;\r
398                         case 'verup':\r
399                                 $vernum   = intRequestVar('vernum');\r
400                                 $this->versionUpdate($vernum);\r
401                                 break;\r
402                         default:\r
403                                 break;\r
404                 }\r
405                 Header('Location: ' . serverVar('HTTP_REFERER') );\r
406         }\r
407         \r
408         // quote variable to make safe\r
409         function quote_smart($value) {\r
410                 if (get_magic_quotes_gpc()) $value = stripslashes($value);\r
411                 if (!is_numeric($value)) {\r
412                         $value = "'". mysql_real_escape_string($value) ."'";\r
413                 }\r
414                 else {\r
415                         $value = (int)$value;\r
416                 }\r
417                 return $value;\r
418         }\r
419 \r
420\r
421 ?>