1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
26:
27: namespace Flea;
28:
29: 30: 31: 32: 33:
34: class PageList {
35:
36: private static $_INSTANCE = null;
37:
38:
39:
40:
41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
55: public function getAll(SqlQuery $query = null) {
56: if ($query === null)
57: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
58: else
59: $query->setType(SqlQuery::$TYPE_SELECT);
60:
61: if ($query->getWhere() == '')
62: $query->setWhere('_visible = 1');
63:
64: if ($query->getSelect() == '')
65: $query->setSelect('*');
66:
67: if ($query->getFrom() == '')
68: $query->setFrom('`' . DataBase::objectToTableName(Page::getEmptyPage()) . '`');
69:
70: if ($query->getOrderBy() == '')
71: $query->setOrderBy('_date DESC');
72:
73: $pages = array();
74: foreach (DataBase::getInstance(_DB_DSN_PAGE)->fetchAll($query) as $row) {
75: $page = new Page();
76: $page->setByObjectVars($row);
77: $pages[$page->getId()] = $page;
78: }
79:
80: return $pages;
81: }
82:
83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95:
96: public function getByList(SqlQuery $query) {
97: $table_page = DataBase::objectToTableName(Page::getEmptyPage());
98: $table_list = $table_page . '_array';
99:
100: $pages = array();
101:
102: $query->setType(SqlQuery::$TYPE_SELECT);
103: $query->setSelect('*');
104: $query->setFrom('`' . $table_page . '` '
105: . 'LEFT JOIN `' . $table_list . '` '
106: . 'ON ' . $table_page . '._id = ' . $table_list . '.page_id');
107:
108: if ($query->getOrderBy() == '')
109: $query->setOrderBy('_date DESC');
110:
111: foreach (DataBase::getInstance(_DB_DSN_PAGE)->fetchAll($query) as $row) {
112: $page = new Page();
113: $page->setByObjectVars($row);
114:
115: $pages[$page->getId()] = $page;
116: }
117:
118: return $pages;
119: }
120:
121: 122: 123: 124: 125: 126: 127:
128: public function buildPage(&$page) {
129: if ($page->getBuildFile() === '') {
130: return $page;
131: }
132:
133: ob_start();
134: include $page->getBuildFile();
135: $page->setHtmlBody(ob_get_clean());
136:
137: return $page;
138: }
139:
140: 141: 142: 143: 144: 145:
146: public function getAllByLang($lang) {
147: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
148: $query->setWhere('_lang = \'' . $lang . '\' AND _visible = 1');
149: return $this->getAll($query);
150: }
151:
152: 153: 154:
155: final private function __construct() {
156:
157: }
158:
159: 160: 161: 162: 163: 164:
165: public function getAllByName($name) {
166: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
167: $query->setWhere('_name = \'' . $name . '\' AND _visible = 1');
168: return $this->getAll($query);
169: }
170:
171: 172: 173: 174: 175: 176: 177:
178: public function getByTag($tag, $lang) {
179: $query = SqlQuery::getTemp();
180: $query->setWhere(' _lang = \'' . $lang . '\' AND page_prop = \'_tags\' AND value = \'' . $tag . '\' AND _visible = 1');
181: return $this->getByList($query);
182: }
183:
184: 185: 186: 187: 188: 189: 190: 191:
192: public function getWithThisContent($metaLabel, $metaValue, $lang) {
193: $where = '_lang = \'' . $lang . '\' AND '
194: . 'page_prop = \'_metas\' AND '
195: . 'key = \'' . $metaLabel . '\' AND '
196: . 'value = \'' . $metaValue . '\' AND '
197: . '_visible = 1';
198:
199: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
200: $query->setWhere($where);
201:
202: return $this->getByList($query);
203: }
204:
205: 206: 207: 208: 209: 210: 211: 212:
213: public function getWithOneOfThisContents($metaLabel, array $metaValues, $lang) {
214: $where = '_lang = \'' . $lang . '\' AND '
215: . 'page_prop = \'_metas\' AND '
216: . 'key = \'' . $metaLabel . '\' AND '
217: . '_visible = 1 AND (';
218:
219: $first = true;
220: foreach ($metaValues as $val) {
221: if (!$first)
222: $where .= ' OR';
223:
224: $where .= ' value = \'' . $val . '\'';
225: $first = false;
226: }
227: $where .= ')';
228:
229: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
230: $query->setWhere($where);
231:
232: return $this->getByList($query);
233: }
234:
235: 236: 237: 238: 239: 240: 241:
242: public function getWithOneOfTags(array $tags, $lang) {
243: if (count($tags) < 1)
244: return array();
245:
246: $where = '_lang = \'' . $lang . '\' AND '
247: . 'page_prop = \'_tags\' AND '
248: . '_visible = 1 AND (';
249:
250: $first = true;
251: foreach ($tags as $tag) {
252: if (!$first)
253: $where .= ' OR';
254:
255: $where .= ' value = \'' . $tag . '\'';
256: $first = false;
257: }
258: $where .= ')';
259: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
260: $query->setWhere($where);
261:
262:
263: return $this->getByList($query);
264: }
265:
266: 267: 268: 269: 270: 271: 272:
273: public function getWithAllTags(array $tags, $lang) {
274: $allPages = $this->getWithOneOfTags($tags, $lang);
275: $goodPages = array();
276:
277: foreach ($allPages as $page) {
278: $ok = true;
279: foreach ($tags as $tag) {
280: if (!$page->getTags()->hasValue($tag)) {
281: $ok = false;
282: }
283: }
284: if ($ok) {
285: $goodPages[] = $page;
286: }
287: }
288:
289: return $goodPages;
290: }
291:
292: 293: 294: 295: 296: 297:
298: public function getByLang($lang) {
299: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
300: $query->setWhere('_lang = \'' . $lang . '\' AND _visible = 1');
301: return $this->getAll($query);
302: }
303:
304: 305: 306: 307: 308: 309: 310:
311: public function has($name, $lang = null) {
312: $tableName = DataBase::objectToTableName(Page::getEmptyPage());
313:
314: $query = SqlQuery::getTemp();
315: $query->initCount($tableName);
316:
317: $where = '_name = \'' . $name . '\'';
318: if ($lang !== null) {
319: $where .= ' AND _lang = \'' . $lang . '\'';
320: }
321: $query->setWhere($where);
322:
323: return ( DataBase::getInstance(_DB_DSN_PAGE)->count($query) > 0);
324: }
325:
326:
327: 328: 329: 330: 331:
332:
333:
334: private $_error404;
335:
336: 337: 338: 339: 340:
341: public function getError404PageName() {
342: return $this->_error404;
343: }
344:
345: 346: 347: 348: 349:
350: private function makeError404Page(&$page) {
351: $page->setVisible(false);
352: $page->setCachable(false);
353: $page->setPhpHeader('HTTP/1.0 404 Not Found');
354: return $page;
355: }
356:
357: 358: 359: 360: 361: 362:
363: public function getByUrl($relURL) {
364: if (_DEBUG && !General::getInstance()->isPagesInitialized()) {
365: Debug::getInstance()->addError('All pages must be initialised after use getByUrl()');
366: }
367:
368:
369: $query = SqlQuery::getTemp();
370: $query->setWhere('_url LIKE \'' . $relURL . '\' OR (page_prop = \'_url301\' AND value = \'' . $relURL . '\')');
371: $pages1 = $this->getByList($query);
372: if (count($pages1) > 0)
373: return current($pages1);
374:
375:
376:
377: if (strlen($relURL) < 1 || (strlen($relURL) > 0 && $relURL[strlen($relURL) - 1] !== '/')) {
378: $urlTemp = $relURL . '/';
379:
380: $query->clean(SqlQuery::$TYPE_SELECT);
381: $query->setWhere('_url LIKE \'' . $urlTemp . '\' OR (page_prop = \'_url301\' AND value = \'' . $urlTemp . '\')');
382: $pages = $this->getByList($query);
383: if (count($pages) > 0)
384: return current($pages);
385: }
386:
387:
388: if (strlen($relURL) > 0 && $relURL[strlen($relURL) - 1] === '/') {
389: $urlTemp = substr($relURL, 0, strlen($relURL) - 1);
390:
391: $query->clean(SqlQuery::$TYPE_SELECT);
392: $query->setWhere('_url LIKE \'' . $urlTemp . '\' OR (page_prop = \'_url301\' AND value = \'' . $urlTemp . '\')');
393: $pages = $this->getByList($query);
394: if (count($pages) > 0)
395: return current($pages);
396: }
397:
398:
399:
400: $lang = LangList::getInstance()->getLangByNavigator();
401:
402:
403: $query->clean(SqlQuery::$TYPE_SELECT);
404: $query->setSelect('_id');
405: $query->setFrom('`' . DataBase::objectToTableName(Page::getEmptyPage()) . '`');
406: $query->setWhere('SUBSTR( \'' . $relURL . '\', 0, LENGTH(_url)+1 ) LIKE _url AND _getEnabled = 1');
407: $query->setOrderBy('LENGTH(_url) DESC');
408:
409: $pages2 = DataBase::getInstance(_DB_DSN_PAGE)->fetchAll($query);
410: if (count($pages2) > 0) {
411: foreach ($pages2 as $pageTemp) {
412: $query->clean();
413: $query->setWhere('_id LIKE \'' . $pageTemp['_id'] . '\'');
414: $pagesTemp = $this->getByList($query);
415: if (count($pagesTemp) > 0) {
416: return current($pagesTemp);
417: }
418: }
419: }
420:
421: if (_DEBUG) {
422: Debug::getInstance()->addError('The URL "' . $relURL . '" don\'t exist');
423: }
424:
425: return $this->getError404Page($lang);
426: }
427:
428: 429: 430: 431: 432: 433: 434:
435: public function getError404Page($lang) {
436: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
437: $query->setLimit(1);
438: $query->setWhere('_type = \'' . Page::$TYPE_ERROR404 . '\' AND _lang = \'' . $lang . '\'');
439: $pages1 = $this->getAll($query);
440: if (count($pages1) > 0) {
441: return current($pages1);
442: }
443:
444: $query->setWhere('_type = \'' . Page::$TYPE_ERROR404 . '\'');
445: $pages2 = $this->getAll($query);
446: if (count($pages2) > 0) {
447: return current($pages2);
448: }
449:
450:
451: $page = new Page();
452: 453: 454: 455:
456: $page->setHtmlBody('<h1>Error 404 - Not found</h1>');
457: $this->makeError404Page($page);
458: return $page;
459:
460: }
461:
462: 463: 464: 465: 466: 467:
468: public function getDefaultPage($lang) {
469: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
470: $query->setLimit(1);
471:
472: $query->setWhere('_type = \'' . Page::$TYPE_DEFAULT . '\' AND _lang = \'' . $lang . '\'');
473: $pages1 = $this->getAll($query);
474: if (count($pages1) > 0) {
475: return current($pages1);
476: }
477:
478:
479: $query->setWhere('_type = \'' . Page::$TYPE_DEFAULT . '\'');
480: $pages2 = $this->getAll($query);
481: if (count($pages2) > 0) {
482: return current($pages2);
483: }
484:
485:
486: return $this->getError404Page($lang);
487: }
488:
489: 490: 491: 492: 493: 494: 495:
496: public function exist($name, $lang) {
497: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
498: $query->setWhere('_name = \'' . $name . '\' AND _lang = \'' . $lang . '\'');
499: $query->setLimit(1);
500: $pages = $this->getAll($query);
501:
502: return ( count($pages) > 0 );
503: }
504:
505: 506: 507: 508: 509: 510: 511:
512: public function getByName($name, $lang) {
513: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
514: $query->setWhere('_name = \'' . $name . '\' AND _lang = \'' . $lang . '\'');
515: $query->setLimit(1);
516: $pages = $this->getAll($query);
517:
518: if (count($pages) > 0) {
519: return current($pages);
520: }
521:
522: if (_DEBUG) {
523: Debug::getInstance()->addError('The page ' . $name . ',' . $lang . ' don\'t exist');
524: }
525:
526: return $this->getDefaultPage($lang);
527: }
528:
529: 530: 531: 532: 533: 534:
535: public function hasUrl($url) {
536: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
537: $query->setWhere('_url LIKE \'' . $url . '\' OR (page_prop = \'_url301\' AND value = \'' . $url . '\')');
538: $query->setLimit(1);
539: $pages = $this->getByList($query);
540: return ( count($pages) > 0 );
541: }
542:
543: 544: 545: 546: 547: 548:
549: private function getLangByUrl($url) {
550: $query = SqlQuery::getTemp(SqlQuery::$TYPE_SELECT);
551: $query->setWhere('_url LIKE \'' . $url . '\' OR (page_prop = \'_url301\' AND value = \'' . $url . '\')');
552: $query->setLimit(1);
553: $pages = $this->getByList($query);
554: if (count($pages) > 0) {
555: return current($pages)->getLang();
556: }
557:
558: return LangList::getInstance()->getLangByNavigator();
559: }
560:
561: final private function __clone() {
562: if (_DEBUG) {
563: Debug::getInstance()->addError('You can\'t clone a singleton');
564: }
565: }
566:
567: 568: 569: 570: 571:
572: final public static function getInstance() {
573: if (PageList::$_INSTANCE === null) {
574: PageList::$_INSTANCE = new PageList();
575: }
576: return PageList::$_INSTANCE;
577: }
578:
579: }
580: