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

https://bitbucket.org/haloweb/halogy-1.0/ · PHP · 724 lines · 473 code · 141 blank · 110 comment · 51 complexity · a7b53db8d5b4f0c3e161486aaedf0d02 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) 2008-2011, 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 Model {
  18. var $siteID;
  19. function Pages_model()
  20. {
  21. parent::Model();
  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 > dateModified) 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 > datePublished) 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 > dateModified) 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 > datePublished) 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_template($templateID = '')
  112. {
  113. // default where
  114. $this->db->where('t1.siteID', $this->siteID, FALSE);
  115. $this->db->where('t1.deleted', 0, FALSE);
  116. $this->db->where('t1.templateID', $templateID, FALSE);
  117. // select
  118. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  119. // join revisions
  120. $this->db->join('template_versions t2', 't2.versionID = t1 . versionID', 'left');
  121. // get em
  122. $query = $this->db->get('templates t1', 1);
  123. if ($query->num_rows())
  124. {
  125. return $query->row_array();
  126. }
  127. else
  128. {
  129. return FALSE;
  130. }
  131. }
  132. function get_templates($type = '')
  133. {
  134. // default where
  135. $this->db->where('t1.siteID', $this->siteID, FALSE);
  136. $this->db->where('t1.deleted', 0, FALSE);
  137. // don't show modules
  138. if ($type == 'page')
  139. {
  140. $this->db->where('modulePath', '');
  141. }
  142. elseif ($type == 'module')
  143. {
  144. $this->db->where('modulePath !=', '');
  145. }
  146. // select
  147. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  148. // join revisions
  149. $this->db->join('template_versions t2', 't2.versionID = t1 . versionID', 'left');
  150. // order
  151. $this->db->order_by('modulePath', 'asc');
  152. $this->db->order_by('templateName', 'asc');
  153. // get all templates
  154. $query = $this->db->get('templates t1');
  155. if ($query->num_rows())
  156. {
  157. return $query->result_array();
  158. }
  159. else
  160. {
  161. return FALSE;
  162. }
  163. }
  164. function get_template_count($templateID)
  165. {
  166. // count
  167. $this->db->select('COUNT(*) as numPages');
  168. // default where
  169. $this->db->where(array('siteID' => $this->siteID, 'deleted' => 0));
  170. // where
  171. $this->db->where('templateID', $templateID);
  172. $query = $this->db->get('pages');
  173. if ($query->num_rows())
  174. {
  175. $row = $query->row_array();
  176. return $row['numPages'];
  177. }
  178. else
  179. {
  180. return false;
  181. }
  182. }
  183. function get_template_versions($templateID)
  184. {
  185. $this->db->where('objectID', $templateID);
  186. $this->db->order_by('dateCreated', 'desc');
  187. $query = $this->db->get('template_versions', 30);
  188. // get data
  189. if ($query->num_rows())
  190. {
  191. return $query->result_array();
  192. }
  193. else
  194. {
  195. return false;
  196. }
  197. }
  198. function get_include($includeRef = '', $includeID = '')
  199. {
  200. // default where
  201. $this->db->where('t1.siteID', $this->siteID, FALSE);
  202. $this->db->where('t1.deleted', 0, FALSE);
  203. // get by reference
  204. if ($includeRef)
  205. {
  206. $this->db->where('includeRef', $includeRef);
  207. }
  208. // get by ID
  209. elseif ($includeID)
  210. {
  211. $this->db->where('includeID', $includeID);
  212. }
  213. // or fail
  214. else
  215. {
  216. return FALSE;
  217. }
  218. // select
  219. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  220. // join revisions
  221. $this->db->join('include_versions t2', 't2.versionID = t1 . versionID', 'left');
  222. // get em
  223. $query = $this->db->get('includes t1', 1);
  224. if ($query->num_rows())
  225. {
  226. return $query->row_array();
  227. }
  228. else
  229. {
  230. return FALSE;
  231. }
  232. }
  233. function get_includes($type = '')
  234. {
  235. // default where
  236. $this->db->where('t1.siteID', $this->siteID, FALSE);
  237. $this->db->where('t1.deleted', 0, FALSE);
  238. // get by type
  239. if ($type)
  240. {
  241. $this->db->where('type', $type);
  242. }
  243. // select
  244. $this->db->select('t1.*, t2.body, t2.dateCreated, t2.userID');
  245. // join revisions
  246. $this->db->join('include_versions t2', 't2.versionID = t1 . versionID', 'left');
  247. // order
  248. $this->db->order_by('includeRef', 'asc');
  249. // get all includes
  250. $query = $this->db->get('includes t1');
  251. if ($query->num_rows())
  252. {
  253. return $query->result_array();
  254. }
  255. else
  256. {
  257. return FALSE;
  258. }
  259. }
  260. function get_include_versions($includeID)
  261. {
  262. $this->db->where('objectID', $includeID);
  263. $this->db->order_by('dateCreated', 'desc');
  264. $query = $this->db->get('include_versions', 30);
  265. // get data
  266. if ($query->num_rows())
  267. {
  268. return $query->result_array();
  269. }
  270. else
  271. {
  272. return FALSE;
  273. }
  274. }
  275. function add_temp_page()
  276. {
  277. // create the page
  278. $this->db->set('siteID', $this->siteID);
  279. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  280. $this->db->set('pageName', '');
  281. $this->db->set('deleted', 1);
  282. $this->db->insert('pages');
  283. $pageID = $this->db->insert_id();
  284. // create the draft
  285. $this->core->add_draft($pageID);
  286. return $pageID;
  287. }
  288. function add_page_nav($pageName, $path)
  289. {
  290. // check nav isnt there already
  291. $this->db->where('siteID', $this->siteID);
  292. $this->db->where('deleted', 0);
  293. if ($path == 'home')
  294. {
  295. $this->db->where('(uri = "/" OR uri = "home")');
  296. }
  297. else
  298. {
  299. $this->db->where('uri', $path);
  300. }
  301. $query = $this->db->get('navigation', 1);
  302. // add nav
  303. if (!$query->num_rows())
  304. {
  305. $this->db->set('siteID', $this->siteID);
  306. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  307. $this->db->set('uri', $path);
  308. $this->db->set('navName', $pageName);
  309. $this->db->insert('navigation');
  310. }
  311. return TRUE;
  312. }
  313. function import_template($file, $body)
  314. {
  315. // set flags
  316. $success = FALSE;
  317. $includes = FALSE;
  318. // get file info
  319. $filenames = explode('.', $file);
  320. $filename = substr($file, 0, strpos($file, '.'.end($filenames)));
  321. $extension = end($filenames);
  322. // add html template (and includes)
  323. if ($extension == 'html' || $extension == 'htm')
  324. {
  325. // parse template
  326. $body = preg_replace('/<title>(.*)<\/title>/i', '<title>{page:title}</title>', $body);
  327. $body = preg_replace('/meta name="keywords" content="(.*)"/i', 'meta name="keywords" content="{page:keywords}"', $body);
  328. $body = preg_replace('/meta name="description" content="(.*)"/i', 'meta name="description" content="{page:description}"', $body);
  329. $body = preg_replace('/<!--NAVIGATION-->/i', '{navigation}', $body);
  330. // get template name
  331. $templateName = url_title(trim(ucfirst($filename)));
  332. // see if template is a module
  333. $module = (in_array(strtolower($templateName), $this->template->moduleTemplates)) ? strtolower($templateName) : false;
  334. // get theme name
  335. $theme = '';
  336. $themeRef = '';
  337. if (preg_match('/meta name="theme" content="(.*)"|meta content="(.*)" name="theme"/i', $body, $matches))
  338. {
  339. $theme = substr(trim($matches[1]), 0, 15);
  340. $themeRef = url_title(trim(strtolower($theme))).'-';
  341. }
  342. // find out if header is in there
  343. if (preg_match('/<!--CONTENT-->/i', $body))
  344. {
  345. $split = preg_split('/<!--CONTENT-->/i', $body);
  346. $header = preg_replace('/<!--CONTENT-->/i', '', $split[0]);
  347. $content = $split[1];
  348. // get file name
  349. $includeRef = $themeRef.'header';
  350. $this->add_include($includeRef, $header, 'H');
  351. $includes = TRUE;
  352. }
  353. // find out if footer is in there
  354. if (preg_match('/<!--ENDCONTENT-->/i', $body))
  355. {
  356. $split = preg_split('/<!--ENDCONTENT-->/i', $body);
  357. $footer = $split[1];
  358. // remove footer from content
  359. $content = str_replace($footer, '', $content);
  360. $content = preg_replace('/<!--ENDCONTENT-->/i', '', $content);
  361. // get file name
  362. $includeRef = $themeRef.'footer';
  363. $this->add_include($includeRef, $footer, 'H');
  364. $includes = TRUE;
  365. }
  366. // put the header and footer tags in
  367. if ($includes)
  368. {
  369. $content = "{include:".$themeRef."header}\n\n$content\n\n{include:".$themeRef."footer}";
  370. }
  371. // otherwise just set the template content
  372. else
  373. {
  374. $content = $body;
  375. }
  376. // look for blocks
  377. preg_match_all('/<!--BLOCK-->/i', $content, $matches);
  378. for ($x=0; $x<sizeof($matches[0]); $x++)
  379. {
  380. $content = preg_replace('/<!--BLOCK-->/i', '{block'.($x+1).'}', $content, 1);
  381. }
  382. // get file name
  383. $templateName = ($theme) ? '['.$theme.'] '.$templateName : $templateName;
  384. $templateID = $this->add_template($templateName, $content, $module);
  385. }
  386. // add css file
  387. elseif ($extension == 'css')
  388. {
  389. // get file name
  390. $includeRef = $filename.'.css';
  391. $this->add_include($includeRef, $body, 'C');
  392. }
  393. // add js file
  394. elseif ($extension == 'js')
  395. {
  396. // get file name
  397. $includeRef = $filename.'.js';
  398. $this->add_include($includeRef, $body, 'J');
  399. }
  400. return (@$templateID) ? $templateID : TRUE;
  401. }
  402. function add_template($templateName, $body, $module = '')
  403. {
  404. // find out if template exists
  405. $this->db->where('siteID', $this->siteID);
  406. $this->db->where('deleted', 0);
  407. if ($module)
  408. {
  409. $this->db->where('modulePath', $module);
  410. }
  411. else
  412. {
  413. $this->db->where('templateName', $templateName);
  414. $this->db->where('modulePath', '');
  415. }
  416. $query = $this->db->get('templates', 1);
  417. // add template version
  418. if ($query->num_rows())
  419. {
  420. $row = $query->row_array();
  421. $templateID = $row['templateID'];
  422. // add template version
  423. $versionID = $this->add_template_version($templateID, $body);
  424. }
  425. // add template
  426. else
  427. {
  428. $this->db->set('siteID', $this->siteID);
  429. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  430. $this->db->set('templateName', $templateName);
  431. if ($module)
  432. {
  433. $this->db->set('modulePath', $module);
  434. }
  435. $this->db->insert('templates');
  436. $templateID = $this->db->insert_id();
  437. // add template version
  438. $versionID = $this->add_template_version($templateID, $body);
  439. }
  440. return $templateID;
  441. }
  442. function add_template_version($templateID, $body = '')
  443. {
  444. // set body
  445. $body = ($this->input->post('body')) ? $this->input->post('body') : $body;
  446. // filter body
  447. $body = htmlentities(iconv('UTF-8', 'UTF-8//IGNORE', $body), NULL, 'UTF-8');
  448. $body = html_entity_decode($body, NULL, 'UTF-8');
  449. // check page
  450. if (!$data = $this->get_template($templateID))
  451. {
  452. return FALSE;
  453. }
  454. // check version is not the same as latest one
  455. if ($versions = $this->get_template_versions($templateID))
  456. {
  457. if ($versions[0]['body'] == $body)
  458. {
  459. return FALSE;
  460. }
  461. }
  462. // check version is not the same as current one
  463. if ($data['body'] == $body)
  464. {
  465. return FALSE;
  466. }
  467. // add version
  468. $this->db->set('objectID', $templateID);
  469. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  470. $this->db->set('userID', $this->session->userdata('userID'));
  471. $this->db->set('body', $body);
  472. $this->db->set('siteID', $this->siteID);
  473. $this->db->insert('template_versions');
  474. // get version ID
  475. $versionID = $this->db->insert_id();
  476. // update page draft
  477. $this->db->set('versionID', $versionID);
  478. $this->db->where('siteID', $this->siteID);
  479. $this->db->where('templateID', $templateID);
  480. $this->db->update('templates');
  481. return $versionID;
  482. }
  483. function revert_template($templateID, $versionID)
  484. {
  485. // update the template with version
  486. $this->db->set('versionID', $versionID);
  487. $this->db->where('templateID', $templateID);
  488. $this->db->update('templates');
  489. return TRUE;
  490. }
  491. function add_include($includeRef, $body, $type, $siteID = TRUE)
  492. {
  493. // find out if include exists
  494. if ($siteID)
  495. {
  496. $this->db->where('siteID', $this->siteID);
  497. }
  498. $this->db->where('deleted', 0);
  499. $this->db->where('includeRef', $includeRef);
  500. $query = $this->db->get('includes', 1);
  501. // add include version
  502. if ($query->num_rows())
  503. {
  504. $row = $query->row_array();
  505. // add template version
  506. $versionID = $this->add_include_version($row['includeID'], $body);
  507. }
  508. // add include
  509. else
  510. {
  511. if ($siteID)
  512. {
  513. $this->db->set('siteID', $this->siteID);
  514. }
  515. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  516. $this->db->set('includeRef', $includeRef);
  517. $this->db->set('type', $type);
  518. $this->db->insert('includes');
  519. $includeID = $this->db->insert_id();
  520. // add template version
  521. $versionID = $this->add_include_version($includeID, $body);
  522. }
  523. return TRUE;
  524. }
  525. function add_include_version($includeID, $body = '')
  526. {
  527. // set body
  528. $body = ($this->input->post('body')) ? $this->input->post('body') : $body;
  529. // filter body
  530. $body = htmlentities($body, NULL, 'UTF-8');
  531. $body = html_entity_decode($body, NULL, 'UTF-8');
  532. // check page
  533. if (!$data = $this->get_include(NULL, $includeID))
  534. {
  535. return FALSE;
  536. }
  537. // check version is not the same as latest one
  538. if ($versions = $this->get_include_versions($includeID))
  539. {
  540. if ($versions[0]['body'] == $body)
  541. {
  542. return FALSE;
  543. }
  544. }
  545. // check version is not the same as current one
  546. if ($data['body'] == $body)
  547. {
  548. return FALSE;
  549. }
  550. // add version
  551. $this->db->set('objectID', $includeID);
  552. $this->db->set('dateCreated', date("Y-m-d H:i:s"));
  553. $this->db->set('userID', $this->session->userdata('userID'));
  554. $this->db->set('body', $body);
  555. $this->db->set('siteID', $this->siteID);
  556. $this->db->insert('include_versions');
  557. // get version ID
  558. $versionID = $this->db->insert_id();
  559. // update page draft
  560. $this->db->set('versionID', $versionID);
  561. $this->db->where('siteID', $this->siteID);
  562. $this->db->where('includeID', $includeID);
  563. $this->db->update('includes');
  564. return $versionID;
  565. }
  566. function revert_include($includeID, $versionID)
  567. {
  568. // update the include with version
  569. $this->db->set('versionID', $versionID);
  570. $this->db->where('includeID', $includeID);
  571. $this->db->update('includes');
  572. return TRUE;
  573. }
  574. function update_children($pageID)
  575. {
  576. // update page draft
  577. $this->db->set('parentID', 0);
  578. $this->db->where('siteID', $this->siteID);
  579. $this->db->where('parentID', $pageID);
  580. $this->db->update('pages');
  581. return TRUE;
  582. }
  583. }