OSDN Git Service

MERGE: リビジョン1721をマージ。主要なクラス名をUpperCamelCaseに統一。
[nucleus-jp/nucleus-next.git] / nucleus / libs / SKIN.php
1 <?php\r
2 /*\r
3  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
4  * Copyright (C) 2002-2009 The Nucleus Group\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 /**\r
13  * Class representing a skin\r
14  *\r
15  * @license http://nucleuscms.org/license.txt GNU General Public License\r
16  * @copyright Copyright (C) 2002-2009 The Nucleus Group\r
17  * @version $Id: SKIN.php 1621 2012-01-09 02:49:37Z sakamocchi $\r
18  */\r
19 \r
20 if ( !function_exists('requestVar') ) \r
21 {\r
22         exit;\r
23 }\r
24 require_once dirname(__FILE__) . '/ACTIONS.php';\r
25 \r
26 class Skin\r
27 {\r
28         // after creating a SKIN object, evaluates to true when the skin exists\r
29         var $isValid;\r
30         \r
31         // skin characteristics. Use the getXXX methods rather than accessing directly\r
32         var $id;\r
33         var $description;\r
34         var $contentType;\r
35         var $includeMode;               // either 'normal' or 'skindir'\r
36         var $includePrefix;\r
37         var $name;\r
38         \r
39         /**\r
40          * Constructor for a new SKIN object\r
41          * \r
42          * @param $id \r
43          *                      id of the skin\r
44          */\r
45         function SKIN($id)\r
46         {\r
47                 $this->id = intval($id);\r
48                 \r
49                 // read skin name/description/content type\r
50                 $res = sql_query('SELECT * FROM '.sql_table('skin_desc').' WHERE sdnumber=' . $this->id);\r
51                 $obj = sql_fetch_object($res);\r
52                 $this->isValid = (sql_num_rows($res) > 0);\r
53                 if ( !$this->isValid )\r
54                 {\r
55                         return;\r
56                 }\r
57                 \r
58                 $this->name = $obj->sdname;\r
59                 $this->description = $obj->sddesc;\r
60                 $this->contentType = $obj->sdtype;\r
61                 $this->includeMode = $obj->sdincmode;\r
62                 $this->includePrefix = $obj->sdincpref;\r
63 \r
64         }\r
65         \r
66         /**\r
67          * Get SKIN id\r
68          */\r
69         function getID()\r
70         {\r
71                 return $this->id;\r
72         }\r
73         \r
74         /**\r
75          * Get SKIN name\r
76          */\r
77         function getName()\r
78         {\r
79                 return $this->name;\r
80         }\r
81         \r
82         /**\r
83          * Get SKIN description\r
84          */\r
85         function getDescription()\r
86         {\r
87                 return $this->description;\r
88         }\r
89         \r
90         /**\r
91          * Get SKIN content type\r
92          * \r
93          * e.g. text/xml, text/html, application/atom+xml\r
94          */\r
95         function getContentType()\r
96         {\r
97                 return $this->contentType;\r
98         }\r
99         \r
100         /**\r
101          * Get include mode of the SKIN\r
102          * \r
103          * Returns either 'normal' or 'skindir':\r
104          * 'normal': if a all data of the skin can be found in the databse\r
105          * 'skindir': if the skin has data in the it's skin driectory\r
106          */\r
107         function getIncludeMode()\r
108         {\r
109                 return $this->includeMode;\r
110         }\r
111         \r
112         /**\r
113          * Get include prefix of the SKIN\r
114          * \r
115          * Get name of the subdirectory (with trailing slash) where\r
116          * the files of the current skin can be found (e.g. 'default/')\r
117          */\r
118         function getIncludePrefix()\r
119         {\r
120                 return $this->includePrefix;\r
121         }\r
122         \r
123         /**\r
124          * Checks if a skin with a given shortname exists\r
125          * @param string $name Skin short name\r
126          * @return int number of skins with the given ID\r
127          * @static\r
128          */\r
129         function exists($name)\r
130         {\r
131                 return quickQuery('select count(*) as result FROM ' . sql_table('skin_desc') . ' WHERE sdname="' . sql_real_escape_string($name) . '"') > 0;\r
132         }\r
133         \r
134         /**\r
135          * Checks if a skin with a given ID exists\r
136          * @param string $id Skin ID\r
137          * @return int number of skins with the given ID\r
138          * @static\r
139          */\r
140         function existsID($id)\r
141         {\r
142                 return quickQuery('select COUNT(*) as result FROM ' . sql_table('skin_desc') . ' WHERE sdnumber=' . intval($id)) > 0;\r
143         }\r
144         \r
145         /**\r
146          * Returns a skin given its shortname\r
147          * @param string $name Skin shortname\r
148          * @return object SKIN\r
149          * @static\r
150          */\r
151         function createFromName($name)\r
152         {\r
153                 return new SKIN(SKIN::getIdFromName($name));\r
154         }\r
155         \r
156         /**\r
157          * Returns a skin ID given its shortname\r
158          * @param string $name Skin shortname\r
159          * @return int Skin ID\r
160          * @static\r
161          */\r
162         function getIdFromName($name)\r
163         {\r
164                 $query =  'SELECT sdnumber'\r
165                                 . ' FROM ' . sql_table('skin_desc')\r
166                                 . ' WHERE sdname="' . sql_real_escape_string($name) . '"';\r
167                 $res = sql_query($query);\r
168                 $obj = sql_fetch_object($res);\r
169                 return $obj->sdnumber;\r
170         }\r
171         \r
172         /**\r
173          * Returns a skin shortname given its ID\r
174          * @param string $name\r
175          * @return string Skin short name\r
176          * @static\r
177          */\r
178         function getNameFromId($id)\r
179         {\r
180                 return quickQuery('SELECT sdname as result FROM ' . sql_table('skin_desc') . ' WHERE sdnumber=' . intval($id));\r
181         }\r
182         \r
183         /**\r
184          * SKIN::createNew()\r
185          * Creates a new skin, with the given characteristics.\r
186          *\r
187          * @static\r
188          * @param       String  $name   value for nucleus_skin.sdname\r
189          * @param       String  $desc   value for nucleus_skin.sddesc\r
190          * @param       String  $type   value for nucleus_skin.sdtype\r
191          * @param       String  $includeMode    value for nucleus_skin.sdinclude\r
192          * @param       String  $includePrefix  value for nucleus_skin.sdincpref\r
193          * @return      Integer ID for just inserted record\r
194          * \r
195          */\r
196         function createNew($name, $desc, $type = 'text/html', $includeMode = 'normal', $includePrefix = '')\r
197         {\r
198                 global $manager;\r
199                 \r
200                 $manager->notify(\r
201                         'PreAddSkin',\r
202                         array(\r
203                                 'name' => &$name,\r
204                                 'description' => &$desc,\r
205                                 'type' => &$type,\r
206                                 'includeMode' => &$includeMode,\r
207                                 'includePrefix' => &$includePrefix\r
208                         )\r
209                 );\r
210                 \r
211                 $query = "INSERT INTO %s (sdname, sddesc, sdtype, sdincmode, sdincpref) VALUES ('%s', '%s', '%s', '%s', '%s')";\r
212                 $query = sprintf($query, sql_table('skin_desc'), sql_real_escape_string($name), sql_real_escape_string($desc), sql_real_escape_string($type), sql_real_escape_string($includeMode), sql_real_escape_string($includePrefix));\r
213                 sql_query($query);\r
214                 $newid = sql_insert_id();\r
215                 \r
216                 $manager->notify(\r
217                         'PostAddSkin',\r
218                         array(\r
219                                 'skinid' => $newid,\r
220                                 'name' => $name,\r
221                                 'description' => $desc,\r
222                                 'type' => $type,\r
223                                 'includeMode' => $includeMode,\r
224                                 'includePrefix' => $includePrefix\r
225                         )\r
226                 );\r
227                 return $newid;\r
228         }\r
229         \r
230         /**\r
231          * Parse a SKIN\r
232          * \r
233          * @param string $type\r
234          */\r
235         function parse($type)\r
236         {\r
237                 global $manager, $CONF;\r
238                 \r
239                 $manager->notify('InitSkinParse',array('skin' => &$this, 'type' => $type));\r
240                 \r
241                 // set output type\r
242                 sendContentType($this->getContentType(), 'skin');\r
243                 \r
244                 // set skin name as global var (so plugins can access it)\r
245                 global $currentSkinName;\r
246                 $currentSkinName = $this->getName();\r
247                 \r
248                 $contents = $this->getContent($type);\r
249                 \r
250                 if ( !$contents )\r
251                 {\r
252                         // use base skin if this skin does not have contents\r
253                         $defskin = new SKIN($CONF['BaseSkin']);\r
254                         $contents = $defskin->getContent($type);\r
255                         if ( !$contents )\r
256                         {\r
257                                 echo _ERROR_SKIN;\r
258                                 return;\r
259                         }\r
260                 }\r
261                 \r
262                 $actions = $this->getAllowedActionsForType($type);\r
263                 \r
264                 $manager->notify('PreSkinParse',array('skin' => &$this, 'type' => $type, 'contents' => &$contents));\r
265                 \r
266                 // set IncludeMode properties of parser\r
267                 Parser::setProperty('IncludeMode',$this->getIncludeMode());\r
268                 Parser::setProperty('IncludePrefix',$this->getIncludePrefix());\r
269                 \r
270                 $handler = new Actions($type, $this);\r
271                 $parser = new Parser($actions, $handler);\r
272                 $handler->setParser($parser);\r
273                 $handler->setSkin($this);\r
274                 $parser->parse($contents);\r
275                 \r
276                 $manager->notify('PostSkinParse',array('skin' => &$this, 'type' => $type));\r
277         }\r
278         \r
279         /**\r
280          * Get content of the skin part from the database\r
281          * \r
282          * @param $type type of the skin (e.g. index, item, search ...)\r
283          */\r
284         function getContent($type)\r
285         {\r
286                 $query = 'SELECT scontent FROM '. sql_table('skin') . " WHERE sdesc=$this->id and stype='" . sql_real_escape_string($type) . "'";\r
287                 $res = sql_query($query);\r
288                 \r
289                 if ( sql_num_rows($res) == 0 )\r
290                 {\r
291                         return '';\r
292                 }\r
293                 else\r
294                 {\r
295                         return sql_result($res, 0, 0);\r
296                 }\r
297         }\r
298 \r
299         /**\r
300          * SKIN::update()\r
301          * Updates the contents for one part of the skin in the database\r
302          * \r
303          * @param $type type of the skin part (e.g. index, item, search ...) \r
304          * @param $content new content for this skin part\r
305          * @return      Void\r
306          * \r
307          */\r
308         function update($type, $content)\r
309         {\r
310                 global $manager;\r
311                 \r
312                 $skinid = $this->id;\r
313                 \r
314                 $query = "SELECT sdesc FROM %s WHERE stype='%s' and sdesc=%d";\r
315                 $query = sprintf($query, sql_table('skin'), sql_real_escape_string($type), (integer) $skinid);\r
316                 $res = sql_query($query);\r
317                 \r
318                 $skintypeexists = sql_fetch_object($res);\r
319                 $skintypevalue = ($content == true);\r
320                 \r
321                 if( $skintypevalue && $skintypeexists )\r
322                 {\r
323                         // PreUpdateSkinPart event\r
324                         $manager->notify(\r
325                                 'PreUpdateSkinPart',\r
326                                 array(\r
327                                         'skinid' => $skinid,\r
328                                         'type' => $type,\r
329                                         'content' => &$content\r
330                                 )\r
331                         );\r
332                 }\r
333                 else if( $skintypevalue && (!$skintypeexists) )\r
334                 {\r
335                         // PreAddSkinPart event\r
336                         $manager->notify(\r
337                                 'PreAddSkinPart',\r
338                                 array(\r
339                                         'skinid' => $skinid,\r
340                                         'type' => $type,\r
341                                         'content' => &$content\r
342                                 )\r
343                         );\r
344                 }\r
345                 else if( (!$skintypevalue) && $skintypeexists )\r
346                 {\r
347                         // PreDeleteSkinPart event\r
348                         $manager->notify(\r
349                                 'PreDeleteSkinPart',\r
350                                 array(\r
351                                         'skinid' => $skinid,\r
352                                         'type' => $type\r
353                                 )\r
354                         );\r
355                 }\r
356                 \r
357                 // delete old thingie\r
358                 $query = "DELETE FROM %s WHERE stype='%s' and sdesc=%d";\r
359                 $query = sprintf($query, sql_table('skin'), sql_real_escape_string($type), (integer) $skinid);\r
360                 sql_query($query);\r
361                 \r
362                 // write new thingie\r
363                 if ( $content )\r
364                 {\r
365                         $query = "INSERT INTO %s (scontent, stype, sdesc) VALUE ('%s', '%s', %d)";\r
366                         $query = sprintf($query, sql_table('skin'), sql_real_escape_string($content), sql_real_escape_string($type), (integer) $skinid);\r
367                         sql_query($query);\r
368                 }\r
369                 \r
370                 if( $skintypevalue && $skintypeexists )\r
371                 {\r
372                         // PostUpdateSkinPart event\r
373                         $manager->notify(\r
374                         'PostUpdateSkinPart',\r
375                                 array(\r
376                                         'skinid' => $skinid,\r
377                                         'type' => $type,\r
378                                         'content' => &$content\r
379                                 )\r
380                         );\r
381                 }\r
382                 else if( $skintypevalue && (!$skintypeexists) )\r
383                 {\r
384                         // PostAddSkinPart event\r
385                         $manager->notify(\r
386                                 'PostAddSkinPart',\r
387                                 array(\r
388                                         'skinid' => $skinid,\r
389                                         'type' => $type,\r
390                                         'content' => &$content\r
391                                 )\r
392                         );\r
393                 }\r
394                 else if( (!$skintypevalue) && $skintypeexists )\r
395                 {\r
396                         // PostDeleteSkinPart event\r
397                         $manager->notify(\r
398                                 'PostDeleteSkinPart',\r
399                                 array(\r
400                                         'skinid' => $skinid,\r
401                                         'type' => $type\r
402                                 )\r
403                         );\r
404                 }\r
405                 return;\r
406         }\r
407         \r
408         /**\r
409          * Deletes all skin parts from the database\r
410          */\r
411         function deleteAllParts()\r
412         {\r
413                 sql_query('DELETE FROM ' . sql_table('skin') . ' WHERE sdesc=' . $this->getID());\r
414         }\r
415 \r
416         /**\r
417          * Updates the general information about the skin\r
418          */\r
419         function updateGeneralInfo($name, $desc, $type = 'text/html', $includeMode = 'normal', $includePrefix = '')\r
420         {\r
421                 $query =  'UPDATE '.sql_table('skin_desc').' SET'\r
422                            . " sdname='" . sql_real_escape_string($name) . "',"\r
423                            . " sddesc='" . sql_real_escape_string($desc) . "',"\r
424                            . " sdtype='" . sql_real_escape_string($type) . "',"\r
425                            . " sdincmode='" . sql_real_escape_string($includeMode) . "',"\r
426                            . " sdincpref='" . sql_real_escape_string($includePrefix) . "'"\r
427                            . " WHERE sdnumber=" . $this->getID();\r
428                 sql_query($query);\r
429         }\r
430         \r
431         /**\r
432          * Get an array with the names of possible skin parts\r
433          * Used to show all possible parts of a skin in the administration backend\r
434          * \r
435          * static: returns an array of friendly names\r
436          */\r
437         function getFriendlyNames()\r
438         {\r
439                 $skintypes = array(\r
440                         'index' => _SKIN_PART_MAIN,\r
441                         'item' => _SKIN_PART_ITEM,\r
442                         'archivelist' => _SKIN_PART_ALIST,\r
443                         'archive' => _SKIN_PART_ARCHIVE,\r
444                         'search' => _SKIN_PART_SEARCH,\r
445                         'error' => _SKIN_PART_ERROR,\r
446                         'member' => _SKIN_PART_MEMBER,\r
447                         'imagepopup' => _SKIN_PART_POPUP\r
448                 );\r
449                 \r
450                 $query = "SELECT stype FROM " . sql_table('skin') . " WHERE stype NOT IN ('index', 'item', 'error', 'search', 'archive', 'archivelist', 'imagepopup', 'member')";\r
451                 $res = sql_query($query);\r
452                 while ( $row = sql_fetch_array($res) )\r
453                 {\r
454                         $skintypes[strtolower($row['stype'])] = ucfirst($row['stype']);\r
455                 }\r
456                 return $skintypes;\r
457         }\r
458 \r
459         /**\r
460          * Get the allowed actions for a skin type\r
461          * returns an array with the allowed actions\r
462          * \r
463          * @param $type type of the skin (e.g. index, item, search ...)\r
464          */\r
465         function getAllowedActionsForType($type)\r
466         {\r
467                 global $blogid;\r
468                 \r
469                 // some actions that can be performed at any time, from anywhere\r
470                 $defaultActions = array('otherblog',\r
471                                                                 'plugin',\r
472                                                                 'version',\r
473                                                                 'nucleusbutton',\r
474                                                                 'include',\r
475                                                                 'phpinclude',\r
476                                                                 'parsedinclude',\r
477                                                                 'loginform',\r
478                                                                 'sitevar',\r
479                                                                 'otherarchivelist',\r
480                                                                 'otherarchivedaylist',\r
481                                                                 'otherarchiveyearlist',\r
482                                                                 'self',\r
483                                                                 'adminurl',\r
484                                                                 'todaylink',\r
485                                                                 'archivelink',\r
486                                                                 'member',\r
487                                                                 'category',\r
488                                                                 'searchform',\r
489                                                                 'referer',\r
490                                                                 'skinname',\r
491                                                                 'skinfile',\r
492                                                                 'set',\r
493                                                                 'if',\r
494                                                                 'else',\r
495                                                                 'endif',\r
496                                                                 'elseif',\r
497                                                                 'ifnot',\r
498                                                                 'elseifnot',\r
499                                                                 'charset',\r
500                                                                 'bloglist',\r
501                                                                 'addlink',\r
502                                                                 'addpopupcode',\r
503                                                                 'sticky',\r
504                                                                 // deprecated (Nucleus v2.0)\r
505                                                                 'ifcat'\r
506                                                                 );\r
507                 \r
508                 // extra actions specific for a certain skin type\r
509                 $extraActions = array();\r
510                 \r
511                 switch ( $type )\r
512                 {\r
513                         case 'index':\r
514                                 $extraActions = array('blog',\r
515                                                                 'blogsetting',\r
516                                                                 'preview',\r
517                                                                 'additemform',\r
518                                                                 'categorylist',\r
519                                                                 'archivelist',\r
520                                                                 'archivedaylist',\r
521                                                                 'archiveyearlist',\r
522                                                                 'nextlink',\r
523                                                                 'prevlink'\r
524                                                                 );\r
525                                 break;\r
526                         case 'archive':\r
527                                 $extraActions = array('blog',\r
528                                                                 'archive',\r
529                                                                 'otherarchive',\r
530                                                                 'categorylist',\r
531                                                                 'archivelist',\r
532                                                                 'archivedaylist',\r
533                                                                 'archiveyearlist',\r
534                                                                 'blogsetting',\r
535                                                                 'archivedate',\r
536                                                                 'nextarchive',\r
537                                                                 'prevarchive',\r
538                                                                 'nextlink',\r
539                                                                 'prevlink',\r
540                                                                 'archivetype'\r
541                                 );\r
542                                 break;\r
543                         case 'archivelist':\r
544                                 $extraActions = array('blog',\r
545                                                                 'archivelist',\r
546                                                                 'archivedaylist',\r
547                                                                 'archiveyearlist',\r
548                                                                 'categorylist',\r
549                                                                 'blogsetting',\r
550                                                            );\r
551                                 break;\r
552                         case 'search':\r
553                                 $extraActions = array('blog',\r
554                                                                 'archivelist',\r
555                                                                 'archivedaylist',\r
556                                                                 'archiveyearlist',\r
557                                                                 'categorylist',\r
558                                                                 'searchresults',\r
559                                                                 'othersearchresults',\r
560                                                                 'blogsetting',\r
561                                                                 'query',\r
562                                                                 'nextlink',\r
563                                                                 'prevlink'\r
564                                                                 );\r
565                                 break;\r
566                         case 'imagepopup':\r
567                                 $extraActions = array('image',\r
568                                                                 // deprecated (Nucleus v2.0)\r
569                                                                 'imagetext',\r
570                                                                 );\r
571                                 break;\r
572                         case 'member':\r
573                                 $extraActions = array(\r
574                                                                 'membermailform',\r
575                                                                 'blogsetting',\r
576                                                                 'nucleusbutton',\r
577                                                                 'categorylist'\r
578                                 );\r
579                                 break;\r
580                         case 'item':\r
581                                 $extraActions = array('blog',\r
582                                                                 'item',\r
583                                                                 'comments',\r
584                                                                 'commentform',\r
585                                                                 'vars',\r
586                                                                 'blogsetting',\r
587                                                                 'nextitem',\r
588                                                                 'previtem',\r
589                                                                 'nextlink',\r
590                                                                 'prevlink',\r
591                                                                 'nextitemtitle',\r
592                                                                 'previtemtitle',\r
593                                                                 'categorylist',\r
594                                                                 'archivelist',\r
595                                                                 'archivedaylist',\r
596                                                                 'archiveyearlist',\r
597                                                                 'itemtitle',\r
598                                                                 'itemid',\r
599                                                                 'itemlink',\r
600                                                                 );\r
601                                 break;\r
602                         case 'error':\r
603                                 $extraActions = array(\r
604                                                                 'errormessage',\r
605                                                                 'categorylist'\r
606                                 );\r
607                                 break;\r
608                         default:\r
609                                 if ( $blogid && $blogid > 0 )\r
610                                 {\r
611                                         $extraActions = array(\r
612                                                 'blog',\r
613                                                 'blogsetting',\r
614                                                 'preview',\r
615                                                 'additemform',\r
616                                                 'categorylist',\r
617                                                 'archivelist',\r
618                                                 'archivedaylist',\r
619                                                 'archiveyearlist',\r
620                                                 'nextlink',\r
621                                                 'prevlink',\r
622                                                 'membermailform',\r
623                                                 'nucleusbutton',\r
624                                                 'categorylist'\r
625                                         );\r
626                                 }\r
627                                 break;\r
628                 }\r
629                 return array_merge($defaultActions, $extraActions);\r
630         }\r
631 }\r