3 * Table Definition for cms_page
5 class_exists('DB_DataObject') ? '' : require_once 'DB/DataObject.php';
7 class Pman_Cms_DataObjects_Cms_page extends DB_DataObject
10 /* the code below is auto generated do not remove the above tag */
12 public $__table = 'cms_page'; // table name
13 public $id; // int(11) not_null primary_key auto_increment
14 public $title; // string(200) multiple_key
15 public $published; // datetime(19) binary
16 public $body; // blob(-1) blob
18 public $comments_no; // int(11)
19 public $trackbacks_no; // int(11)
20 public $extended; // blob(-1) blob
21 public $has_extended; // int(1)
22 public $author_id; // int(11)
23 public $category_id; // int(11)
24 public $updated; // datetime(19) not_null binary
25 public $created; // datetime(19) not_null binary
26 public $to_replace_id; // int(11)
27 public $page_link; // string(128) not_null
28 public $parent_id; // int(11)
29 public $keywords; // int(11)
30 public $descriptions; // int(11)
31 public $language; // int(11)
32 public $menu_page_id; // int(11)
34 public $in_rss; // int(1) not_null
35 public $is_draft; // int(1)
36 public $is_attachment; // int(1)
37 public $is_element; // int(1)
41 public $template_id; // int(11)
42 public $element_id; // int(11)
44 public $translation_of_id; //int(11)
45 public $is_system_page; //int(2)
46 public $is_static; //int(2)
49 /* the code above is auto generated do not remove the tag below */
52 function setFromRoo($ar)
54 // replace the links in contents
55 $ret = parent::setFrom($ar);
56 $ff = HTML_FlexyFramework::get();
57 if (empty($this->author_id)) {
58 $this->author_id = $ff->page->authUser->id;
64 function applyFilters($q, $au, $roo)
66 if(!empty($q['_dump_pages'])){
67 $this->dump_pages($q, $au, $roo);
70 if(!empty($q['_stylesheets'])){
71 $this->stylesheets($roo);
74 if(!empty($q['_list_elements'])){
75 $this->applyFilterTemplateElements($q, $au, $roo);
78 if (!empty($q['_preview'])) {
79 $roo->sessionState(0);
80 if (!$this->get($q['_preview'])) {
81 $roo->jerr("invalid page");
83 return $this->preview($roo);
86 $tn = $this->tableName();
88 if (!empty($q['_update_old'])) {
90 foreach($t->fetchAll() as $t) {
96 // default is to hide deleted entries... (we show deleted and not-deleted if _show_Deleted is set.)
97 if (empty($q['_show_deleted'])) {
98 $this->is_deleted = 0 ;
101 if (isset($q['search'])) {
102 if(!empty($q['search']['name'])){
103 $s = $this->escape($q['search']['name']);
104 $this->whereAdd("{$tn}.page_link like '%$s%' OR {$tn}.title like '%$s%' ");
107 // if(!empty($q['search']['category'])){
108 // $category_id = (int)$q['search']['category'];
109 // $this->whereAdd("{$tn}.category_type_id = {$category_id}");
112 if (!empty($q['search']['page_link_no_empty'])) {
113 $this->whereAdd("{$tn}.page_link != ''");
118 $this->_extra_cols = array('language_name');
119 $this->selectAdd("i18n_translate('l' , {$tn}.language, 'en') as language_name");
121 if(!empty($q['translation_of_id'])){
122 $this->whereAdd("{$tn}.translation_of_id > 0");
127 //do the select option if page == element
128 if(!empty($q['_page_type_id'])){
130 $this->build_tree_sequence($q['_page_type_id']);
132 //$eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element');
133 // $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
134 // $mid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu');
136 $this->page_type_id = $q['_page_type_id'];
138 // show all pages, not just top level?
139 // technically elements with missing parents might need something like this?
140 //if(in_array($q['_page_type_id'], array($pid, $mid))){
141 // $this->parent_id = 0;
145 if(!empty($q['_category_id'])){
146 $cms_page_category = DB_DataObject::factory('cms_page_category');
147 $cms_page_category->setFrom(array(
148 'category_id' => $q['_category_id']
151 $page_ids = $cms_page_category->fetchAll('page_id');
153 $this->whereAddIn('cms_page.id', $page_ids, 'int');
156 if(!empty($q['_with_primary_image'])){
164 Images.ontable = 'cms_page'
166 Images.onid = cms_page.id
168 Images.displayorder ASC
170 ) AS primary_image_id
174 if(!empty($q['_page_type'])){
175 $core_enum = DB_DataObject::factory('core_enum');
176 $core_enum->setFrom(array(
177 'etype' => 'cms_page_type'
179 $core_enum->whereAddIn('name', array_unique(array_filter(explode(',', $q['_page_type']))), 'string');
181 $this->whereAddIn('cms_page.page_type_id', $core_enum->fetchAll('id'), 'int');
184 if(!empty($q['_with_fullpath'])){
186 (SELECT cms_page_fullpath(cms_page.id, '/')) AS fullpath,
187 (SELECT cms_page_fullpath(cms_page.id, ' - ')) AS display_fullpath
191 if(!empty($q['_with_translation_type'])){
195 GROUP_CONCAT(cp.language SEPARATOR ',')
199 cp.translation_of_id = cms_page.id
200 ) AS translation_type
204 $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
206 if(!empty($q['_page_type_id']) && $q['_page_type_id'] == $pid) {
217 cp.parent_id = cms_page.id
221 cms_template_element.id
225 cms_template_element.template_id = cms_page.template_id
229 (SELECT core_enum_id_by_name('cms_page_type', 'element')) AS element_page_type_id,
233 COUNT(cms_template_element.id)
237 cms_template_element.template_id = cms_page.template_id
238 ) AS has_child_element_type
248 $p = DB_DataObject::Factory('core_person');
249 $p->get($this->author_id);
255 $au = $this->author();
256 return $au->company();
259 var $company = false;
260 function loadCompany()
262 $this->company = $this->company();
265 var $companyPage = false;
268 * assigns companypage
269 * - this is very project specific... (it's used on RIS)
270 * - we should think of a better way to handle this
275 function loadCompanyPage($lang = 'en')
278 if ($this->parent_id && !empty($this->language) && $this->language !='en') {
279 $pg = DB_DataObject::factory("cms_page");
280 $pg->get($this->parent_id);
284 $company = $pg->company();
285 $companyPar = DB_DataObject::factory("cms_page");
286 $companyPar->get('page_link', 'companies');
288 $companyEntry = DB_DataObject::factory("cms_page");
289 $companyEntry->parent_id = $companyPar->pid();
291 if ($companyEntry->get('page_link', $company->name)) {
292 $this->companyPage = $companyEntry;
295 $others = DB_DataObject::factory("cms_page");
296 $others->parent_id = $companyEntry->id;
297 $others->language = $lang;
298 if ($others->find(true)) {
299 $this->companyPage = $others;
308 function published($format)
310 return date($format,strtotime($this->published));
313 function link($field, $set_args = array()) { return $this->URL(); }
319 $ff = HTML_FlexyFramework::get();
321 if ($this->is_attachment) {
322 $f = $this->firstImage('%');
326 if(empty($this->page_link) && !empty($this->menu_page_id)){
327 $link = DB_DataObject::factory('cms_page');
328 if($link->get($this->menu_page_id)){
333 if(!empty($this->target_url)){
334 return ($this->target_url[0] == '/') ? ($ff->page->baseURL . $this->target_url) : ($ff->page->baseURL . '/' . $this->target_url);
337 $x = explode('/',$this->page_link);
338 if (!empty($ff->Pman_Cms['view_name'])) {
340 $d = array_shift($x);
342 // check domains match!
345 return $ff->page->baseURL;
349 return $ff->page->baseURL . '/' . implode('/', $x);
352 function bodyToDisplayHtml()
354 return ($this->body) ? $this->hashLinksToHtml($this->body) : '';
357 function extendedToDisplayHtml()
359 return ($this->extended) ? $this->hashLinksToHtml($this->extended) : '';
362 function pageLinkToClass() // conver the page_link into a string that can be used as a css class
364 return preg_replace('/[^a-z0-9]+/i','-', $this->page_link);
368 function hashLinksToHtml($str)
370 // for reference on children..
371 $images = DB_DataObject::factory('Images');
372 $ff = HTML_FlexyFramework::get();
374 $all_images = $images->gather($this);
376 foreach($all_images as $i) {
378 $imap[$i->title] = $i;
383 libxml_use_internal_errors (true);
384 $doc = new DOMDocument('1.0', 'utf-8');;
386 if (version_compare(PHP_VERSION, '5.3.6') >= 0) {
388 $doc->loadHTML('<?xml encoding="UTF-8"><div id="pman-cms-page-wrapper">' . $str.'</div>');
390 $doc->loadHTML( trim($str));
392 libxml_use_internal_errors (false);
393 $xpath = new DOMXpath($doc);
394 foreach ($xpath->query('//a[@href]') as $a) {
395 $href = $a->getAttribute('href');
399 if (preg_match("/#attachment-(.*)$/", $href, $matches)) {
400 //var_Dump($matches[1]);
401 if (isset($imap[$matches[1]])) {
402 $a->setAttribute('href', $imap[$matches[1]]->URL(-1,'/Images'));
407 if (preg_match("/#attachment$/", $href)) {
409 $a->setAttribute('href', $all_images[0]->URL(-1,'/Images'));
413 if (preg_match("/#page-(.*)$/", $href)) {
415 // find the page.. then ask the page provider to delivery the page.
416 $pg = DB_DataObject::factory($this->tableName());
418 $lk = preg_replace("/^#page-/", '', $href);
419 if (!$pg->get('page_link', $lk)) {
420 $a->setAttribute('href', "#page-not-found-". $lk);
423 if (method_exists($ff->page,'pageToURL')) {
424 $a->setAttribute('href', $ff->page->pageToURL($pg));
427 // finally use the old standard way of doing it..
428 $a->setAttribute('href', preg_replace('/#page-/', "{$ff->page->baseURL}/", $href));
434 foreach ($xpath->query('//img[@src]') as $a) {
435 $src = $a->getAttribute('src');
438 if (!preg_match("/#attachment-(.*)$/", $src, $matches)) {
441 if (!preg_match("/#image-(.*)$/", $src, $matches)) {
446 // valid attachment. (we do not support globalized attachments yet...)
447 if (!isset($imap[$matches[1]])) {
450 $width = $a->hasAttribute('width') ? ((int)$a->getAttribute('width')) : false;
451 $height= $a->hasAttribute('height') ? ((int)$a->getAttribute('height')) : false;
452 // convert into scaled...
454 case ($width === false && $height == false):
455 $a->setAttribute('src', $imap[$matches[1]]->URL(-1,'/Images'));
458 case ($width === false || $height === false):
459 // should result in Wx0 or 0xH ????
460 $width = $width ? $width : '';
461 $height = $height ? $height : '';
462 // conteinue through..
464 case ($width !== false && $height !== false):
465 // make sure it will exist..
467 $fc = $imap[$matches[1]]->toFileConvert();
468 $res = $fc->convert($fc->mimetype, $width, $height);
469 //var_dump(array($width, $height, $res));
472 $a->setAttribute('src', $imap[$matches[1]]->URL("{$width}x{$height}",'/Images/Thumb'));
480 if (version_compare(PHP_VERSION, '5.3.6') >= 0) {
481 $wrap = $doc->getElementById('pman-cms-page-wrapper');
484 for ($i = 0; $i < $wrap->childNodes->length; $i++) {
485 /** @var $domElement \DOMElement */
487 $html .= $doc->saveHTML($wrap->childNodes->item($i));
490 $html = preg_replace(
491 '/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''),
493 $html = preg_replace('/<p>\s*<\/p>/i', "<p></p>", $html);
494 $html = preg_replace('/<\/p>\s*<p>/i', "</p><p>", $html);
496 $html = preg_replace('/^\s*<p>\s*<\/p>+/i', "", $html);
497 $html = preg_replace('/^<p><p/i', "<p", trim($html));
498 $html = preg_replace('/^<p><p/i', "<p", trim($html));
500 $html = preg_replace('/<p>\s*<\/p>\s*+$/i', "", $html);
501 $html = preg_replace('/<\/p><\/p>$/i', "</p>", trim($html));
504 //$bodys = $doc->getElementsByTagName('BODY');
511 function logReferrer($referer)
513 //DB_DataObject::debugLevel(1);
514 if (!strlen(trim($referer))) {
517 $url = parse_url($referer);
518 if ( empty($url['host']) ||
519 ($url['host'] == $_SERVER['HTTP_HOST']) ||
520 preg_match('#^[0-9\.]+$#',$url['host'])
528 // locate previous record?
529 $ref = DB_DataObject::factory('CmsRefer');
530 $ref->blog_id = $this->id;
532 if (!$ref->clean()) {
535 if ($ref->find(true)) {
539 $ref->day = date('Y-m-d');
545 function referrers($showgoogle=false)
547 //DB_DataObject::debugLevel(1);
550 $r = DB_DataObject::factory('CmsRefer');
551 $r->blog_id = $this->id;
552 $r->orderBy('checked asc');
553 // dont validate google
555 $r->whereAdd("host like '%planet%'");
556 $r->whereAdd('checked_success < 1');
559 if ($r->find(true)) {
564 $r = DB_DataObject::factory('CmsRefer');
565 $r->blog_id = $this->id;
566 $r->whereAdd('checked_success > 0');;
568 $r->selectAdd('distinct(title), day,sum(seen) as seen,
569 scheme,host,port,path,id,checked_success,query');
570 $r->groupBy('title');
571 $r->orderBy('seen desc, host DESC, title ASC');
572 //$r->orderBy('blog_id desc');
574 $r->whereAdd("host != 'google.com'");
579 return $r->fetchAll();
582 function cleanTitle()
584 return preg_replace('/[^a-z0-9_]+/i','',preg_replace('/\s+/','_',$this->title));
587 function postListFilter($data, $authUser, $q)
589 // if (!empty($q['_treeview'])) {
591 // $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
592 // $mid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu');
594 // $c = DB_DAtaObject::Factory('core_enum');
595 // if (empty($q['_page_type_id']) || !in_array($q['_page_type_id'] , array($pid,$mid))) {
600 // $data = $this->buildTree($data);
607 function buildTree($data, $depth= 0) {
608 // data contains a list of the top level eleemnts
609 // we need to add all children (and depth flag?)
611 // build a static query with all the data...
613 static $menu_id = false;
615 $menu_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu');
620 $cb = DB_DataObject::factory('cms_page');
621 $cb->autoJoin(array('exclude' => array('extended', 'body')));
622 $tn = $this->tableName();
624 // this query is very outdated - should be using page types..
633 LENGTH({$tn}.page_link) > 0
637 cms_page.parent_id != 0
639 cms_page.translation_of_id = 0
641 $cb->is_menuitem = $this->is_menuitem;
642 if ($cb->is_menuitem) {
643 $cb->orderBy('cms_page.seq_id ASC');
645 $cb->orderBy('cms_page.is_element DESC, cms_page.page_link ASC');
647 $cb->is_deleted = (empty($_REQUEST['_show_deleted'])) ? 0 : 1;
648 // $disabled = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'disabled');
653 if (!isset($all[$cb->parent_id])) {
654 $all[$cb->parent_id] = array();
656 // if($cb->page_type_id == $disabled){// does not show the disabled item.... #2012
659 $all[$cb->parent_id][] = $cb->toArray();
667 foreach($data as $d) {
668 $d['depth'] = $depth;
670 if (empty($all[$d['id']])) {
673 // elements first, then order by page link
674 //$cb->orderBy('is_element DESC, page_link ASC');
675 //$add = $cb->fetchAll(false,false,'toArray');
677 $add = $this->buildTree($all[$d['id']], $depth +1);
678 foreach($add as $r) {
689 function firstImage($filter='image/%')
691 $i = DB_DataObject::factory('Images');
692 // DB_DataObject::debugLevel(1);
693 $i->orderBy('displayorder ASC, id ASC');
694 $im = $i->gather($this, $filter);
701 function firstImageTag($size =-1, $base="/Images/Thumb", $filter='image/%')
703 $fm = $this->firstImage($filter);
707 return $fm->toHTML($size, $base);
711 $d = DB_DataObject::Factory('cms_template');
712 $d->get($this->template_id);
715 function toEventString()
720 function toRooSingleArray($req)
722 $ret = $this->toArray();
723 if ( !empty($this->template_id_template )) {
724 $ret['template_id_template_clean'] = preg_replace(
725 '#\.html$#i', '', $this->template_id_template
729 $ret = $this->toRooSingleArrayInterests($ret, $req);
730 $ret = $this->toRooSingleArrayCategory($ret, $req);
731 $ret = $this->toRooSingleArrayPageClass($ret, $req);
737 function toRooSingleArrayCategory($ret, $req)
740 $cms_page_category = DB_DataObject::factory('cms_page_category');
741 $cms_page_category->autoJoin();
742 $cms_page_category->page_id = $this->id;
744 $cms_page_category->selectAdd("
745 cms_page_fullpath(cms_page_category.category_id, ' - ') AS category_id_fullpath
748 $categories = $cms_page_category->fetchAll('category_id', 'category_id_fullpath');
750 foreach($categories as $k => $v) {
753 'display_fullpath' => $v
757 $ret["categories"] = json_encode($li);
762 function toRooSingleArrayPageClass($ret, $req)
764 if(empty($ret['page_cls'])){
769 $core_enum = DB_DataObject::factory('core_enum');
770 $core_enum->setFrom(array(
771 'etype' => 'cms_page_class'
773 $core_enum->whereAddIn('name', explode(',', $ret['page_cls']), 'string');
775 foreach($core_enum->fetchAll('name', 'display_name') as $k => $v) {
782 $ret["page_classes"] = json_encode($li);
790 $c = DB_DataObject::Factory($this->tableName());
792 $c->get($this->parent_id);
797 function inLanguage($lang)
799 if ($lang == $this->language) {
802 $x = DB_DataObject::factory("cms_page");
804 $x->is_element = $this->is_element;
805 $x->is_draft = $this->is_draft;
807 $x->language = $lang;
808 if ($x->get('translation_of_id', $this->id)) {
815 function children($cfg)
817 // DB_DataObject::debugLevel(1);
818 $cfg['type'] = isset($cfg['type'] ) ? $cfg['type'] : '';
819 $cfg['language'] = isset($cfg['language'] ) ? $cfg['language'] : $this->language;
821 $tn = $this->tableName();
822 $nc = false; // named column.
824 $p = DB_DataObject::factory('cms_page');
826 if (!isset($this->id)) {
830 $p->parent_id = !empty($this->translation_of_id) ? $this->translation_of_id : $this->id;
835 $p->language = $cfg['language'];
838 switch($cfg['type']) {//FIXME in the new cms_page code this is not work?
842 // if language != english..
843 //DB_DataObject::debugLevel(1);
844 $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'element');
845 $nc = 'element_id_name';
846 $p->whereAdd("{$tn}.element_id != 0");
847 $p->orderBy("{$tn}.page_link ASC");
848 $p->language = 'en'; // default to the english ..
849 // we will translate later..
853 //DB_DataObject::debugLevel(1);
854 $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'page');
856 $p->orderBy(" {$tn}.seq_id, {$tn}.page_link ASC");
861 $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'element');
863 $p->orderBy(" {$tn}.seq_id, {$tn}.page_link ASC");
871 $p->page_type_name('blog');
872 $c = DB_DataObject::Factory('cms_category_type');
873 $c->get('name', $cfg['category']);
874 $p->category_type_id = $c->id;
875 $p->orderBy("{$tn}.published DESC");
880 $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'menu');
882 //DB_DataObject::debugLevel(1);
883 //$p->is_menuitem = 1; //?? needed???
885 CASE WHEN {$tn}.translation_of_id > 0
887 join_translation_of_id_id.seq_id
893 // $p->orderBy("{$tn}.seq_id ASC");
897 die("bad config for cms_page call - needs type");
902 if (!empty($cfg['limit'])) { //ofsset..
903 $p->limit((int)$cfg['limit']);
907 if($cfg['type'] == 'menu'){// if not found the language translate then get the en
911 return $p->fetchAll();
914 return $p->fetchAll();
916 return $p->fetchAll();
924 // if we have multiple children... with the same block name...
925 if (isset($ret[$p->{$nc}])) {
926 if (!is_array($ret[$p->{$nc}])) {
927 $ret[$p->{$nc}] = array($ret[$p->{$nc}]);
930 $ret[$p->{$nc}][] = clone($p);
933 $ret[$p->{$nc}] = clone($p);
940 if ($cfg['language'] != 'en' && $cfg['type'] == 'named_blocks') {
941 // our search results are currently english.
942 // find the 'id's of the
944 // DB_DataObject::debugLevel(1);
945 foreach($ret as $k=>$v) {
946 $ids[] = is_object($v) ? $v->id : $v[0]->id;
949 $pg = DB_DAtaObject::Factory('cms_page');
951 $pg->whereAddIn("{$tn}.translation_of_id", $ids, 'int');
952 $pg->language = $cfg['language'];
957 while ($pg->fetch()) {
958 $tr[$pg->translation_of_id] = clone($pg);
960 foreach($ret as $k=>$v) {
961 $id = is_object($v) ? $v->id : $v[0]->id;
962 if (isset($tr[$id])) {
974 function youtube() // asTech project - depricated - do not use..
976 return $this->videoPageLink('page_link');
979 function videoPageLink($prop = 'title') //prettybooked
981 $ar = parse_url($this->{$prop});
982 if(empty($ar['host'])){
983 return $this->{$prop};
987 case preg_match('/youtube/',$ar['host']):
988 $t= array_pop(explode('/', $ar['query']));
989 $t = array_pop(explode('v=', $t));
990 return 'http://www.youtube.com/embed/' . $t;
991 case preg_match('/vimeo/',$ar['host']):
992 $t= array_pop(explode('/', $ar['path']));
993 return "http://player.vimeo.com/video/". $t;
994 default:// detault does not work?
995 return $this->{$prop};
999 // this will be depricated
1000 function beforeInsert($request,$roo)
1002 if(!empty($request['_copy_of'])){
1003 $this->copy($request['_copy_of'], $roo);
1006 if(isset($request['_stylesheets'])){
1007 $this->updateStylesheets($request['_stylesheets'], $roo);
1010 if(isset($request['page_type_id'])){
1011 $this->assignOldConditions($request);
1013 if(empty($request['language'])){
1014 $this->language = 'en';
1016 if (!empty($request['translation_of_id'])) {
1017 $p = DB_DataObject::Factory('cms_page');
1018 $p->get($request['translation_of_id']);
1019 $this->page_type_id = $p->page_type_id;
1021 $dupe = DB_DataObject::Factory('cms_page');
1022 $dupe->translation_of_id = $this->translation_of_id;
1023 $dupe->language = $this->language;
1024 if ($dupe->count()) {
1025 $roo->jerr("a translated version already exists");
1031 $this->validateParent($roo);
1034 //check the page link is duplicate, then return error
1035 if(!empty($request['page_link'])){
1037 $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element');
1039 if($this->page_type_id != $eid){
1041 $x = DB_DataObject::factory('cms_page');
1042 $x->page_type_id = $this->page_type_id;
1044 if(!empty($request['page_link']) && $x->get('page_link', $request['page_link'])){
1045 $roo->jerr('Sorry, this page link exists already.');
1053 function onInsert($q,$roo)
1055 $this->retrieveAutoSave();
1057 if(isset($q['interest']) && strpos($roo->appModules, 'Crm') !== false){
1058 $this->updateInterests($q['interest'], $roo);
1061 if(isset($q['category'])){
1062 $this->updatecategory(empty($q['category']) ? array() : array_unique(array_filter(explode(',', $q['category']))), $roo);
1067 function onUpdate($old, $q,$roo)
1069 if(isset($q['interest']) && strpos($roo->appModules, 'Crm') !== false){
1070 $this->updateInterests($q['interest'], $roo);
1073 if(isset($q['category'])){
1074 $this->updatecategory(empty($q['category']) ? array() : array_unique(array_filter(explode(',', $q['category']))), $roo);
1078 function retrieveAutoSave()
1080 $events = DB_DataObject::factory('Events');
1081 $events->on_table = $this->tableName();
1083 $events->action = 'AUTOSAVE';
1085 foreach ($events->fetchAll() as $e){
1087 $e->on_id = $this->id;
1092 function validateParent($roo)
1095 if ($this->id && $this->parent_id == $this->id) {
1096 $roo->jerr("parent must not be same as page");
1098 if (!empty($this->parent_id)) {
1099 $p = DB_DataObject::factory('cms_page');
1100 $p->get($this->parent_id);
1101 switch($this->page_type()->name) {
1104 if ($p->page_type()->name != 'page') {
1105 $roo->jerr("parent must be of type page");
1110 if ($p->page_type()->name != 'menu') {
1111 $roo->jerr("parent must be of type menu");
1117 if ($p->page_type()->name != 'category') {
1118 $roo->jerr("parent must be of type menu");
1122 default: // unknow type?!?!
1129 function beforeUpdate($old, $request,$roo)
1131 if(!empty($request['_move'])){
1132 $this->updatePageSeq($request['_move'], $roo);
1135 if(isset($request['page_type_id'])){
1136 $this->assignOldConditions($request);
1139 $this->validateParent($roo);
1141 if(!empty($request['page_link'])){
1142 //checking for the system page, then cannot be edit page link
1143 if($old->is_system_page &&
1147 ($old->page_link != $request['page_link'])
1149 ($old->element_id != $request['element_id'])
1154 $roo->jerr('Sorry, you cannot change the page link, or block for system items.');
1157 //check the page link is duplicate, then return error
1158 if(!empty($request['page_link'])){
1161 $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element');
1163 if($this->page_type_id != $eid){ // element ignore page link checking..
1165 $x = DB_DataObject::factory('cms_page');
1167 $x->page_type_id = $this->page_type_id; // make sure they are of the same type..
1169 if($x->get('page_link', $request['page_link']) && ($old->page_link != $request['page_link'])){
1170 $roo->jerr('Sorry, this page link is existing on the system.');
1179 $page_type = $this->page_type();
1182 $page_type->name == 'blog' &&
1183 $old->is_draft == 1 &&
1184 $this->is_draft == 0 &&
1186 empty($this->published) ||
1187 $this->published == '0000-00-00 00:00:00'
1190 $this->published = date('Y-m-d');
1194 function page_type()
1196 $c = DB_DataObject::factory('core_enum');
1197 $c->get($this->page_type_id);
1201 * get or set page type...
1203 function page_type_name()
1205 $args = func_get_args();
1207 return isset($this->page_type_id_name) ? $this->page_type_id_name : $this->page_type()->name;
1209 $cid = DB_DataObject::factory('core_enum')->lookup("cms_page_type", $args[0]);
1211 $this->page_type_id = $cid;
1219 function assignOldConditions($request)
1221 $c = DB_DataObject::factory('core_enum');
1222 $c->get($request['page_type_id']);
1227 $this->is_element = 0;
1228 $this->is_menuitem = 0;
1232 $this->is_element = 1;
1233 $this->is_menuitem = 0;
1237 $this->is_element = 0;
1238 $this->is_menuitem = 0;
1242 $this->is_element = 0;
1243 $this->is_menuitem = 1;
1247 $this->is_element = 0;
1248 $this->is_menuitem = 0;
1254 function convertOld()
1256 static $map = false;
1258 $c = DB_DataObject::factory('core_enum');
1259 $c->etype = 'cms_page_type';
1261 $map = $c->fetchAll('name', 'id');
1263 $old = clone($this);
1264 $opt = $this->page_type_id ;
1266 case (!$this->in_rss && ! $this->is_element && ! $this->is_menuitem):
1267 $this->page_type_id = $map['page'];
1270 case (!$this->in_rss && $this->is_element && ! $this->is_menuitem):
1271 $this->page_type_id = $map['element'];
1274 case (!$this->in_rss && !$this->is_element && $this->is_menuitem):
1275 $this->page_type_id = $map['menu'];
1278 case ($this->in_rss && !$this->is_element && !$this->is_menuitem):
1279 $this->page_type_id = $map['blog'];
1283 //echo "NEW: {$this->page_type_id } / old: {$old->page_type_id}\n";
1284 if ($this->page_type_id != $old->page_type_id) {
1285 $this->update($old);
1291 function initMenu($data = array())
1293 echo "Starting Menu ..... \n";
1294 $menu_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu');
1295 foreach($data as $parent){
1296 $prt = DB_DataObject::factory($this->tableName());
1297 if($prt->get('page_link', $parent['page_link'])){
1301 $prt->title = $parent['title'];
1302 $prt->is_menuitem = 1;
1303 $prt->is_system_page = 1;
1304 $prt->language = 'en';
1305 $prt->created = Date('Y-m-d H:i:s');
1306 $prt->page_type_id = $menu_id;
1310 foreach($parent['cn'] as $child){
1311 $c = DB_DataObject::factory($this->tableName());
1313 $page_link = (!empty($child['hide_parent'])) ? $child['page_link'] : ($prt->page_link.'/'.$child['page_link']);
1315 if(!$c->get('page_link', $page_link)){
1316 $c->title = empty($child['title']) ? '' : $child['title'];
1317 $c->is_menuitem = 1;
1318 // $c->is_system_page = 1;
1319 $c->created = Date('Y-m-d H:i:s');
1320 $c->parent_id = $prt->id;
1321 $c->language = 'en';
1322 $c->page_type_id = $menu_id;
1323 $c->seq_id = empty($child['seq_id']) ? 0 : $child['seq_id'];
1324 $c->target_url = empty($child['target_url']) ? '' : $child['target_url'];
1331 function preview($roo)
1333 // $this->autoJoin(); not needed called already in roo.
1335 if ($this->page_type_id_name == 'element') {
1337 return $this->parent()->preview($roo);
1340 // set up the template engine to render from the site..
1341 $opts = HTML_FlexyFramework::get()->Pman_Cms;
1342 if (!isset($opts['basePHP'])) {
1343 $roo->jerr(" Pman_Cms[basePHP] is not set ");
1347 $basePHP = $opts['basePHP'];
1350 if ($this->page_type_id_name == 'blog' && empty($this->page_link)) {
1352 if(!isset($opts['blog'])){
1353 $roo->jerr("Pman_Cms['blog'] is not set");
1356 header('Location: ' . $roo->rootURL .'/'. $opts['blog'] . '/' . $this->id);
1363 $pl = $this->page_link;
1364 if (is_array($opts['basePHP'])) {
1365 foreach($opts['basePHP'] as $k=>$v) {
1366 if ($k == substr($pl,0, strlen($k))) {
1367 $pl = substr($pl, strlen($k)+1);
1374 $roo->jerr(" page link does not match any configured site.");
1385 break; // do nothing.
1388 header('Location: ' . $roo->rootURL .'/'. $basePHP . $pl );
1392 require_once 'Pman/Cms/Preview.php';
1394 $p = new Pman_Cms_Preview();
1395 // set up the basic params..
1396 $p->rootURL = $roo->rootURL;
1397 $p->baseURL = $roo->rootURL . '/'. $opts['basePHP'] ;
1398 $p->loadPage('Site'); // loads any blocks from site.
1399 $p->loadPage('Site/*'); // loads any blocks from site.
1400 $p->loadPage('Home'); // loads any blocks from site.
1402 $p->page = $p->loadPage($this->page_link);
1405 $fo = &PEAR::getStaticProperty('HTML_Template_Flexy', 'options');
1407 $fo['templateDir'] = $opts['templateDir'];
1408 $fo['forceCompile'] = true;
1409 if (isset($opts['url_rewrite'])) {
1410 $fo['url_rewrite'] = $opts['url_rewrite'];
1422 function getStoreName()
1424 $opts = HTML_FlexyFramework::get()->Pman;
1426 $dir = "{$opts['storedir']}/cms_page";
1428 if(!file_exists($dir)){
1429 $oldumask = umask(0);
1430 mkdir($dir, 0775, true);
1434 return implode( '/', array(
1435 $dir, $this->id . '.png'
1440 function syncTemplatePage($pgdata)
1443 if (empty($pgdata['page_link'])) {
1444 return; // shoud not happen..
1446 $link = $pgdata['page_link'];
1448 $page_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
1449 $cmsPage = DB_DataObject::factory('cms_page');
1450 $cmsPage->setFrom(array(
1451 'page_link' => $link,
1452 'page_type_id' => $page_id,
1453 'translation_of_id' => 0,
1458 if(!$cmsPage->find(true)){
1459 $cmsPage = DB_DataObject::factory('cms_page');
1461 // existing parent..
1462 $parent = $cmsPage->parent_id;
1465 // attempt to find the parent..
1466 if (!$parent && strpos($link,'/') !== false) {
1467 $par = explode('/', $link);
1469 $pname = implode('/', $par);
1470 $cmsPageP = DB_DataObject::factory('cms_page');
1471 if ($cmsPageP->get('page_link',$pname)) {
1472 $parent = $cmsPageP->id;
1478 // echo "$ori_n <<<< $is_static \n";
1479 $run_opts = HTML_FlexyFramework::get()->page->opts;
1481 $cmsPage->setFrom(array(
1482 'parent_id' => $parent,
1483 'page_link' => $link,
1485 'page_type_id' => $page_id,
1486 'template_id' => !empty($pgdata['template_object']) ? $pgdata['template_object']->id : 0,
1488 'translation_of_id' => 0,
1489 'is_system_page' => 1,
1491 'is_static' => 0, // not sure what this is supposed to indicate..
1492 'updated' => $this->sqlValue('NOW()'),
1493 'created' => $this->sqlValue('NOW()'),
1495 //print_r($contentStrings);
1497 if (!$cmsPage->id) {
1498 $cmsPage->title = $link;
1501 $contentStrings = !empty($pgdata['template_object']) ? $pgdata['template_object']->contentStrings : false;
1503 if ($contentStrings &&
1504 (!empty($run_opts['force-content-update']) || !$cmsPage->id)
1505 ) { // only do this for the initila load
1506 foreach( array('title', 'body', 'extended') as $prop) {
1507 if (isset($contentStrings['{page.'. $prop.'}'])) {
1508 $cmsPage->{$prop} = $contentStrings['{page.'. $prop.'}'];
1510 if (isset($contentStrings['{page.'. $prop.':h}'])) {
1511 $cmsPage->{$prop} = $contentStrings['{page.'. $prop.':h}'];
1513 if (isset($contentStrings['{page.'. $prop.'ToDisplayHtml():h}'])) {
1514 $cmsPage->{$prop} = $contentStrings['{page.'. $prop.'ToDisplayHtml():h}'];
1516 echo "cmsPage->{$prop} = ". $cmsPage->{$prop} ."\n";
1527 return clone($cmsPage);
1534 function toSitemapAll($xml, $site_base)
1536 $this->is_draft = 0;
1538 $this->page_type_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
1540 $ar = $this->fetchAll();
1542 $except = array('Home', 'Site');
1543 foreach($ar as $o) {
1544 $link = explode('/', $o->page_link);
1545 if(in_array($link[0], $except)){
1548 $url = $site_base."/".str_replace('%2F', '/', rawurlencode($o->page_link));
1549 $tmpXml = $xml->addChild("url");
1550 $tmpXml->addChild("loc", $url);
1551 $tmpXml->addChild("changefreq", "weekly");
1552 $tmpXml->addChild("priority", 1);
1553 $time = $o->updated;
1554 if(!$time || $time == '0000-00-00 00:00:00'){
1555 $time = '2000-01-01 00:00:00';
1557 $tmpXml->addChild("lastmod", date("Y-m-d", strtotime($time)));
1558 // $a = $xml->addChild("url");
1559 // $a->addChild("loc", 'http://www.prettybooked.com');
1560 // $a = $xml->addChild("url");
1561 // $a->addChild("loc", 'http://www.prettybooked.com2');
1566 function comments($count = false)
1568 $comments = DB_DataObject::factory('cms_comments');
1569 $comments->ontable = 'cms_page';
1570 $comments->entry_id = $this->id;
1573 return $comments->count();
1576 $comments->_join .= '
1580 Person.email = cms_comments.email
1582 $person = DB_DataObject::Factory('core_person');
1584 $comments->selectAs($person, 'person_%s');
1586 $comments->orderBy('posted ASC');
1588 return $comments->fetchAll();
1592 function beforeDelete($dependants_array, $roo)
1594 $this->beforeDeleteInterests($dependants_array, $roo);
1598 /**---------- crm related interest - no idea how this snuck in here --*/
1601 function beforeDeleteInterests($dependants_array, $roo)
1603 // why is this using crm interest???
1604 $ff = HTML_FlexyFramework::get();
1605 if (!in_array('Crm', $ff->enableArray)) {
1609 $interest = DB_DataObject::factory('crm_interest');
1610 $interest->onid = $this->id;
1611 $interest->ontable = $this->tableName();
1613 foreach($interest->fetchAll() as $i){
1620 function updateInterests($interests = array(), $roo)
1622 $ff = HTML_FlexyFramework::get();
1623 if (!in_array('Crm', $ff->enableArray)) {
1628 $type = $this->page_type();
1630 if($type->name != 'blog'){
1634 $exists = $this->interests();
1636 $interests = array_filter(explode(',', $interests));
1638 foreach ($interests as $i){
1639 if(array_key_exists($i, $exists)){
1644 $ci = DB_DataObject::factory('crm_interest');
1646 'onid' => $this->id,
1647 'ontable' => $this->tableName(),
1648 'interest_id' => $i,
1649 'created_dt' => $ci->sqlValue("NOW()")
1654 foreach ($exists as $e){
1660 function updatecategory($category = array(), $roo)
1662 $exists = $this->categories();
1664 foreach ($category as $c){
1665 if(array_key_exists($c, $exists)){
1670 $cms_page_category = DB_DataObject::factory('cms_page_category');
1672 $cms_page_category->setFrom(array(
1673 'page_id' => $this->id,
1677 $cms_page_category->insert();
1680 foreach ($exists as $e){
1686 function categories()
1688 $cms_page_category = DB_DataObject::factory('cms_page_category');
1690 $cms_page_category->setFrom(array(
1691 'page_id' => $this->id
1694 $cms_page_category->find();
1698 while ($cms_page_category->fetch()){
1699 $o = clone($cms_page_category);
1700 $ret[$o->category_id] = $o;
1707 function interests()
1709 $ff = HTML_FlexyFramework::get();
1710 if (!in_array('Crm', $ff->enableArray)) {
1713 $i = DB_DataObject::factory('crm_interest');
1715 $i->onid = $this->id;
1716 $i->ontable = $this->tableName();
1722 while ($i->fetch()){
1724 $ret[$ii->interest_id] = $ii;
1730 function toRooSingleArrayInterests($ret, $req)
1734 $ff = HTML_FlexyFramework::get();
1735 if (!in_array('Crm', $ff->enableArray)) {
1740 if($ret['page_type_id_name'] == 'blog') {
1742 $interest = DB_DataObject::factory('crm_interest');
1743 $interest->autoJoin();
1744 $interest->onid = $this->id;
1745 $interest->ontable = $this->tableName();
1747 $interest = $interest->fetchAll('interest_id', 'interest_id_display_name');
1749 foreach($interest as $k => $v) {
1752 'display_name' => $v
1756 $ret["interests"] = json_encode($li);
1762 function extra_css()
1764 if (empty($this->extra_css)) {
1767 return "<style>\n{$this->extra_css}\n</style>\n";
1770 function stylesheets($roo)
1772 $enum = DB_DataObject::factory('core_enum');
1773 $enum->setFrom(array(
1774 'etype' => 'Cms.Settings',
1776 'name' => 'stylesheets'
1779 $stylesheets = $enum->fetchAll('display_name');
1781 $stylesheets = implode("\n", $stylesheets);
1784 '_stylesheets' => $stylesheets
1788 function updateStylesheets($stylesheets, $roo)
1790 $stylesheets = empty($stylesheets) ? array() : array_unique(array_filter(explode("\n", $stylesheets)));
1792 $enum = DB_DataObject::factory('core_enum');
1793 $enum->setFrom(array(
1794 'etype' => 'Cms.Settings',
1796 'name' => 'stylesheets'
1801 while ($enum->fetch()){
1804 if(in_array($o->display_name, $stylesheets)){
1805 unset($stylesheets[array_search($o->display_name, $stylesheets)]);
1813 foreach ($stylesheets as $s){
1814 $enum = DB_DataObject::factory('core_enum');
1815 $enum->setFrom(array(
1816 'etype' => 'Cms.Settings',
1818 'name' => 'stylesheets',
1819 'display_name' => $s
1828 function build_tree_sequence($page_type_id)
1830 $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
1831 $mid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu');
1832 $cid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'category');
1834 if(empty($page_type_id) || !in_array($page_type_id, array($pid, $mid, $cid))){
1838 $cms_page = DB_DataObject::factory('cms_page');
1840 $cms_page->setFrom(array(
1841 'page_type_id' => $page_type_id,
1845 if($page_type_id == $pid){
1846 $cms_page->orderBy('cms_page.page_link ASC');
1848 $cms_page->orderBy('cms_page.seq_id ASC');
1851 $data = $cms_page->fetchAll();
1853 $this->_build_tree_sequence($data, 0, 0);
1857 function _build_tree_sequence($data, $sequence, $depth)
1859 foreach ($data as $d){
1864 'tree_sequence' => $sequence,
1865 'tree_depth' => $depth
1870 $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
1872 $cms_page = DB_DataObject::factory('cms_page');
1874 $cms_page->setFrom(array(
1875 'parent_id' => $d->id,
1876 'page_type_id' => $d->page_type_id
1879 if($d->page_type_id == $pid){
1880 $cms_page->orderBy('cms_page.page_link ASC');
1882 $cms_page->orderBy('cms_page.seq_id ASC');
1885 $children = $cms_page->fetchAll();
1887 $seq = $sequence + 1;
1890 $sequence = $this->_build_tree_sequence($children, $seq, $dep);
1898 function toPublicData($country = false)
1902 if(empty($this->id)){
1906 $children = DB_DataObject::factory('cms_page');
1907 $children->autoJoin();
1908 $children->setFrom(array(
1909 'parent_id' => (!empty($this->translation_of_id)) ? $this->translation_of_id : $this->id,
1913 'translation_of_id' => 0
1916 $children->whereAdd('cms_page.element_id != 0');
1918 $children->orderBy('cms_page.seq_id ASC');
1920 $ff = HTML_FlexyFramework::get();
1922 foreach ($children->fetchAll() as $c){
1924 $cc = $c->inLanguage($ff->locale);
1926 if(!isset($ret[$c->element_id_name])){
1927 $ret[$c->element_id_name] = array();
1930 $image = DB_DataObject::factory('Images');
1931 $image->setFrom(array(
1932 'ontable' => 'cms_page',
1936 $image->orderBy('Images.displayorder ASC');
1938 $bgimage = $image->fetchAll(false, false, 'toArray');
1940 if(!empty($country) && count($bgimage) > 1){
1941 print_R($bgimage);exit;
1945 $player = (empty($country) || $country != 'CN') ? 'youtu.be' : 'youku.com';
1947 foreach ($bg as $i){
1948 if(!empty($i['linkurl']) && strpos($i['linkurl'], $player) !== false){
1953 if(empty($bgimage)){
1954 $bgimage[] = $bg[0];
1958 $ret[$c->element_id_name][] = array(
1959 'size' => (empty($c->template_id_template)) ? '' : $c->template_id_template,
1960 'title' => $cc->title,
1961 'html' => $cc->body,
1962 'extended' => $cc->extended,
1963 'href' => $c->page_link,
1964 'cls' => implode(' ', explode(',', $c->page_cls)),
1965 'bgimage' => $bgimage
1969 $ret['page'] = array(
1970 'target' => (!empty($this->translation_of_id)) ? $this->translation_of_id : $this->id,
1971 'title' => $this->title,
1972 'body' => $this->body
1978 function gatherMenu($name)
1982 $cms_page = DB_DataObject::factory('cms_page');
1984 $cms_page->setFrom(array(
1987 'page_link' => $name,
1991 $cms_page->orderBy('cms_page.seq_id ASC');
1993 if(empty($name) || !$cms_page->find(true)){
1997 return $cms_page->gatherSubMenu();
2001 function gatherSubMenu()
2005 if(empty($this->id)){
2009 $ff = HTML_FlexyFramework::get();
2016 $sub = $this->children($cfg);
2018 foreach ($sub as $k => $v){
2020 $vv = $v->inLanguage($ff->locale);
2023 'target' => (empty($v->menu_page_id)) ? 0 : $v->menu_page_id,
2024 'html' => $vv->title,
2025 'href' => empty($v->menu_page_id_page_link) ? '' : $v->menu_page_id_page_link
2028 $item['children'] = $v->gatherSubMenu();
2037 function dump_pages($q, $au, $roo)
2039 if (!extension_loaded('zip')) { // sudo apt-get install php5.6-zip??
2040 die('Please install php zip extension');
2045 $cms_page = DB_DataObject::factory('cms_page');
2047 foreach ($cms_page->fetchAll() as $cp){
2048 $pages[$cp->id] = $cp->toArray();
2053 $core_enum = DB_DataObject::factory('core_enum');
2055 $core_enum->setFrom(array(
2056 'etype' => 'cms_page_type',
2060 foreach ($core_enum->fetchAll() as $ce){
2061 $types[$ce->id] = $ce->toArray();
2064 $categories = array();
2066 $cms_page_category = DB_DataObject::factory('cms_page_category');
2068 foreach ($cms_page_category->fetchAll() as $cpc){
2069 $categories[$cpc->id] = $cpc->toArray();
2072 $templates = array();
2074 $cms_template = DB_DataObject::factory('cms_template');
2076 foreach ($cms_template->fetchAll() as $ct){
2077 $templates[$ct->id] = $ct->toArray();
2080 $elements = array();
2082 $cms_template_element = DB_DataObject::factory('cms_template_element');
2084 foreach ($cms_template_element->fetchAll() as $cte){
2085 $elements[$cte->id] = $cte->toArray();
2091 $img = DB_DataObject::factory('Images');
2092 $img->setFrom(array(
2093 'ontable' => 'cms_page'
2096 foreach ($img->fetchAll() as $i){
2097 $images[$i->id] = $i->toArray();
2099 if(!array_key_exists($i->filename, $photos)){
2100 $photos[$i->filename] = $i->getStoreName();
2105 $json = json_encode(array(
2108 'categories' => $categories,
2109 'templates' => $templates,
2110 'elements' => $elements,
2111 'images' => $images,
2112 'photos' => array_keys($photos)
2115 $zipFile = $roo->tempName('zip');
2117 $zip = new ZipArchive();
2119 if ($zip->open($zipFile, ZipArchive::CREATE) !== TRUE) {
2120 die('Can not create zip file');
2123 $zip->addFromString('data.json', $json);
2125 foreach ($photos as $name => $path){
2126 $zip->addFile($path, $name);
2131 require_once 'File/Convert.php';
2133 $fc= new File_Convert($zipFile, 'pplication/zip');
2134 $fn = $fc->convert('pplication/zip');
2135 $fc->serve('attachment', 'cms-page-dummy-page.zip', true);
2141 function applyFilterTemplateElements($q, $au, $roo)
2143 $cms_page = DB_DataObject::factory('cms_page');
2145 if(!$cms_page->get($q['_list_elements'])){
2146 $roo->jerr('Invalid id');
2149 $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page');
2151 if($cms_page->page_type_id != $pid || empty($cms_page->template_id)){
2152 $roo->jdata(array());
2155 $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element');
2157 $items = DB_DataObject::factory('cms_page');
2159 $items->setFrom(array(
2160 'parent_id' => $cms_page->id,
2162 'page_type_id' => $eid
2165 $items->whereAdd('cms_page.element_id != 0 AND cms_page.translation_of_id = 0');
2167 if (empty($q['_show_deleted'])) {
2168 $items->is_deleted = 0 ;
2171 $items->selectAdd();
2175 cms_page.title AS title,
2176 join_element_id_id.name AS element_id_name,
2177 cms_page.seq_id AS seq_id,
2178 cms_page.is_draft AS is_draft,
2179 cms_page.is_deleted AS is_deleted,
2180 cms_page.language AS language,
2183 GROUP_CONCAT(cp.language SEPARATOR ',')
2187 cp.translation_of_id = cms_page.id
2188 ) AS translation_type,
2195 Images.ontable = 'cms_page'
2197 Images.onid = cms_page.id
2199 Images.displayorder ASC
2201 ) AS primary_image_id
2204 $items->orderBy("join_element_id_id.name ASC, cms_page.seq_id ASC");
2206 $total = $items->count();
2208 $start = (empty($q['start'])) ? 0 : $q['start'];
2209 $limit = (empty($q['limit'])) ? 25 : $q['limit'];
2211 $items->limit($start, $limit);
2213 $ret = $items->fetchAll(false, false, 'toArray');
2215 $roo->jdata($ret, $total);
2219 function updatePageSeq($type, $roo)
2221 $this->reOrderSeq($roo);
2223 $target = DB_DataObject::factory('cms_page');
2224 $target->get($this->id);
2226 $cms_page = DB_DataObject::factory('cms_page');
2228 $cms_page->setFrom(array(
2231 'parent_id' => $target->parent_id,
2232 'element_id' => $target->element_id,
2233 'page_type_id' => $target->page_type_id,
2240 $cms_page->whereAdd("cms_page.seq_id > {$target->seq_id}");
2242 $cms_page->orderBy('cms_page.seq_id ASC');
2247 $cms_page->whereAdd("cms_page.seq_id < {$target->seq_id}");
2249 $cms_page->orderBy('cms_page.seq_id DESC');
2256 if(!$cms_page->find(true)){
2260 $ot = clone($target);
2261 $oc = clone($cms_page);
2263 $target->seq_id = $oc->seq_id;
2264 $cms_page->seq_id = $ot->seq_id;
2266 $target->update($ot);
2267 $cms_page->update($oc);
2273 function reOrderSeq($roo)
2275 $cms_page = DB_DataObject::factory('cms_page');
2277 $cms_page->setFrom(array(
2280 'parent_id' => $this->parent_id,
2281 'element_id' => $this->element_id,
2282 'page_type_id' => $this->page_type_id,
2286 $validate = clone($cms_page);
2288 $validate->selectAdd();
2289 $validate->selectAdd("
2290 DISTINCT(cms_page.seq_id) AS seq_id,
2291 COUNT(cms_page.id) AS total
2294 $validate->groupBy('cms_page.seq_id');
2296 $validate->having('total > 1');
2298 $validate->limit(1);
2300 $res = $validate->fetchAll();
2301 if(empty($res)){ // looks good...
2305 $cms_page->orderBy('cms_page.seq_id ASC, cms_page.id ASC');
2307 foreach ($cms_page->fetchAll() as $k => $v){
2311 $v->seq_id = $k + 1;
2320 function copy($id, $roo)
2322 $cms_page = DB_DataObject::factory('cms_page');
2324 if(empty($id) || !$cms_page->get($id)){
2325 $roo->jerr('Invalid id');
2328 $n = DB_DataObject::factory('cms_page');
2329 $n->setFrom($cms_page->toArray());
2332 'title' => (!empty($cms_page->title)) ? "Copy of {$cms_page->title}" : '',
2333 'page_link' => (!empty($cms_page->page_link)) ? "{$cms_page->page_link}-copy" : '',
2334 'updated' => date('Y-m-d H:i:s'),
2335 'created' => date('Y-m-d H:i:s')
2340 $images = DB_DataObject::factory('Images');
2341 $images->setFrom(array(
2342 'ontable' => 'cms_page',
2343 'onid' => $cms_page->id
2346 foreach ($images->fetchAll() as $i){
2348 $ni = DB_DataObject::factory('Images');
2350 'ontable' => 'cms_page',
2354 $ni->createFrom($i->getStoreName(), $i->filename);
2356 if(!empty($ni->err)){
2357 $roo->jerr($ni->err);
2361 $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element');
2363 $elements = DB_DataObject::factory('cms_page');
2364 $elements->setFrom(array(
2365 'parent_id' => $cms_page->id,
2367 'page_type_id' => $eid
2370 $elements->whereAdd('cms_page.element_id != 0 AND cms_page.translation_of_id = 0');
2372 foreach ($elements->fetchAll() as $element) {
2374 $ne = DB_DataObject::factory('cms_page');
2375 $ne->setFrom($element->toArray());
2378 'parent_id' => $n->id,
2379 'title' => (!empty($element->title)) ? "Copy of {$element->title}" : '',
2380 'page_link' => (!empty($element->page_link)) ? "{$element->page_link}-copy" : '',
2381 'updated' => date('Y-m-d H:i:s'),
2382 'created' => date('Y-m-d H:i:s')
2387 $images = DB_DataObject::factory('Images');
2388 $images->setFrom(array(
2389 'ontable' => 'cms_page',
2390 'onid' => $element->id
2393 foreach ($images->fetchAll() as $i){
2395 $nei = DB_DataObject::factory('Images');
2396 $nei->setFrom(array(
2397 'ontable' => 'cms_page',
2401 $nei->createFrom($i->getStoreName(), $i->filename);
2403 if(!empty($nei->err)){
2404 $roo->jerr($nei->err);