PageRenderTime 63ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/halogy/modules/pages/models/pages_model.php

https://gitlab.com/intelij/Halogy
PHP | 754 lines | 495 code | 147 blank | 112 comment | 53 complexity | 545970717320e6cd411cdecb35036b92 MD5 | raw file
  1. <?php
  2. /**
  3. * Halogy
  4. *
  5. * A user friendly, modular content management system for PHP 5.0
  6. * Built on CodeIgniter - http://codeigniter.com
  7. *
  8. * @package Halogy
  9. * @author Haloweb Ltd
  10. * @copyright Copyright (c) 2012, Haloweb Ltd
  11. * @license http://halogy.com/license
  12. * @link http://halogy.com/
  13. * @since Version 1.0
  14. * @filesource
  15. */
  16. // ------------------------------------------------------------------------
  17. class Pages_model extends CI_Model {
  18. var $siteID;
  19. function __construct()
  20. {
  21. parent::__construct();
  22. $this->table = 'pages';
  23. if (!$this->siteID)
  24. {
  25. $this->siteID = SITEID;
  26. }
  27. }
  28. function get_pages()
  29. {
  30. $this->db->where('pages.siteID', $this->siteID);
  31. $this->db->where('deleted', 0);
  32. // if user has limited access, find those pages
  33. if (!in_array('pages_all', $this->permission->permissions))
  34. {
  35. $this->db->where('groupID', $this->session->userdata('groupID'));
  36. }
  37. // join versions
  38. $this->db->select('pages.*, page_versions.userID', FALSE);
  39. $this->db->join('page_versions', 'pages.draftID = page_versions.versionID', 'left');
  40. $this->db->order_by('pageOrder');
  41. $query = $this->db->get($this->table);
  42. if ($query->num_rows() > 0)
  43. {
  44. return $query->result_array();
  45. }
  46. else
  47. {
  48. return FALSE;
  49. }
  50. }
  51. function get_page_parents()
  52. {
  53. // default where
  54. $this->db->where('pages.siteID', $this->siteID);
  55. $this->db->where('deleted', 0);
  56. // if user has limited access, find those pages
  57. if (!in_array('pages_all', $this->permission->permissions))
  58. {
  59. $this->db->where('groupID', $this->session->userdata('groupID'));
  60. }
  61. // where parent is set
  62. $this->db->where('parentID', 0);
  63. // find out if its modified
  64. $this->db->select(' (SELECT COUNT(*) FROM '.$this->db->dbprefix.'page_blocks WHERE '.$this->db->dbprefix.'page_blocks.versionID = '.$this->db->dbprefix.'pages.draftID AND '.$this->db->dbprefix.'page_blocks.dateCreated > DATE_ADD(dateModified, INTERVAL 5 SECOND)) AS newBlocks', FALSE);
  65. // find out if its modified
  66. $this->db->select(' (SELECT COUNT(*) FROM '.$this->db->dbprefix.'page_versions WHERE '.$this->db->dbprefix.'page_versions.pageID = '.$this->db->dbprefix.'pages.pageID AND '.$this->db->dbprefix.'page_versions.dateCreated > DATE_ADD(datePublished, INTERVAL 5 SECOND)) AS newVersions', FALSE);
  67. // join versions
  68. $this->db->select('pages.*, page_versions.userID', FALSE);
  69. $this->db->join('page_versions', 'pages.draftID = page_versions.versionID', 'left');
  70. $this->db->order_by('pageOrder', 'asc');
  71. $query = $this->db->get('pages');
  72. if ($query->num_rows())
  73. {
  74. return $query->result_array();
  75. }
  76. else
  77. {
  78. return FALSE;
  79. }
  80. }
  81. function get_page_children($pageID = '')
  82. {
  83. // default where
  84. $this->db->where('pages.siteID', $this->siteID);
  85. $this->db->where('deleted', 0);
  86. // if user has limited access, find those pages
  87. if (!in_array('pages_all', $this->permission->permissions))
  88. {
  89. $this->db->where('groupID', $this->session->userdata('groupID'));
  90. }
  91. // get page by ID
  92. $this->db->where('parentID', $pageID);
  93. // find out if its modified
  94. $this->db->select(' (SELECT COUNT(*) FROM '.$this->db->dbprefix.'page_blocks WHERE '.$this->db->dbprefix.'page_blocks.versionID = '.$this->db->dbprefix.'pages.draftID AND '.$this->db->dbprefix.'page_blocks.dateCreated > DATE_ADD(dateModified, INTERVAL 5 SECOND)) AS newBlocks', FALSE);
  95. // find out if its modified
  96. $this->db->select(' (SELECT COUNT(*) FROM '.$this->db->dbprefix.'page_versions WHERE '.$this->db->dbprefix.'page_versions.pageID = '.$this->db->dbprefix.'pages.pageID AND '.$this->db->dbprefix.'page_versions.dateCreated > DATE_ADD(datePublished, INTERVAL 5 SECOND)) AS newVersions', FALSE);
  97. // join versions
  98. $this->db->select('pages.*, page_versions.userID', FALSE);
  99. $this->db->join('page_versions', 'pages.draftID = page_versions.versionID', 'left');
  100. $this->db->order_by('pageOrder', 'asc');
  101. $query = $this->db->get('pages');
  102. if ($query->num_rows())
  103. {
  104. return $query->result_array();
  105. }
  106. else
  107. {
  108. return FALSE;
  109. }
  110. }
  111. function get_page($pageID)
  112. {
  113. $this->db->where('pages.siteID', $this->siteID);
  114. $this->db->where('deleted', 0);
  115. $this->db->where('pages.pageID', $pageID);
  116. // if user has limited access, find those pages
  117. if (!in_array('pages_all', $this->permission->permissions))
  118. {
  119. $this->db->where('groupID', $this->session->userdata('groupID'));
  120. }
  121. // join versions
  122. $this->db->select('pages.*, page_versions.userID', FALSE);
  123. $this->db->join('page_versions', 'pages.draftID = page_versions.versionID', 'left');
  124. $this->db->order_by('pageOrder');
  125. $query = $this->db->get($this->table, 1);
  126. if ($query->num_rows() > 0)
  127. {
  128. return $query->row_array();
  129. }
  130. else
  131. {
  132. return FALSE;
  133. }
  134. }
  135. function get_template($templateID = '')
  136. {
  137. // default where
  138. $this->db->where('t1.siteID', $this->siteID, FALSE);
  139. $this->db->where('t1.deleted', 0, FALSE);
  140. $this->db->where('t1.templateID', $templateID, FALSE);
  141. // select
  142. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  143. // join revisions
  144. $this->db->join('template_versions t2', 't2.versionID = t1 . versionID', 'left');
  145. // get em
  146. $query = $this->db->get('templates t1', 1);
  147. if ($query->num_rows())
  148. {
  149. return $query->row_array();
  150. }
  151. else
  152. {
  153. return FALSE;
  154. }
  155. }
  156. function get_templates($type = '')
  157. {
  158. // default where
  159. $this->db->where('t1.siteID', $this->siteID, FALSE);
  160. $this->db->where('t1.deleted', 0, FALSE);
  161. // don't show modules
  162. if ($type == 'page')
  163. {
  164. $this->db->where('modulePath', '');
  165. }
  166. elseif ($type == 'module')
  167. {
  168. $this->db->where('modulePath !=', '');
  169. }
  170. // select
  171. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  172. // join revisions
  173. $this->db->join('template_versions t2', 't2.versionID = t1 . versionID', 'left');
  174. // order
  175. $this->db->order_by('modulePath', 'asc');
  176. $this->db->order_by('templateName', 'asc');
  177. // get all templates
  178. $query = $this->db->get('templates t1');
  179. if ($query->num_rows())
  180. {
  181. return $query->result_array();
  182. }
  183. else
  184. {
  185. return FALSE;
  186. }
  187. }
  188. function get_template_count($templateID)
  189. {
  190. // count
  191. $this->db->select('COUNT(*) as numPages');
  192. // default where
  193. $this->db->where(array('siteID' => $this->siteID, 'deleted' => 0));
  194. // where
  195. $this->db->where('templateID', $templateID);
  196. $query = $this->db->get('pages');
  197. if ($query->num_rows())
  198. {
  199. $row = $query->row_array();
  200. return $row['numPages'];
  201. }
  202. else
  203. {
  204. return false;
  205. }
  206. }
  207. function get_template_versions($templateID)
  208. {
  209. $this->db->where('objectID', $templateID);
  210. $this->db->order_by('dateCreated', 'desc');
  211. $query = $this->db->get('template_versions', 30);
  212. // get data
  213. if ($query->num_rows())
  214. {
  215. return $query->result_array();
  216. }
  217. else
  218. {
  219. return false;
  220. }
  221. }
  222. function get_include($includeRef = '', $includeID = '')
  223. {
  224. // default where
  225. $this->db->where('t1.siteID', $this->siteID, FALSE);
  226. $this->db->where('t1.deleted', 0, FALSE);
  227. // get by reference
  228. if ($includeRef)
  229. {
  230. $this->db->where('includeRef', $includeRef);
  231. }
  232. // get by ID
  233. elseif ($includeID)
  234. {
  235. $this->db->where('includeID', $includeID);
  236. }
  237. // or fail
  238. else
  239. {
  240. return FALSE;
  241. }
  242. // select
  243. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  244. // join revisions
  245. $this->db->join('include_versions t2', 't2.versionID = t1 . versionID', 'left');
  246. // get em
  247. $query = $this->db->get('includes t1', 1);
  248. if ($query->num_rows())
  249. {
  250. return $query->row_array();
  251. }
  252. else
  253. {
  254. return FALSE;
  255. }
  256. }
  257. function get_includes($type = '')
  258. {
  259. // default where
  260. $this->db->where('t1.siteID', $this->siteID, FALSE);
  261. $this->db->where('t1.deleted', 0, FALSE);
  262. // get by type
  263. if ($type)
  264. {
  265. $this->db->where('type', $type);
  266. }
  267. // select
  268. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  269. // join revisions
  270. $this->db->join('include_versions t2', 't2.versionID = t1 . versionID', 'left');
  271. // order
  272. $this->db->order_by('includeRef', 'asc');
  273. // get all includes
  274. $query = $this->db->get('includes t1');
  275. if ($query->num_rows())
  276. {
  277. return $query->result_array();
  278. }
  279. else
  280. {
  281. return FALSE;
  282. }
  283. }
  284. function get_include_versions($includeID)
  285. {
  286. $this->db->where('objectID', $includeID);
  287. $this->db->order_by('dateCreated', 'desc');
  288. $query = $this->db->get('include_versions', 30);
  289. // get data
  290. if ($query->num_rows())
  291. {
  292. return $query->result_array();
  293. }
  294. else
  295. {
  296. return FALSE;
  297. }
  298. }
  299. function add_temp_page()
  300. {
  301. // create the page
  302. $this->db->set('siteID', $this->siteID);
  303. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  304. $this->db->set('pageName', '');
  305. $this->db->set('deleted', 1);
  306. $this->db->insert('pages');
  307. $pageID = $this->db->insert_id();
  308. // create the draft
  309. $this->core->add_draft($pageID);
  310. return $pageID;
  311. }
  312. function add_page_nav($pageName, $path)
  313. {
  314. // check nav isnt there already
  315. $this->db->where('siteID', $this->siteID);
  316. $this->db->where('deleted', 0);
  317. if ($path == 'home')
  318. {
  319. $this->db->where('(uri = "/" OR uri = "home")');
  320. }
  321. else
  322. {
  323. $this->db->where('uri', $path);
  324. }
  325. $query = $this->db->get('navigation', 1);
  326. // add nav
  327. if (!$query->num_rows())
  328. {
  329. $this->db->set('siteID', $this->siteID);
  330. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  331. $this->db->set('uri', $path);
  332. $this->db->set('navName', $pageName);
  333. $this->db->insert('navigation');
  334. }
  335. return TRUE;
  336. }
  337. function import_template($file, $body)
  338. {
  339. // set flags
  340. $success = FALSE;
  341. $includes = FALSE;
  342. // get file info
  343. $filenames = explode('.', $file);
  344. $filename = substr($file, 0, strpos($file, '.'.end($filenames)));
  345. $extension = end($filenames);
  346. // add html template (and includes)
  347. if ($extension == 'html' || $extension == 'htm')
  348. {
  349. // parse template
  350. $body = preg_replace('/<title>(.*)<\/title>/i', '<title>{page:title}</title>', $body);
  351. $body = preg_replace('/meta name="keywords" content="(.*)"/i', 'meta name="keywords" content="{page:keywords}"', $body);
  352. $body = preg_replace('/meta name="description" content="(.*)"/i', 'meta name="description" content="{page:description}"', $body);
  353. $body = preg_replace('/<!--NAVIGATION-->/i', '{navigation}', $body);
  354. // get template name
  355. $templateName = url_title(trim(ucfirst($filename)));
  356. // see if template is a module
  357. $module = (in_array(strtolower($templateName), $this->template->moduleTemplates)) ? strtolower($templateName) : false;
  358. // get theme name
  359. $theme = '';
  360. $themeRef = '';
  361. if (preg_match('/meta name="theme" content="(.*)"|meta content="(.*)" name="theme"/i', $body, $matches))
  362. {
  363. $theme = substr(trim($matches[1]), 0, 15);
  364. $themeRef = url_title(trim(strtolower($theme))).'-';
  365. }
  366. // find out if header is in there
  367. if (preg_match('/<!--CONTENT-->/i', $body))
  368. {
  369. $split = preg_split('/<!--CONTENT-->/i', $body);
  370. $header = preg_replace('/<!--CONTENT-->/i', '', $split[0]);
  371. $content = $split[1];
  372. // get file name
  373. $includeRef = $themeRef.'header';
  374. $this->add_include($includeRef, $header, 'H');
  375. $includes = TRUE;
  376. }
  377. // find out if footer is in there
  378. if (preg_match('/<!--ENDCONTENT-->/i', $body))
  379. {
  380. $split = preg_split('/<!--ENDCONTENT-->/i', $body);
  381. $footer = $split[1];
  382. // remove footer from content
  383. $content = str_replace($footer, '', $content);
  384. $content = preg_replace('/<!--ENDCONTENT-->/i', '', $content);
  385. // get file name
  386. $includeRef = $themeRef.'footer';
  387. $this->add_include($includeRef, $footer, 'H');
  388. $includes = TRUE;
  389. }
  390. // put the header and footer tags in
  391. if ($includes)
  392. {
  393. $content = "{include:".$themeRef."header}\n\n$content\n\n{include:".$themeRef."footer}";
  394. }
  395. // otherwise just set the template content
  396. else
  397. {
  398. $content = $body;
  399. }
  400. // look for blocks
  401. preg_match_all('/<!--BLOCK-->/i', $content, $matches);
  402. for ($x=0; $x<sizeof($matches[0]); $x++)
  403. {
  404. $content = preg_replace('/<!--BLOCK-->/i', '{block'.($x+1).'}', $content, 1);
  405. }
  406. // get file name
  407. $templateName = ($theme) ? '['.$theme.'] '.$templateName : $templateName;
  408. $templateID = $this->add_template($templateName, $content, $module);
  409. }
  410. // add css file
  411. elseif ($extension == 'css')
  412. {
  413. // get file name
  414. $includeRef = $filename.'.css';
  415. $this->add_include($includeRef, $body, 'C');
  416. }
  417. // add js file
  418. elseif ($extension == 'js')
  419. {
  420. // get file name
  421. $includeRef = $filename.'.js';
  422. $this->add_include($includeRef, $body, 'J');
  423. }
  424. return (@$templateID) ? $templateID : TRUE;
  425. }
  426. function add_template($templateName, $body, $module = '')
  427. {
  428. // find out if template exists
  429. $this->db->where('siteID', $this->siteID);
  430. $this->db->where('deleted', 0);
  431. if ($module)
  432. {
  433. $this->db->where('modulePath', $module);
  434. }
  435. else
  436. {
  437. $this->db->where('templateName', $templateName);
  438. $this->db->where('modulePath', '');
  439. }
  440. $query = $this->db->get('templates', 1);
  441. // add template version
  442. if ($query->num_rows())
  443. {
  444. $row = $query->row_array();
  445. $templateID = $row['templateID'];
  446. // add template version
  447. $versionID = $this->add_template_version($templateID, $body);
  448. }
  449. // add template
  450. else
  451. {
  452. $this->db->set('siteID', $this->siteID);
  453. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  454. $this->db->set('templateName', $templateName);
  455. if ($module)
  456. {
  457. $this->db->set('modulePath', $module);
  458. }
  459. $this->db->insert('templates');
  460. $templateID = $this->db->insert_id();
  461. // add template version
  462. $versionID = $this->add_template_version($templateID, $body);
  463. }
  464. return $templateID;
  465. }
  466. function add_template_version($templateID, $body = '')
  467. {
  468. // set body
  469. $body = ($this->input->post('body')) ? $this->input->post('body') : $body;
  470. // filter body
  471. $body = htmlentities(iconv('UTF-8', 'UTF-8//IGNORE', $body), NULL, 'UTF-8');
  472. $body = html_entity_decode($body, NULL, 'UTF-8');
  473. // check page
  474. if (!$data = $this->get_template($templateID))
  475. {
  476. return FALSE;
  477. }
  478. // check version is not the same as latest one
  479. if ($versions = $this->get_template_versions($templateID))
  480. {
  481. if ($versions[0]['body'] == $body)
  482. {
  483. return FALSE;
  484. }
  485. }
  486. // check version is not the same as current one
  487. if ($data['body'] == $body)
  488. {
  489. return FALSE;
  490. }
  491. // add version
  492. $this->db->set('objectID', $templateID);
  493. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  494. $this->db->set('userID', $this->session->userdata('userID'));
  495. $this->db->set('body', $body);
  496. $this->db->set('siteID', $this->siteID);
  497. $this->db->insert('template_versions');
  498. // get version ID
  499. $versionID = $this->db->insert_id();
  500. // update page draft
  501. $this->db->set('versionID', $versionID);
  502. $this->db->where('siteID', $this->siteID);
  503. $this->db->where('templateID', $templateID);
  504. $this->db->update('templates');
  505. return $versionID;
  506. }
  507. function revert_template($templateID, $versionID)
  508. {
  509. // update the template with version
  510. $this->db->set('versionID', $versionID);
  511. $this->db->where('templateID', $templateID);
  512. $this->db->update('templates');
  513. return TRUE;
  514. }
  515. function add_include($includeRef, $body, $type, $siteID = TRUE)
  516. {
  517. // find out if include exists
  518. if ($siteID)
  519. {
  520. $this->db->where('siteID', $this->siteID);
  521. }
  522. $this->db->where('deleted', 0);
  523. $this->db->where('includeRef', $includeRef);
  524. $query = $this->db->get('includes', 1);
  525. // add include version
  526. if ($query->num_rows())
  527. {
  528. $row = $query->row_array();
  529. // add template version
  530. $versionID = $this->add_include_version($row['includeID'], $body);
  531. }
  532. // add include
  533. else
  534. {
  535. if ($siteID)
  536. {
  537. $this->db->set('siteID', $this->siteID);
  538. }
  539. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  540. $this->db->set('includeRef', $includeRef);
  541. $this->db->set('type', $type);
  542. $this->db->insert('includes');
  543. $includeID = $this->db->insert_id();
  544. // add template version
  545. $versionID = $this->add_include_version($includeID, $body);
  546. }
  547. return TRUE;
  548. }
  549. function add_include_version($includeID, $body = '')
  550. {
  551. // set body
  552. $body = ($this->input->post('body')) ? $this->input->post('body') : $body;
  553. // filter body
  554. $body = htmlentities($body, NULL, 'UTF-8');
  555. $body = html_entity_decode($body, NULL, 'UTF-8');
  556. // check page
  557. if (!$data = $this->get_include(NULL, $includeID))
  558. {
  559. return FALSE;
  560. }
  561. // check version is not the same as latest one
  562. if ($versions = $this->get_include_versions($includeID))
  563. {
  564. if ($versions[0]['body'] == $body)
  565. {
  566. return FALSE;
  567. }
  568. }
  569. // check version is not the same as current one
  570. if ($data['body'] == $body)
  571. {
  572. return FALSE;
  573. }
  574. // add version
  575. $this->db->set('objectID', $includeID);
  576. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  577. $this->db->set('userID', $this->session->userdata('userID'));
  578. $this->db->set('body', $body);
  579. $this->db->set('siteID', $this->siteID);
  580. $this->db->insert('include_versions');
  581. // get version ID
  582. $versionID = $this->db->insert_id();
  583. // update page draft
  584. $this->db->set('versionID', $versionID);
  585. $this->db->where('siteID', $this->siteID);
  586. $this->db->where('includeID', $includeID);
  587. $this->db->update('includes');
  588. return $versionID;
  589. }
  590. function revert_include($includeID, $versionID)
  591. {
  592. // update the include with version
  593. $this->db->set('versionID', $versionID);
  594. $this->db->where('includeID', $includeID);
  595. $this->db->update('includes');
  596. return TRUE;
  597. }
  598. function update_children($pageID)
  599. {
  600. // update page draft
  601. $this->db->set('parentID', 0);
  602. $this->db->where('siteID', $this->siteID);
  603. $this->db->where('parentID', $pageID);
  604. $this->db->update('pages');
  605. return TRUE;
  606. }
  607. }