PageRenderTime 35ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 1ms

/page.php

https://github.com/CasperGemini/e107
PHP | 967 lines | 655 code | 228 blank | 84 comment | 66 complexity | ddae45f9c61f8721660e8213860f19ec MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. /*
  3. * e107 website system
  4. *
  5. * Copyright (C) e107 Inc (e107.org)
  6. * Released under the terms and conditions of the
  7. * GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
  8. *
  9. * URL and front controller Management
  10. *
  11. * $URL$
  12. * $Id$
  13. */
  14. require_once("class2.php");
  15. e107::coreLan('page');
  16. $e107CorePage = new pageClass(false);
  17. // Important - save request BEFORE any output (header footer) - used in navigation menu
  18. if(!e_QUERY)
  19. {
  20. $e107CorePage->setRequest('listBooks');
  21. require_once(HEADERF);
  22. // $tmp = $e107CorePage->listPages();
  23. $tmp = $e107CorePage->listBooks();
  24. // $text = $tp->parseTemplate("{PAGE_NAVIGATION=book=2}",true);
  25. if(is_array($tmp))
  26. {
  27. $ns->tablerender($tmp['title'], $text, 'cpage-full-list');
  28. }
  29. require_once(FOOTERF);
  30. exit;
  31. }
  32. elseif(vartrue($_GET['bk'])) // List Chapters within a specific Book
  33. {
  34. $e107CorePage->setRequest('listChapters');
  35. require_once(HEADERF);
  36. $data = $e107CorePage->listChapters($_GET['bk']);
  37. $ns->tablerender($data['caption'], $data['text'], 'cpage-chapter-list');
  38. require_once(FOOTERF);
  39. exit;
  40. }
  41. elseif(vartrue($_GET['ch'])) // List Pages within a specific Chapter
  42. {
  43. $e107CorePage->setRequest('listPages');
  44. require_once(HEADERF);
  45. $data = $e107CorePage->listPages($_GET['ch']);
  46. $ns->tablerender($data['caption'], $data['text'], 'cpage-page-list');
  47. require_once(FOOTERF);
  48. exit;
  49. }
  50. else
  51. {
  52. $e107CorePage->setRequest('showPage');
  53. $e107CorePage->processViewPage();
  54. require_once(HEADERF);
  55. echo $e107CorePage->showPage();
  56. require_once(FOOTERF);
  57. exit;
  58. }
  59. /* EOF */
  60. class pageClass
  61. {
  62. public $bullet; /* bullet image */
  63. public $pageText; /* main text of selected page, not parsed */
  64. public $multipageFlag; /* flag - true if multiple page page, false if not */
  65. public $pageTitles; /* array containing page titles */
  66. public $pageID; /* id number of page to be displayed */
  67. public $pageSelected; /* selected page of multiple page page */
  68. public $pageToRender; /* parsed page to be sent to screen */
  69. public $debug; /* temp debug flag */
  70. public $title; /* title of page, it if has one (as defined in [newpage=title] tag */
  71. public $page; /* page DB data */
  72. public $batch; /* shortcode batch object */
  73. public $template; /* current template array */
  74. protected $authorized; /* authorized status */
  75. public $cacheString; /* current page cache string */
  76. public $cacheTitleString; /* current page title and comment flag cache string */
  77. public $cacheData = null; /* cache data */
  78. protected $chapterSef; /* authorized status */
  79. protected $chapterParent;
  80. protected $chapterData = array();
  81. protected $displayAllMode = false; // set to True when no book/chapter/page has been defined by the url/query.
  82. function __construct($debug=FALSE)
  83. {
  84. /* constructor */
  85. if(!vartrue($_GET['id'])) // legacy URLs /page.php?x
  86. {
  87. $tmp = explode(".", e_QUERY);
  88. $this->pageID = intval($tmp[0]);
  89. $this->pageSelected = (isset($tmp[1]) ? intval($tmp[1]) : 0);
  90. $this->pageTitles = array();
  91. $this->bullet = '';
  92. }
  93. else // NEW URLS /page.php?id=x
  94. {
  95. $tmp = explode(".", e_QUERY);
  96. $this->pageID = intval($_GET['id']);
  97. $this->pageSelected = (isset($tmp[1]) ? intval($tmp[1]) : 0); // Not sure what this is?
  98. $this->pageTitles = array();
  99. $this->bullet = ''; // deprecated - use CSS instead.
  100. }
  101. // TODO nq_ (no query) cache string
  102. $this->cacheString = 'page_'.$this->pageID.'_'.$this->pageSelected;
  103. $this->cacheTitleString = 'page-t_'.$this->pageID.'_'.$this->pageSelected;
  104. if(defined('BULLET'))
  105. {
  106. $this->bullet = "<img src='".THEME_ABS."images/".BULLET."' alt='' class='icon' />";
  107. }
  108. elseif(file_exists(THEME.'images/bullet2.gif'))
  109. {
  110. $this->bullet = "<img src='".THEME_ABS."images/bullet2.gif' alt='' class='icon' />";
  111. }
  112. elseif(file_exists(THEME.'images/bullet2.png'))
  113. {
  114. $this->bullet = "<img src='".THEME_ABS."images/bullet2.png' alt='' class='icon' />";
  115. }
  116. $this->debug = $debug;
  117. if($this->debug)
  118. {
  119. $this->debug = "<b>PageID</b> ".$this->pageID." <br />";
  120. $this->debug .= "<b>pageSelected</b> ".$this->pageSelected." <br />";
  121. }
  122. $books = e107::getDb()->retrieve("SELECT chapter_id,chapter_sef,chapter_name FROM #page_chapters ORDER BY chapter_id ASC" , true);
  123. foreach($books as $row)
  124. {
  125. $id = $row['chapter_id'];
  126. $this->chapterData[$id] = $row;
  127. }
  128. }
  129. // XXX temporary solution - upcoming page rewrite
  130. public function setRequest($request)
  131. {
  132. switch ($request)
  133. {
  134. case 'listChapters':
  135. $id = intval($_GET['bk']);
  136. break;
  137. case 'listPages':
  138. $id = intval($_GET['ch']);
  139. break;
  140. case 'showPage':
  141. $id = $this->pageID;
  142. break;
  143. case 'listBooks':
  144. default:
  145. $id = 0;
  146. break;
  147. }
  148. e107::setRegistry('core/pages/request', array('action' => $request, 'id' => $id));
  149. }
  150. private function getSef($chapter)
  151. {
  152. return vartrue($this->chapterData[$chapter]['chapter_sef'],'--sef-not-assigned--');
  153. }
  154. private function getParent($chapter)
  155. {
  156. return varset($this->chapterData[$chapter]['chapter_parent'], false);
  157. }
  158. private function getName($chapter)
  159. {
  160. return varset($this->chapterData[$chapter]['chapter_name'], false);
  161. }
  162. private function getDescription($chapter)
  163. {
  164. return varset($this->chapterData[$chapter]['chapter_meta_description'], false);
  165. }
  166. private function getIcon($chapter)
  167. {
  168. return varset($this->chapterData[$chapter]['chapter_icon'], false);
  169. }
  170. /**
  171. * @todo Check userclasses
  172. * @todo sef urls
  173. */
  174. function listBooks()
  175. {
  176. $sql = e107::getDb('sql2');
  177. $tp = e107::getParser();
  178. $frm = e107::getForm();
  179. $this->displayAllMode = true;
  180. $text = "";
  181. if(e107::getPref('listBooks',false) && $sql->select("page_chapters", "*", "chapter_parent ='0' AND chapter_visibility IN (".USERCLASS_LIST.") ORDER BY chapter_order ASC "))
  182. {
  183. $layout = e107::getPref('listBooksTemplate','default');
  184. $tml = e107::getCoreTemplate('chapter','', true, true); // always merge
  185. $tmpl = varset($tml[$layout]);
  186. $template = $tmpl['listBooks'];
  187. $text = $template['start'];
  188. while($row = $sql->fetch())
  189. {
  190. $sef = $row;
  191. $sef['book_sef'] = $this->getSef($row['chapter_id']);
  192. $sef['page_sef'] = $this->getSef($row['chapter_id']);
  193. $listChapters = $this->listChapters(intval($row['chapter_id']), $row['chapter_sef']);
  194. $var = array(
  195. 'BOOK_NAME' => $tp->toHtml($row['chapter_name']),
  196. 'BOOK_ANCHOR' => $frm->name2id($row['chapter_name']),
  197. 'BOOK_ICON' => $this->chapterIcon($row['chapter_icon']),
  198. 'BOOK_DESCRIPTION' => $tp->toHtml($row['chapter_meta_description'],true,'BODY'),
  199. 'CHAPTERS' => $listChapters['text'],
  200. 'BOOK_URL' => e107::getUrl()->create('page/book/index', $sef,'allow=chapter_id,chapter_sef,book_sef,page_sef')
  201. );
  202. $text .= $tp->simpleParse($template['item'],$var);
  203. }
  204. }
  205. if(e107::getPref('listPages',false))
  206. {
  207. $text .= "<h3>Other Articles</h3>"; // Book Title.
  208. $tmp = $this->listPages(0);
  209. $text .= $tmp['text']; // Pages unassigned to Book/Chapters.
  210. } //
  211. if($text)
  212. {
  213. $caption = varset($template['caption'],"Articles");
  214. e107::getRender()->tablerender($caption, $text, "cpage_list");
  215. }
  216. else
  217. {
  218. message_handler("MESSAGE", LAN_PAGE_1);
  219. require_once(FOOTERF); // prevent message from showing twice and still listing chapters
  220. exit;
  221. }
  222. }
  223. /**
  224. * Parse the Book/Chapter "listChapters' template
  225. */
  226. function listChapters($book=1)
  227. {
  228. $sql = e107::getDb('chap');
  229. $tp = e107::getParser();
  230. $frm = e107::getForm();
  231. // retrieve book information.
  232. if(!$brow = $sql->retrieve('page_chapters','chapter_name,chapter_template','chapter_id = '.intval($book).' AND chapter_visibility IN ('.USERCLASS_LIST.') LIMIT 1'))
  233. {
  234. $layout = 'default';
  235. }
  236. else
  237. {
  238. $layout = $brow['chapter_template'];
  239. }
  240. if($this->displayAllMode === true)
  241. {
  242. $layout = e107::getPref('listBooksTemplate');
  243. }
  244. $tml = e107::getCoreTemplate('chapter','', true, true); // always merge
  245. $error = array('listChapters' => array('start'=>"Chapter template not found: ".$layout));
  246. $tmpl = varset($tml[$layout],$error );
  247. $template = $tmpl['listChapters'];
  248. $bvar = array(
  249. 'BOOK_NAME' => $tp->toHtml($brow['chapter_name']),
  250. 'BOOK_ANCHOR' => $frm->name2id($brow['chapter_name']),
  251. 'BOOK_ICON' => $this->chapterIcon($brow['chapter_icon']),
  252. 'BOOK_DESCRIPTION' => $tp->toHtml($brow['chapter_meta_description'],true,'BODY'),
  253. );
  254. $caption = $tp->simpleParse($template['caption'],$bvar);
  255. if($sql->select("page_chapters", "*", "chapter_parent = ".intval($book)." AND chapter_visibility IN (".USERCLASS_LIST.") ORDER BY chapter_order ASC "))
  256. {
  257. $text .= $template['start'];
  258. while($row = $sql->fetch())
  259. {
  260. $tmp = $this->listPages(intval($row['chapter_id']));
  261. $row['book_sef'] = $this->getSef($row['chapter_parent']);
  262. $row['book_name'] = $this->getName($row['chapter_parent']);
  263. $row['book_icon'] = $this->getIcon($row['chapter_parent']);
  264. $row['book_description'] = $this->getDescription($row['chapter_parent']);
  265. $var = array(
  266. 'BOOK_NAME' => $tp->toHtml($row['book_name']),
  267. 'BOOK_ANCHOR' => $frm->name2id($row['book_name']),
  268. 'BOOK_ICON' => $this->chapterIcon($row['book_icon']),
  269. 'BOOK_DESCRIPTION' => $tp->toHtml($row['book_description'],true,'BODY'),
  270. 'CHAPTER_NAME' => $tp->toHtml($row['chapter_name']),
  271. 'CHAPTER_ANCHOR' => $frm->name2id($row['chapter_name']),
  272. 'CHAPTER_ICON' => $this->chapterIcon($row['chapter_icon']),
  273. 'CHAPTER_DESCRIPTION' => $tp->toHtml($row['chapter_meta_description'],true,'BODY'),
  274. 'PAGES' => $tmp['text'],
  275. 'CHAPTER_URL' => e107::getUrl()->create('page/chapter/index', $row,'allow=chapter_id,chapter_sef,book_sef')
  276. );
  277. $text .= $tp->simpleParse($template['item'],$var);
  278. }
  279. $text .= $template['end'];
  280. }
  281. else
  282. {
  283. $text = e107::getMessage()->addInfo("There are no chapters in this book")->render();
  284. }
  285. return array('caption'=>$caption, 'text'=>$text);
  286. }
  287. /**
  288. * Handle Chapter Icon Glyphs.
  289. */
  290. private function chapterIcon($icon)
  291. {
  292. $tp = e107::getParser();
  293. if(!vartrue($icon))
  294. {
  295. return;
  296. }
  297. if($glyph = $tp->toGlyph($icon))
  298. {
  299. return $glyph;
  300. }
  301. else
  302. {
  303. return $tp->toIcon($icon);
  304. }
  305. }
  306. function listPages($chapt=0)
  307. {
  308. $sql = e107::getDb('pg');
  309. $tp = e107::getParser();
  310. $this->batch = e107::getScBatch('page',null,'cpage');
  311. $frm = e107::getForm();
  312. // retrieve the template to use for this chapter.
  313. $row = $sql->retrieve('page_chapters','chapter_id,chapter_icon,chapter_name,chapter_parent, chapter_meta_description,chapter_template','chapter_id = '.intval($chapt).' LIMIT 1');
  314. if($this->displayAllMode === true)
  315. {
  316. $layout = e107::getPref('listBooksTemplate');
  317. }
  318. else
  319. {
  320. $layout = vartrue($row['chapter_template'],'default');
  321. }
  322. $bookId = $row['chapter_parent'];
  323. $bookSef = $this->getSef($row['chapter_parent']);
  324. $bookTitle = $this->getName($row['chapter_parent']);
  325. $urlData = array(
  326. 'chapter_id' => $row['chapter_id'],
  327. 'chapter_name' => $tp->toHtml($row['chapter_name']),
  328. 'chapter_sef' => $bookSef,
  329. 'book_sef' => $bookSef,
  330. 'page_sef' => ''
  331. );
  332. //print_a($this->chapterData);
  333. $tml = e107::getCoreTemplate('chapter','', true, true); // always merge
  334. $tmpl = varset($tml[$layout]);
  335. $bread = array(
  336. 0 => array('text' => $tp->toHtml($bookTitle), 'url'=> e107::getUrl()->create('page/book/index', $urlData,'allow=chapter_id,chapter_sef,book_sef,page_sef'))
  337. );
  338. $var = array(
  339. 'CHAPTER_NAME' => $tp->toHtml($row['chapter_name']),
  340. 'CHAPTER_ANCHOR' => $frm->name2id($row['chapter_name']),
  341. 'CHAPTER_ICON' => $this->chapterIcon($row['chapter_icon']),
  342. 'CHAPTER_DESCRIPTION' => $tp->toHtml($row['chapter_meta_description'], true,'BODY'),
  343. 'CHAPTER_BREADCRUMB' => $frm->breadcrumb($bread)
  344. );
  345. // $tmpl = e107::getCoreTemplate('chapter','docs', true, true); // always merge
  346. $template = $tmpl['listPages'];
  347. $pageOnly = ($layout == 'panel') ? '1' : "page_title !='' "; // When in 'panel' mode, allow Menus to be rendered.
  348. if(!$count = $sql->select("page", "*", $pageOnly." AND page_chapter=".intval($chapt)." AND page_class IN (".USERCLASS_LIST.") ORDER BY page_order ASC "))
  349. {
  350. return array('text' => "<em>".(LAN_PAGE_2)."</em>");
  351. // $text = "<ul class='page-pages-list page-pages-none'><li>".LAN_PAGE_2."</li></ul>";
  352. }
  353. else
  354. {
  355. $pageArray = $sql->db_getList();
  356. $header = $tp->simpleParse($template['start'],$var);
  357. $text .= $tp->parseTemplate($header,true); // for parsing {SETIMAGE} etc.
  358. foreach($pageArray as $page)
  359. {
  360. $data = array(
  361. 'title' => $page['page_title'],
  362. 'text' => $tp->toHtml($page['page_text'],true)
  363. );
  364. $page['chapter_sef'] = $this->getSef($page['page_chapter']); // $chapter_sef;
  365. $page['book_sef'] = $bookSef;
  366. // $this->page = $page;
  367. $this->batch->setVars($page);
  368. // $this->batch->setVars(new e_vars($data))->setScVar('page', $this->page);
  369. // $url = e107::getUrl()->create('page/view', $page, 'allow=page_id,page_sef,chapter_sef,book_sef');
  370. // $text .= "<li><a href='".$url."'>".$tp->toHtml($page['page_title'])."</a></li>";
  371. $text .= e107::getParser()->parseTemplate($template['item'], true, $this->batch);
  372. }
  373. $text .= $tp->simpleParse($template['end'], $var);
  374. // $caption = ($title !='')? $title: LAN_PAGE_11;
  375. // e107::getRender()->tablerender($caption, $text,"cpage_list");
  376. }
  377. $caption = $tp->simpleParse($template['caption'], $var);
  378. return array('caption'=>$caption, 'text'=> $text);
  379. }
  380. function processViewPage()
  381. {
  382. if($this->checkCache())
  383. {
  384. return;
  385. }
  386. $sql = e107::getDb();
  387. $query = "SELECT p.*, u.user_id, u.user_name, user_login FROM #page AS p
  388. LEFT JOIN #user AS u ON p.page_author = u.user_id
  389. WHERE p.page_id=".intval($this->pageID); // REMOVED AND p.page_class IN (".USERCLASS_LIST.") - permission check is done later
  390. if(!$sql->gen($query))
  391. {
  392. /*
  393. $ret['title'] = LAN_PAGE_12; // ***** CHANGED
  394. $ret['sub_title'] = '';
  395. $ret['text'] = LAN_PAGE_3;
  396. $ret['comments'] = '';
  397. $ret['rating'] = '';
  398. $ret['np'] = '';
  399. $ret['err'] = TRUE;
  400. $ret['cachecontrol'] = false;
  401. */
  402. // ---------- New (to replace values above) ----
  403. $this->page['page_title'] = LAN_PAGE_12; // ***** CHANGED
  404. $this->page['sub_title'] = '';
  405. $this->page['page_text'] = LAN_PAGE_3;
  406. $this->page['comments'] = '';
  407. $this->page['rating'] = '';
  408. $this->page['np'] = '';
  409. $this->page['err'] = TRUE;
  410. $this->page['cachecontrol'] = false;
  411. // -------------------------------------
  412. $this->authorized = 'nf';
  413. $this->template = e107::getCoreTemplate('page', 'default');
  414. // $this->batch = e107::getScBatch('page',null,'cpage')->setVars(new e_vars($ret))->setScVar('page', array()); ///Upgraded to setVars() array. (not using '$this->page')
  415. $this->batch = e107::getScBatch('page',null,'cpage')->setVars($this->page);
  416. define("e_PAGETITLE", $this->page['page_title']);
  417. return;
  418. }
  419. $this->page = $sql->fetch();
  420. // setting override to true breaks default.
  421. $this->template = e107::getCoreTemplate('page', vartrue($this->page['page_template'], 'default'), true, true);
  422. if(!$this->template)
  423. {
  424. // switch to default
  425. $this->template = e107::getCoreTemplate('page', 'default', false, false);
  426. }
  427. if(empty($this->template))
  428. {
  429. $this->template = e107::getCoreTemplate('page', 'default');
  430. }
  431. $this->batch = e107::getScBatch('page',null,'cpage');
  432. $this->pageText = $this->page['page_text'];
  433. $this->pageCheckPerms($this->page['page_class'], $this->page['page_password'], $this->page['page_title']);
  434. if($this->debug)
  435. {
  436. echo "<b>pageText</b> ".$this->pageText." <br />";
  437. }
  438. $this->parsePage();
  439. $pagenav = $rating = $comments = '';
  440. if($this->authorized === true)
  441. {
  442. $pagenav = $this->pageIndex();
  443. $rating = $this->pageRating($this->page['page_rating_flag']);
  444. $comments = $this->pageComment($this->page['page_comment_flag']);
  445. }
  446. /*
  447. $ret['title'] = $this->page['page_title'];
  448. $ret['sub_title'] = $this->title;
  449. $ret['text'] = $this->pageToRender;
  450. $ret['np'] = $pagenav;
  451. $ret['rating'] = $rating;
  452. $ret['comments'] = $comments;
  453. $ret['err'] = FALSE;
  454. $ret['cachecontrol'] = (isset($this->page['page_password']) && !$this->page['page_password'] && $this->authorized === true); // Don't cache password protected pages
  455. */
  456. // $this->batch->setVars(new e_vars($ret))->setScVar('page', $this->page); // Removed in favour of $this->var (cross-compatible with menus and other parts of e107 that use the same shortcodes)
  457. // ---- New --- -
  458. $this->page['page_text'] = $this->pageToRender;
  459. $this->page['np'] = $pagenav;
  460. $this->page['rating'] = $rating;
  461. $this->page['comments'] = $comments;
  462. $this->page['err'] = FALSE;
  463. $this->page['cachecontrol'] = (isset($this->page['page_password']) && !$this->page['page_password'] && $this->authorized === true);
  464. // -----------------
  465. $this->batch->setVars($this->page);
  466. define('e_PAGETITLE', eHelper::formatMetaTitle($ret['title']));
  467. if($this->page['page_metadscr']) define('META_DESCRIPTION', eHelper::formatMetaDescription($this->page['page_metadscr']));
  468. if($this->page['page_metakeys']) define('META_KEYWORDS', eHelper::formatMetaKeys($this->page['page_metakeys']));
  469. //return $ret;
  470. }
  471. public function checkCache()
  472. {
  473. $e107cache = e107::getCache();
  474. $cacheData = $e107cache->retrieve($this->cacheString);
  475. if(false !== $cacheData)
  476. {
  477. $this->cacheData = array();
  478. $this->cacheData['PAGE'] = $cacheData;
  479. list($pagetitle, $comment_flag, $meta_keys, $meta_dscr) = explode("^^^",$e107cache->retrieve($this->cacheTitleString), 4);
  480. $this->cacheData['TITLE'] = $pagetitle;
  481. $this->cacheData['COMMENT_FLAG'] = $comment_flag;
  482. $this->cacheData['META_KEYS'] = $meta_keys;
  483. $this->cacheData['META_DSCR'] = $meta_dscr;
  484. }
  485. }
  486. public function setCache($data, $title, $comment_flag)
  487. {
  488. $e107cache = e107::getCache();
  489. $e107cache->set($this->cacheString, $data);
  490. $e107cache->set($this->cacheTitleString, $title."^^^".$this->page['page_comment_flag']."^^^".$this->page['page_metakeys']."^^^".$this->page['page_metadscr']);
  491. }
  492. public function renderCache()
  493. {
  494. $comments = '';
  495. if($this->cacheData['COMMENT_FLAG'])
  496. {
  497. $vars = new e_vars(array('comments' => $this->pageComment(true)));
  498. $comments = e107::getScBatch('page',null,'cpage')->setVars($vars)->cpagecomments();
  499. }
  500. define('e_PAGETITLE', eHelper::formatMetaTitle($this->cacheData['TITLE']));
  501. define('META_DESCRIPTION', $this->cacheData['META_DSCR']);
  502. define('META_KEYWORDS', $this->cacheData['META_KEYS']);
  503. if($this->debug)
  504. {
  505. echo "<b>Reading page from cache</b><br />";
  506. }
  507. return str_replace('[[PAGECOMMENTS]]', $comments, $this->cacheData['PAGE']);
  508. }
  509. public function showPage()
  510. {
  511. if(null !== $this->cacheData)
  512. {
  513. return $this->renderCache();
  514. }
  515. if(true === $this->authorized)
  516. {
  517. $vars = $this->batch->getParserVars();
  518. $template = str_replace('{PAGECOMMENTS}', '[[PAGECOMMENTS]]', $this->template['start'].$this->template['body'].$this->template['end']);
  519. $ret = $this->renderPage($template);
  520. if(!empty($this->template['page']))
  521. {
  522. $ret = str_replace(array('{PAGE}', '{PAGECOMMENTS}'), array($ret, '[[PAGECOMMENTS]]'), $this->template['page']);
  523. }
  524. $ret = e107::getParser()->parseTemplate($ret, true, $this->batch);
  525. if($vars->cachecontrol) $this->setCache($ret, $this->batch->sc_cpagetitle(), $this->page['page_comment_flag']);
  526. return str_replace('[[PAGECOMMENTS]]', $this->batch->cpagecomments(), $ret);
  527. }
  528. $extend = new e_vars;
  529. $vars = $this->batch->getParserVars();
  530. // reset batch data
  531. // $this->batch->setVars(null)->setScVar('page', array());
  532. // copy some data
  533. $extend->title = $vars->title;
  534. $extend->message = e107::getMessage()->render();
  535. switch ($this->authorized)
  536. {
  537. case 'class':
  538. $extend->text = LAN_PAGE_6;
  539. $template = $this->template['start'].$this->template['restricted'].$this->template['end'];
  540. break;
  541. case 'pw':
  542. $frm = e107::getForm();
  543. $extend->caption = LAN_PAGE_8;
  544. $extend->label = LAN_PAGE_9;
  545. $extend->password = $frm->password('page_pw');
  546. $extend->icon = e_IMAGE_ABS.'generic/password.png';
  547. $extend->submit = $frm->submit('submit_page_pw', LAN_PAGE_10);
  548. // FIXME - add form open/close e_form methods
  549. $extend->form_open = '<form method="post" action="'.e_REQUEST_URI.'" id="pwform">';
  550. $extend->form_close = '</form>';
  551. $template = $this->template['start'].$this->template['authorize'].$this->template['end'];
  552. break;
  553. case 'nf':
  554. default:
  555. $extend->text = $vars->text;
  556. $template = $this->template['start'].$this->template['notfound'].$this->template['end'];
  557. break;
  558. }
  559. return $this->renderPage($template, $extend);
  560. }
  561. public function renderPage($template, $vars = null)
  562. {
  563. if(null === $vars)
  564. {
  565. $ret = e107::getParser()->parseTemplate($template, true, $this->batch);
  566. }
  567. else
  568. {
  569. $ret = e107::getParser()->simpleParse($template, $vars);
  570. }
  571. $mode = vartrue($this->template['tableRender'], 'cpage-'.$template);
  572. return e107::getRender()->tablerender($this->page['page_title'], $ret, $mode, true);
  573. }
  574. public function parsePage()
  575. {
  576. $tp = e107::getParser();
  577. e107::getBB()->setClass("page");
  578. $this->pageTitles = array(); // Notice removal
  579. if(preg_match_all("/\[newpage.*?\]/si", $this->pageText, $pt))
  580. {
  581. if (substr($this->pageText, 0, 6) == '[html]')
  582. { // Need to strip html bbcode from wysiwyg on multi-page docs (handled automatically on single pages)
  583. if (substr($this->pageText, -7, 7) == '[/html]')
  584. {
  585. $this->pageText = substr($this->pageText, 6, -7);
  586. }
  587. else
  588. {
  589. $this->pageText = substr($this->pageText, 6);
  590. }
  591. }
  592. $pages = preg_split("/\[newpage.*?\]/si", $this->pageText, -1, PREG_SPLIT_NO_EMPTY);
  593. $this->multipageFlag = TRUE;
  594. }
  595. else
  596. {
  597. $this->pageToRender = $tp->toHTML($this->pageText, TRUE, 'BODY');
  598. return;
  599. }
  600. foreach($pt[0] as $title)
  601. {
  602. $this->pageTitles[] = $title;
  603. }
  604. if(!trim($pages[0]))
  605. {
  606. $count = 0;
  607. foreach($pages as $page)
  608. {
  609. $pages[$count] = $pages[($count+1)];
  610. $count++;
  611. }
  612. unset($pages[(count($pages)-1)]);
  613. }
  614. $pageCount = count($pages);
  615. $titleCount = count($this->pageTitles);
  616. /* if the vars above don't match, page 1 has no [newpage] tag, so we need to create one ... */
  617. if($pageCount != $titleCount)
  618. {
  619. array_unshift($this->pageTitles, "[newpage]");
  620. }
  621. /* ok, titles now match pages, rename the titles if needed ... */
  622. $count =0;
  623. foreach($this->pageTitles as $title)
  624. {
  625. $titlep = preg_replace("/\[newpage=(.*?)\]/", "\\1", $title);
  626. $this->pageTitles[$count] = ($titlep == "[newpage]" ? LAN_PAGE_13." ".($count+1) : $tp->toHTML($titlep, TRUE, 'TITLE'));
  627. $count++;
  628. }
  629. $this->pageToRender = $tp->toHTML($pages[$this->pageSelected], TRUE, 'BODY');
  630. $this->title = (substr($this->pageTitles[$this->pageSelected], -1) == ";" ? "" : $this->pageTitles[$this->pageSelected]);
  631. if($this->debug)
  632. {
  633. echo "<b>multipageFlag</b> ".$this->multipageFlag." <br />";
  634. if($this->multipageFlag)
  635. {
  636. echo "<pre>"; print_r($pages); echo "</pre>";
  637. echo "<b>pageCount</b> ".$pageCount." <br />";
  638. echo "<b>titleCount</b> ".$titleCount." <br />";
  639. echo "<pre>"; print_r($this->pageTitles); echo "</pre>";
  640. }
  641. }
  642. e107::getBB()->clearClass();
  643. }
  644. function pageIndex()
  645. {
  646. // Use always nextprev shortcode (with a special default 'page' tempalte)
  647. $titles = implode("|",$this->pageTitles);
  648. $total_items = count($this->pageTitles);
  649. //$parms = $total_items.",1,".$this->pageSelected.",".e_SELF."?".$this->pageID.".[FROM],,$titles";
  650. $row = $this->page;
  651. $row['page'] = '--FROM--';
  652. $url = rawurlencode(e107::getUrl()->create('page/view', $row, 'allow=page_id,page_title,page_sef,page'));
  653. $parms = 'nonavcount&bullet='.rawurlencode($this->bullet.' ').'&caption=<!-- Empty -->&'.'pagetitle='.rawurlencode($titles).'&tmpl_prefix='.deftrue('PAGE_NEXTPREV_TMPL', 'page').'&total='.$total_items.'&amount=1&current='.$this->pageSelected.'&url='.$url;
  654. $itext = ($total_items) ? e107::getParser()->parseTemplate("{NEXTPREV={$parms}}") : "";
  655. return $itext;
  656. }
  657. // FIXME most probably will fail when cache enabled
  658. function pageRating($page_rating_flag)
  659. {
  660. if($page_rating_flag)
  661. {
  662. return "<br /><div style='text-align:right'>".e107::getRate()->render("page", $this->pageID,array('label'=>LAN_PAGE_4))."</div>";
  663. }
  664. // return $rate_text;
  665. }
  666. function pageComment($page_comment_flag)
  667. {
  668. if($page_comment_flag)
  669. {
  670. $cobj = e107::getComment();
  671. if (isset($_POST['commentsubmit']))
  672. {
  673. $cobj->enter_comment($_POST['author_name'], $_POST['comment'], "page", $this->pageID, $pid, $_POST['subject']);
  674. $e107cache = e107::getCache();
  675. $e107cache->clear("comment.page.".$this->pageID);
  676. $e107cache->clear($this->cacheString);
  677. }
  678. return $cobj->compose_comment("page", "comment", $this->pageID, 0, $this->title, false, true);
  679. }
  680. }
  681. function pageCheckPerms($page_class, $page_password, $page_title="&nbsp;")
  682. {
  683. global $ns, $tp, $pref, $HEADER, $FOOTER, $sql; // $tp added - also $pref - used by footer
  684. if (!check_class($page_class))
  685. {
  686. $this->authorized = 'class';
  687. return false;
  688. }
  689. if (!$page_password)
  690. {
  691. $this->authorized = true;
  692. $cookiename = $this->getCookieName();
  693. if(isset($_COOKIE[$cookiename])) cookie($cookiename, '', (time() - 2592000));
  694. return true;
  695. }
  696. if(isset($_POST['submit_page_pw']))
  697. {
  698. if($_POST['page_pw'] == $page_password)
  699. {
  700. $this->setPageCookie();
  701. $this->authorized = true;
  702. return true;
  703. }
  704. else
  705. {
  706. e107::getMessage()->addError(LAN_PAGE_7);
  707. }
  708. }
  709. else
  710. {
  711. // TODO - e_COOKIE
  712. $cookiename = $this->getCookieName();
  713. if(isset($_COOKIE[$cookiename]) && ($_COOKIE[$cookiename] == md5($page_password.USERID)))
  714. {
  715. $this->authorized = true;
  716. return TRUE;
  717. }
  718. // Invalid/empty password here
  719. }
  720. $this->authorized = 'pw';
  721. return false;
  722. }
  723. function getCookieName()
  724. {
  725. return e_COOKIE.'_page_'.$this->pageID;
  726. }
  727. function setPageCookie()
  728. {
  729. if(!$this->pageID || !vartrue($_POST['page_pw'])) return;
  730. $pref = e107::getPref();
  731. $pref['pageCookieExpire'] = max($pref['pageCookieExpire'], 120);
  732. $hash = md5($_POST['page_pw'].USERID);
  733. cookie($this->getCookieName(), $hash, (time() + $pref['pageCookieExpire']));
  734. //header("location:".e_SELF."?".e_QUERY);
  735. //exit;
  736. }
  737. }
  738. ?>