author_id)) { $this->author_id = $ff->page->authUser->id; } return $ret; } function applyFilters($q, $au, $roo) { if(!empty($q['_dump_pages'])){ $this->dump_pages($q, $au, $roo); } if(!empty($q['_stylesheets'])){ $this->stylesheets($roo); } if(!empty($q['_list_elements'])){ $this->applyFilterTemplateElements($q, $au, $roo); } if (!empty($q['_preview'])) { $roo->sessionState(0); if (!$this->get($q['_preview'])) { $roo->jerr("invalid page"); } return $this->preview($roo); } $tn = $this->tableName(); if (!empty($q['_update_old'])) { $t = clone($this); foreach($t->fetchAll() as $t) { $t->convertOld(); } $roo->jok("done"); } // default is to hide deleted entries... (we show deleted and not-deleted if _show_Deleted is set.) // not filtering if we are doing an update... if (empty($q['_show_deleted']) && empty($q['_is_update_request'])) { $this->is_deleted = 0 ; } if (isset($q['search'])) { if(!empty($q['search']['name'])){ $s = $this->escape($q['search']['name']); $this->whereAdd("{$tn}.page_link like '%$s%' OR {$tn}.title like '%$s%' "); } // if(!empty($q['search']['category'])){ // $category_id = (int)$q['search']['category']; // $this->whereAdd("{$tn}.category_type_id = {$category_id}"); // } if (!empty($q['search']['page_link_no_empty'])) { $this->whereAdd("{$tn}.page_link != ''"); } } $this->_extra_cols = array('language_name'); $this->selectAdd("i18n_translate('l' , {$tn}.language, 'en') as language_name"); if(!empty($q['translation_of_id'])){ $this->whereAdd("{$tn}.translation_of_id > 0"); } //do the select option if page == element if(!empty($q['_page_type_id'])){ $this->build_tree_sequence($q['_page_type_id']); //$eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element'); // $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); // $mid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu'); $this->page_type_id = $q['_page_type_id']; // show all pages, not just top level? // technically elements with missing parents might need something like this? //if(in_array($q['_page_type_id'], array($pid, $mid))){ // $this->parent_id = 0; //} } if(!empty($q['_category_id'])){ $cms_page_category = DB_DataObject::factory('cms_page_category'); $cms_page_category->setFrom(array( 'category_id' => $q['_category_id'] )); $page_ids = $cms_page_category->fetchAll('page_id'); $this->whereAddIn('cms_page.id', $page_ids, 'int'); } if(!empty($q['_with_primary_image'])){ $this->selectAdd(" ( SELECT id FROM Images WHERE Images.ontable = 'cms_page' AND Images.onid = cms_page.id ORDER BY Images.displayorder ASC LIMIT 1 ) AS primary_image_id "); } if(!empty($q['_page_type'])){ $core_enum = DB_DataObject::factory('core_enum'); $core_enum->setFrom(array( 'etype' => 'cms_page_type' )); $core_enum->whereAddIn('name', array_unique(array_filter(explode(',', $q['_page_type']))), 'string'); $this->whereAddIn('cms_page.page_type_id', $core_enum->fetchAll('id'), 'int'); } if(!empty($q['_with_fullpath'])){ $this->selectAdd(" (SELECT cms_page_fullpath(cms_page.id, '/')) AS fullpath, (SELECT cms_page_fullpath(cms_page.id, ' - ')) AS display_fullpath "); } if(!empty($q['_with_translation_type'])){ $this->selectAdd(" ( SELECT GROUP_CONCAT(cp.language SEPARATOR ',') FROM cms_page AS cp WHERE cp.translation_of_id = cms_page.id ) AS translation_type "); } $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); if(!empty($q['_page_type_id']) && $q['_page_type_id'] == $pid) { $this->selectAdd(" ( SELECT COUNT(cp.id) FROM cms_page AS cp WHERE cp.is_element = 1 AND cp.parent_id = cms_page.id AND element_id IN ( SELECT cms_template_element.id FROM cms_template_element WHERE cms_template_element.template_id = cms_page.template_id ) ) AS has_child, (SELECT core_enum_id_by_name('cms_page_type', 'element')) AS element_page_type_id, ( SELECT COUNT(cms_template_element.id) FROM cms_template_element WHERE cms_template_element.template_id = cms_page.template_id ) AS has_child_element_type "); } } function author() { $p = DB_DataObject::Factory('core_person'); $p->get($this->author_id); return $p; } function company() { $au = $this->author(); return $au->company(); } var $company = false; function loadCompany() { $this->company = $this->company(); } var $companyPage = false; /** * * assigns companypage * - this is very project specific... (it's used on RIS) * - we should think of a better way to handle this * */ function loadCompanyPage($lang = 'en') { $pg = $this; if ($this->parent_id && !empty($this->language) && $this->language !='en') { $pg = DB_DataObject::factory("cms_page"); $pg->get($this->parent_id); } $company = $pg->company(); $companyPar = DB_DataObject::factory("cms_page"); $companyPar->get('page_link', 'companies'); $companyEntry = DB_DataObject::factory("cms_page"); $companyEntry->parent_id = $companyPar->pid(); if ($companyEntry->get('page_link', $company->name)) { $this->companyPage = $companyEntry; $others = DB_DataObject::factory("cms_page"); $others->parent_id = $companyEntry->id; $others->language = $lang; if ($others->find(true)) { $this->companyPage = $others; } return true; } return false; } function published($format) { return date($format,strtotime($this->published)); } // depricated.. function link($field, $set_args = array()) { return $this->URL(); } function URL() { $ff = HTML_FlexyFramework::get(); if ($this->is_attachment) { $f = $this->firstImage('%'); return $f->URL(-1); } if(empty($this->page_link) && !empty($this->menu_page_id)){ $link = DB_DataObject::factory('cms_page'); if($link->get($this->menu_page_id)){ return $link->URL(); } } if(!empty($this->target_url)){ return ($this->target_url[0] == '/') ? ($ff->page->baseURL . $this->target_url) : ($ff->page->baseURL . '/' . $this->target_url); } $x = explode('/',$this->page_link); if (!empty($ff->Pman_Cms['view_name'])) { $d = array_shift($x); // check domains match! if(empty($d)){ return $ff->page->baseURL; } } return $ff->page->baseURL . '/' . implode('/', $x); } function bodyToDisplayHtml() { return ($this->body) ? $this->hashLinksToHtml($this->body) : ''; } function extendedToDisplayHtml() { return ($this->extended) ? $this->hashLinksToHtml($this->extended) : ''; } function pageLinkToClass() // conver the page_link into a string that can be used as a css class { return preg_replace('/[^a-z0-9]+/i','-', $this->page_link); } function hashLinksToHtml($str) { // for reference on children.. $images = DB_DataObject::factory('Images'); $ff = HTML_FlexyFramework::get(); $all_images = $images->gather($this); $imap = array(); foreach($all_images as $i) { $imap[$i->id] = $i; $imap[$i->title] = $i; } //print_r($imap); libxml_use_internal_errors (true); $doc = new DOMDocument('1.0', 'utf-8');; if (version_compare(PHP_VERSION, '5.3.6') >= 0) { $doc->loadHTML('
' . $str.'
'); } else { $doc->loadHTML( trim($str)); } libxml_use_internal_errors (false); $xpath = new DOMXpath($doc); foreach ($xpath->query('//a[@href]') as $a) { $href = $a->getAttribute('href'); //var_dump($href); $matches = array(); // named attachment. if (preg_match("/#attachment-(.*)$/", $href, $matches)) { //var_Dump($matches[1]); if (isset($imap[$matches[1]])) { $a->setAttribute('href', $imap[$matches[1]]->URL(-1,'/Images')); } continue; } // first attachment if (preg_match("/#attachment$/", $href)) { if($all_images){ $a->setAttribute('href', $all_images[0]->URL(-1,'/Images')); } continue; } if (preg_match("/#page-(.*)$/", $href)) { // find the page.. then ask the page provider to delivery the page. $pg = DB_DataObject::factory($this->tableName()); $pg->is_element = 0; $lk = preg_replace("/^#page-/", '', $href); if (!$pg->get('page_link', $lk)) { $a->setAttribute('href', "#page-not-found-". $lk); continue; } if (method_exists($ff->page,'pageToURL')) { $a->setAttribute('href', $ff->page->pageToURL($pg)); continue; } // finally use the old standard way of doing it.. $a->setAttribute('href', preg_replace('/#page-/', "{$ff->page->baseURL}/", $href)); continue; } } foreach ($xpath->query('//img[@src]') as $a) { $src = $a->getAttribute('src'); $matches = array(); //var_Dump($src); if (!preg_match("/#attachment-(.*)$/", $src, $matches)) { $matches = array(); if (!preg_match("/#image-(.*)$/", $src, $matches)) { continue; } } // valid attachment. (we do not support globalized attachments yet...) if (!isset($imap[$matches[1]])) { continue; } $width = $a->hasAttribute('width') ? $a->getAttribute('width') : false; $height= $a->hasAttribute('height') ? $a->getAttribute('height') : false; $width = $width == false || strpos($width,'%') != -1 ? false : (int) $width; $height = $height== false || strpos($height,'%') != -1 ? false : (int) $height; // convert into scaled... switch(true) { case ($width === false && $height == false): $a->setAttribute('src', $imap[$matches[1]]->URL(-1,'/Images')); continue 2; case ($width === false || $height === false): // should result in Wx0 or 0xH ???? $width = $width ? $width : ''; $height = $height ? $height : ''; // conteinue through.. case ($width !== false && $height !== false): // make sure it will exist.. $fc = $imap[$matches[1]]->toFileConvert(); $res = $fc->convert($fc->mimetype, $width, $height); //var_dump(array($width, $height, $res)); $a->setAttribute('src', $imap[$matches[1]]->URL("{$width}x{$height}",'/Images/Thumb')); continue 2; } } if (version_compare(PHP_VERSION, '5.3.6') >= 0) { $wrap = $doc->getElementById('pman-cms-page-wrapper'); $html = ''; for ($i = 0; $i < $wrap->childNodes->length; $i++) { /** @var $domElement \DOMElement */ $html .= $doc->saveHTML($wrap->childNodes->item($i)); } } else { $html = preg_replace( '/^/', '', str_replace( array('', '', '', ''), array('', '', '', ''), $doc->saveHTML())); $html = preg_replace('/

\s*<\/p>/i', "

", $html); $html = preg_replace('/<\/p>\s*

/i', "

", $html); $html = preg_replace('/^\s*

\s*<\/p>+/i', "", $html); $html = preg_replace('/^

\s*<\/p>\s*+$/i', "", $html); $html = preg_replace('/<\/p><\/p>$/i', "

", trim($html)); } //$bodys = $doc->getElementsByTagName('BODY'); return $html; } function logReferrer($referer) { //DB_DataObject::debugLevel(1); if (!strlen(trim($referer))) { return; } $url = parse_url($referer); if ( empty($url['host']) || ($url['host'] == $_SERVER['HTTP_HOST']) || preg_match('#^[0-9\.]+$#',$url['host']) ) { return; } // locate previous record? $ref = DB_DataObject::factory('CmsRefer'); $ref->blog_id = $this->id; $ref->setFrom($url); if (!$ref->clean()) { return; } if ($ref->find(true)) { $ref->seen++; $ref->update(); } else { $ref->day = date('Y-m-d'); $ref->seen = 1; $ref->insert(); } } function referrers($showgoogle=false) { //DB_DataObject::debugLevel(1); $r = DB_DataObject::factory('CmsRefer'); $r->blog_id = $this->id; $r->orderBy('checked asc'); // dont validate google $r->whereAdd("host like '%planet%'"); $r->whereAdd('checked_success < 1'); // check old? $r->limit(1); if ($r->find(true)) { $r->checkValid(); } $r = DB_DataObject::factory('CmsRefer'); $r->blog_id = $this->id; $r->whereAdd('checked_success > 0');; $r->selectAdd(); $r->selectAdd('distinct(title), day,sum(seen) as seen, scheme,host,port,path,id,checked_success,query'); $r->groupBy('title'); $r->orderBy('seen desc, host DESC, title ASC'); //$r->orderBy('blog_id desc'); if (!$showgoogle) { $r->whereAdd("host != 'google.com'"); } $r->limit(20); $r->find(); return $r->fetchAll(); } function cleanTitle() { return preg_replace('/[^a-z0-9_]+/i','',preg_replace('/\s+/','_',$this->title)); } function postListFilter($data, $authUser, $q) { // if (!empty($q['_treeview'])) { // // $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); // $mid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu'); // // $c = DB_DAtaObject::Factory('core_enum'); // if (empty($q['_page_type_id']) || !in_array($q['_page_type_id'] , array($pid,$mid))) { // // return $data; // } // // $data = $this->buildTree($data); // // } return $data; } function buildTree($data, $depth= 0) { // data contains a list of the top level eleemnts // we need to add all children (and depth flag?) // build a static query with all the data... static $all = false; static $menu_id = false; if (!$menu_id) { $menu_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu'); } if (!$all) { $cb = DB_DataObject::factory('cms_page'); $cb->autoJoin(array('exclude' => array('extended', 'body'))); $tn = $this->tableName(); // this query is very outdated - should be using page types.. $cb->whereAdd(" ( {$tn}.in_rss = 0 OR ( {$tn}.in_rss = 1 AND LENGTH({$tn}.page_link) > 0 ) ) AND cms_page.parent_id != 0 AND cms_page.translation_of_id = 0 " ); $cb->is_menuitem = $this->is_menuitem; if ($cb->is_menuitem) { $cb->orderBy('cms_page.seq_id ASC'); } else { $cb->orderBy('cms_page.is_element DESC, cms_page.page_link ASC'); } $cb->is_deleted = (empty($_REQUEST['_show_deleted'])) ? 0 : 1; // $disabled = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'disabled'); $cb->find(); while ($cb->fetch()) { if (!isset($all[$cb->parent_id])) { $all[$cb->parent_id] = array(); } // if($cb->page_type_id == $disabled){// does not show the disabled item.... #2012 // continue; // } $all[$cb->parent_id][] = $cb->toArray(); } } $ret = array(); foreach($data as $d) { $d['depth'] = $depth; $ret[] = $d; if (empty($all[$d['id']])) { continue; } // elements first, then order by page link //$cb->orderBy('is_element DESC, page_link ASC'); //$add = $cb->fetchAll(false,false,'toArray'); $add = $this->buildTree($all[$d['id']], $depth +1); foreach($add as $r) { $ret[] = $r; } } return $ret; } function firstImage($filter='image/%') { $i = DB_DataObject::factory('Images'); // DB_DataObject::debugLevel(1); $i->orderBy('displayorder ASC, id ASC'); $im = $i->gather($this, $filter); if (empty($im)) { return false; } return $im[0]; } function firstImageTag($size =-1, $base="/Images/Thumb", $filter='image/%') { $fm = $this->firstImage($filter); if (empty($fm)) { return ''; } return $fm->toHTML($size, $base); } function template() { $d = DB_DataObject::Factory('cms_template'); $d->get($this->template_id); return $d; } function toEventString() { return $this->title; } function toRooSingleArray($req) { $ret = $this->toArray(); if ( !empty($this->template_id_template )) { $ret['template_id_template_clean'] = preg_replace( '#\.html$#i', '', $this->template_id_template ); } $ret = $this->toRooSingleArrayInterests($ret, $req); $ret = $this->toRooSingleArrayCategory($ret, $req); $ret = $this->toRooSingleArrayPageClass($ret, $req); return $ret; } function toRooSingleArrayCategory($ret, $req) { $li = array(); $cms_page_category = DB_DataObject::factory('cms_page_category'); $cms_page_category->autoJoin(); $cms_page_category->page_id = $this->id; $cms_page_category->selectAdd(" cms_page_fullpath(cms_page_category.category_id, ' - ') AS category_id_fullpath "); $categories = $cms_page_category->fetchAll('category_id', 'category_id_fullpath'); foreach($categories as $k => $v) { $li[] = array( 'id' => $k, 'display_fullpath' => $v ); } $ret["categories"] = json_encode($li); return $ret; } function toRooSingleArrayPageClass($ret, $req) { if(empty($ret['page_cls'])){ return $ret; } $li = array(); $core_enum = DB_DataObject::factory('core_enum'); $core_enum->setFrom(array( 'etype' => 'cms_page_class' )); $core_enum->whereAddIn('name', explode(',', $ret['page_cls']), 'string'); foreach($core_enum->fetchAll('name', 'display_name') as $k => $v) { $li[] = array( 'name' => $k, 'display_name' => $v ); } $ret["page_classes"] = json_encode($li); return $ret; } function parent() { $c = DB_DataObject::Factory($this->tableName()); $c->autoJoin(); $c->get($this->parent_id); return $c; } function inLanguage($lang) { if ($lang == $this->language) { return $this; } $x = DB_DataObject::factory("cms_page"); $x->autoJoin(); $x->is_element = $this->is_element; $x->is_draft = $this->is_draft; $x->is_deleted = 0; $x->language = $lang; if ($x->get('translation_of_id', $this->id)) { return $x; } return $this; } function children($cfg) { // DB_DataObject::debugLevel(1); $cfg['type'] = isset($cfg['type'] ) ? $cfg['type'] : ''; $cfg['language'] = isset($cfg['language'] ) ? $cfg['language'] : $this->language; $tn = $this->tableName(); $nc = false; // named column. $p = DB_DataObject::factory('cms_page'); $p->autoJoin(); if (!isset($this->id)) { return array(); } $p->parent_id = !empty($this->translation_of_id) ? $this->translation_of_id : $this->id; $p->is_deleted = 0 ; $p->is_draft = 0; $p->language = $cfg['language']; // print_r($cfg); switch($cfg['type']) {//FIXME in the new cms_page code this is not work? case 'named_blocks': // for childnre.. // if language != english.. //DB_DataObject::debugLevel(1); $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'element'); $nc = 'element_id_name'; $p->whereAdd("{$tn}.element_id != 0"); $p->orderBy("{$tn}.page_link ASC"); $p->language = 'en'; // default to the english .. // we will translate later.. break; case 'pages': //DB_DataObject::debugLevel(1); $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'page'); $p->is_element = 0; $p->orderBy(" {$tn}.seq_id, {$tn}.page_link ASC"); break; case 'elements': $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'element'); $p->orderBy(" {$tn}.seq_id, {$tn}.page_link ASC"); break; case 'blog': //$p->in_rss = 1; $p->page_type_name('blog'); $c = DB_DataObject::Factory('cms_category_type'); $c->get('name', $cfg['category']); $p->category_type_id = $c->id; $p->orderBy("{$tn}.published DESC"); break; case 'menu': $p->page_type_id = DB_DataObject::factory('core_enum')->lookup("cms_page_type", 'menu'); // $p->is_menu = 1; //DB_DataObject::debugLevel(1); //$p->is_menuitem = 1; //?? needed??? $p->orderBy(" CASE WHEN {$tn}.translation_of_id > 0 THEN join_translation_of_id_id.seq_id ELSE {$tn}.seq_id END ASC "); // $p->orderBy("{$tn}.seq_id ASC"); break; default: die("bad config for cms_page call - needs type"); } if (!empty($cfg['limit'])) { //ofsset.. $p->limit((int)$cfg['limit']); } if (!$nc) { if($cfg['type'] == 'menu'){// if not found the language translate then get the en // print_r($p); // $pp = clone($p); if($p->count() > 0){ return $p->fetchAll(); } $p->language = 'en'; return $p->fetchAll(); } return $p->fetchAll(); } $p->find(); $ret = array(); while($p->fetch()) { // if we have multiple children... with the same block name... if (isset($ret[$p->{$nc}])) { if (!is_array($ret[$p->{$nc}])) { $ret[$p->{$nc}] = array($ret[$p->{$nc}]); } $ret[$p->{$nc}][] = clone($p); } else { $ret[$p->{$nc}] = clone($p); } } if (empty($ret)) { return $ret; } if ($cfg['language'] != 'en' && $cfg['type'] == 'named_blocks') { // our search results are currently english. // find the 'id's of the $ids = array(); // DB_DataObject::debugLevel(1); foreach($ret as $k=>$v) { $ids[] = is_object($v) ? $v->id : $v[0]->id; } $pg = DB_DAtaObject::Factory('cms_page'); $pg->autoJoin(); $pg->whereAddIn("{$tn}.translation_of_id", $ids, 'int'); $pg->language = $cfg['language']; $pg->is_deleted = 0; $pg->find(); $tr = array(); while ($pg->fetch()) { $tr[$pg->translation_of_id] = clone($pg); } foreach($ret as $k=>$v) { $id = is_object($v) ? $v->id : $v[0]->id; if (isset($tr[$id])) { $ret[$k] = $tr[$id]; } } } return $ret; } function youtube() // asTech project - depricated - do not use.. { return $this->videoPageLink('page_link'); } function videoPageLink($prop = 'title') //prettybooked { $ar = parse_url($this->{$prop}); if(empty($ar['host'])){ return $this->{$prop}; } switch(true) { case preg_match('/youtube/',$ar['host']): $t= array_pop(explode('/', $ar['query'])); $t = array_pop(explode('v=', $t)); return 'http://www.youtube.com/embed/' . $t; case preg_match('/vimeo/',$ar['host']): $t= array_pop(explode('/', $ar['path'])); return "http://player.vimeo.com/video/". $t; default:// detault does not work? return $this->{$prop}; } } // this will be depricated function beforeInsert($request,$roo) { if(!empty($request['_copy_of'])){ $this->copy($request['_copy_of'], $roo); } if(isset($request['_stylesheets'])){ $this->updateStylesheets($request['_stylesheets'], $roo); } if(isset($request['page_type_id'])){ $this->assignOldConditions($request); } if(empty($request['language'])){ $this->language = 'en'; } if (!empty($request['translation_of_id'])) { $p = DB_DataObject::Factory('cms_page'); $p->get($request['translation_of_id']); $this->page_type_id = $p->page_type_id; $dupe = DB_DataObject::Factory('cms_page'); $dupe->translation_of_id = $this->translation_of_id; $dupe->language = $this->language; if ($dupe->count()) { $roo->jerr("a translated version already exists"); } } $this->validateParent($roo); //check the page link is duplicate, then return error if(!empty($request['page_link'])){ $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element'); if($this->page_type_id != $eid){ $x = DB_DataObject::factory('cms_page'); $x->page_type_id = $this->page_type_id; if(!empty($request['page_link']) && $x->get('page_link', $request['page_link'])){ $roo->jerr('Sorry, this page link exists already.'); } } } } function onInsert($q,$roo) { $this->retrieveAutoSave(); if(isset($q['interest']) && strpos($roo->appModules, 'Crm') !== false){ $this->updateInterests($q['interest'], $roo); } if(isset($q['category'])){ $this->updatecategory(empty($q['category']) ? array() : array_unique(array_filter(explode(',', $q['category']))), $roo); } } function onUpdate($old, $q,$roo) { if(isset($q['interest']) && strpos($roo->appModules, 'Crm') !== false){ $this->updateInterests($q['interest'], $roo); } if(isset($q['category'])){ $this->updatecategory(empty($q['category']) ? array() : array_unique(array_filter(explode(',', $q['category']))), $roo); } } function retrieveAutoSave() { $events = DB_DataObject::factory('Events'); $events->on_table = $this->tableName(); $events->on_id = 0; $events->action = 'AUTOSAVE'; foreach ($events->fetchAll() as $e){ $ee = clone($e); $e->on_id = $this->id; $e->update($ee); } } function validateParent($roo) { if ($this->id && $this->parent_id == $this->id) { $roo->jerr("parent must not be same as page"); } if (!empty($this->parent_id)) { $p = DB_DataObject::factory('cms_page'); $p->get($this->parent_id); switch($this->page_type()->name) { case 'page': case 'element': if ($p->page_type()->name != 'page') { $roo->jerr("parent must be of type page"); } break; case 'menu': if ($p->page_type()->name != 'menu') { $roo->jerr("parent must be of type menu"); } break; case 'blog': case 'category': if ($p->page_type()->name != 'category') { $roo->jerr("parent must be of type menu"); } break; default: // unknow type?!?! break; } } } function beforeUpdate($old, $request,$roo) { if(!empty($request['_move'])){ $this->updatePageSeq($request['_move'], $roo); } if(isset($request['page_type_id'])){ $this->assignOldConditions($request); } $this->validateParent($roo); if(!empty($request['page_link'])){ //checking for the system page, then cannot be edit page link if($old->is_system_page && ( ($old->page_link != $request['page_link']) || ($old->element_id != $request['element_id']) ) ) { $roo->jerr('Sorry, you cannot change the page link, or block for system items.'); } //check the page link is duplicate, then return error if(!empty($request['page_link'])){ $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element'); if($this->page_type_id != $eid){ // element ignore page link checking.. $x = DB_DataObject::factory('cms_page'); $x->page_type_id = $this->page_type_id; // make sure they are of the same type.. if($x->get('page_link', $request['page_link']) && ($old->page_link != $request['page_link'])){ $roo->jerr('Sorry, this page link is existing on the system.'); } } } } $page_type = $this->page_type(); if( $page_type->name == 'blog' && $old->is_draft == 1 && $this->is_draft == 0 && ( empty($this->published) || $this->published == '0000-00-00 00:00:00' ) ){ $this->published = date('Y-m-d'); } } function page_type() { $c = DB_DataObject::factory('core_enum'); $c->get($this->page_type_id); return $c; } /** * get or set page type... */ function page_type_name() { $args = func_get_args(); if (!$args) { return isset($this->page_type_id_name) ? $this->page_type_id_name : $this->page_type()->name; } $cid = DB_DataObject::factory('core_enum')->lookup("cms_page_type", $args[0]); if ($cid) { $this->page_type_id = $cid; return $args[0]; } return false; } function assignOldConditions($request) { $c = DB_DataObject::factory('core_enum'); $c->get($request['page_type_id']); switch ($c->name) { case 'page' : $this->in_rss = 0; $this->is_element = 0; $this->is_menuitem = 0; break; case 'element' : $this->in_rss = 0; $this->is_element = 1; $this->is_menuitem = 0; break; case 'blog' : $this->in_rss = 1; $this->is_element = 0; $this->is_menuitem = 0; break; case 'menu' : $this->in_rss = 0; $this->is_element = 0; $this->is_menuitem = 1; break; case 'category' : $this->in_rss = 0; $this->is_element = 0; $this->is_menuitem = 0; break; } } function convertOld() { static $map = false; if (!$map) { $c = DB_DataObject::factory('core_enum'); $c->etype = 'cms_page_type'; $c->active = 1; $map = $c->fetchAll('name', 'id'); } $old = clone($this); $opt = $this->page_type_id ; switch(true) { case (!$this->in_rss && ! $this->is_element && ! $this->is_menuitem): $this->page_type_id = $map['page']; break; case (!$this->in_rss && $this->is_element && ! $this->is_menuitem): $this->page_type_id = $map['element']; break; case (!$this->in_rss && !$this->is_element && $this->is_menuitem): $this->page_type_id = $map['menu']; break; case ($this->in_rss && !$this->is_element && !$this->is_menuitem): $this->page_type_id = $map['blog']; break; } //echo "NEW: {$this->page_type_id } / old: {$old->page_type_id}\n"; if ($this->page_type_id != $old->page_type_id) { $this->update($old); } } function initMenu($data = array()) { echo "Starting Menu ..... \n"; $menu_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu'); foreach($data as $parent){ $prt = DB_DataObject::factory($this->tableName()); if($prt->get('page_link', $parent['page_link'])){ continue; } $prt->title = $parent['title']; $prt->is_menuitem = 1; $prt->is_system_page = 1; $prt->language = 'en'; $prt->created = Date('Y-m-d H:i:s'); $prt->page_type_id = $menu_id; $prt->insert(); foreach($parent['cn'] as $child){ $c = DB_DataObject::factory($this->tableName()); $page_link = (!empty($child['hide_parent'])) ? $child['page_link'] : ($prt->page_link.'/'.$child['page_link']); if(!$c->get('page_link', $page_link)){ $c->title = empty($child['title']) ? '' : $child['title']; $c->is_menuitem = 1; // $c->is_system_page = 1; $c->created = Date('Y-m-d H:i:s'); $c->parent_id = $prt->id; $c->language = 'en'; $c->page_type_id = $menu_id; $c->seq_id = empty($child['seq_id']) ? 0 : $child['seq_id']; $c->target_url = empty($child['target_url']) ? '' : $child['target_url']; $c->insert(); } } } } function preview($roo) { // $this->autoJoin(); not needed called already in roo. if ($this->page_type_id_name == 'element') { return $this->parent()->preview($roo); } // set up the template engine to render from the site.. $opts = HTML_FlexyFramework::get()->Pman_Cms; if (!isset($opts['basePHP'])) { $roo->jerr(" Pman_Cms[basePHP] is not set "); } $basePHP = $opts['basePHP']; // for blog if ($this->page_type_id_name == 'blog' && empty($this->page_link)) { if(!isset($opts['blog'])){ $roo->jerr("Pman_Cms['blog'] is not set"); } header('Location: ' . $roo->rootURL .'/'. $opts['blog'] . '/' . $this->id); exit; } // for page $strip = 0; $pl = $this->page_link; if (is_array($opts['basePHP'])) { foreach($opts['basePHP'] as $k=>$v) { if ($k == substr($pl,0, strlen($k))) { $pl = substr($pl, strlen($k)+1); $basePHP = $v; $matched = true; break; } } if (!$matched) { $roo->jerr(" page link does not match any configured site."); } } switch($pl) { case 'Home': case 'Site': $pl = ''; break; default: $pl = '/' . $pl; break; // do nothing. } header('Location: ' . $roo->rootURL .'/'. $basePHP . $pl ); exit; /* require_once 'Pman/Cms/Preview.php'; $p = new Pman_Cms_Preview(); // set up the basic params.. $p->rootURL = $roo->rootURL; $p->baseURL = $roo->rootURL . '/'. $opts['basePHP'] ; $p->loadPage('Site'); // loads any blocks from site. $p->loadPage('Site/*'); // loads any blocks from site. $p->loadPage('Home'); // loads any blocks from site. $p->page = $p->loadPage($this->page_link); $fo = &PEAR::getStaticProperty('HTML_Template_Flexy', 'options'); $fo['templateDir'] = $opts['templateDir']; $fo['forceCompile'] = true; if (isset($opts['url_rewrite'])) { $fo['url_rewrite'] = $opts['url_rewrite']; } $p->output(); exit; */ } function getStoreName() { $opts = HTML_FlexyFramework::get()->Pman; $dir = "{$opts['storedir']}/cms_page"; if(!file_exists($dir)){ $oldumask = umask(0); mkdir($dir, 0775, true); umask($oldumask); } return implode( '/', array( $dir, $this->id . '.png' )); } function syncTemplatePage($pgdata) { if (empty($pgdata['page_link'])) { return; // shoud not happen.. } $link = $pgdata['page_link']; $page_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); $cmsPage = DB_DataObject::factory('cms_page'); $cmsPage->setFrom(array( 'page_link' => $link, 'page_type_id' => $page_id, 'translation_of_id' => 0, 'is_element' => 0, )); $parent = 0; if(!$cmsPage->find(true)){ $cmsPage = DB_DataObject::factory('cms_page'); } else { // existing parent.. $parent = $cmsPage->parent_id; } // attempt to find the parent.. if (!$parent && strpos($link,'/') !== false) { $par = explode('/', $link); array_pop($par); $pname = implode('/', $par); $cmsPageP = DB_DataObject::factory('cms_page'); if ($cmsPageP->get('page_link',$pname)) { $parent = $cmsPageP->id; } } // echo "$ori_n <<<< $is_static \n"; $run_opts = HTML_FlexyFramework::get()->page->opts; $cmsPage->setFrom(array( 'parent_id' => $parent, 'page_link' => $link, 'page_type_id' => $page_id, 'template_id' => !empty($pgdata['template_object']) ? $pgdata['template_object']->id : 0, 'language' => 'en', 'translation_of_id' => 0, 'is_system_page' => 1, 'is_element' => 0, 'is_static' => 0, // not sure what this is supposed to indicate.. 'updated' => $this->sqlValue('NOW()'), 'created' => $this->sqlValue('NOW()'), )); //print_r($contentStrings); if (!$cmsPage->id) { $cmsPage->title = $link; } $contentStrings = !empty($pgdata['template_object']) ? $pgdata['template_object']->contentStrings : false; if ($contentStrings && (!empty($run_opts['force-content-update']) || !$cmsPage->id) ) { // only do this for the initila load foreach( array('title', 'body', 'extended') as $prop) { if (isset($contentStrings['{page.'. $prop.'}'])) { $cmsPage->{$prop} = $contentStrings['{page.'. $prop.'}']; } if (isset($contentStrings['{page.'. $prop.':h}'])) { $cmsPage->{$prop} = $contentStrings['{page.'. $prop.':h}']; } if (isset($contentStrings['{page.'. $prop.'ToDisplayHtml():h}'])) { $cmsPage->{$prop} = $contentStrings['{page.'. $prop.'ToDisplayHtml():h}']; } echo "cmsPage->{$prop} = ". $cmsPage->{$prop} ."\n"; } } if(!$cmsPage->id){ $cmsPage->insert(); } else { $cmsPage->update(); } return clone($cmsPage); } function toSitemapAll($xml, $site_base) { $this->is_draft = 0; $x->is_deleted = 0; $this->page_type_id = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); $ar = $this->fetchAll(); // print_r($ar); $except = array('Home', 'Site'); foreach($ar as $o) { $link = explode('/', $o->page_link); if(in_array($link[0], $except)){ continue; } $url = $site_base."/".str_replace('%2F', '/', rawurlencode($o->page_link)); $tmpXml = $xml->addChild("url"); $tmpXml->addChild("loc", $url); $tmpXml->addChild("changefreq", "weekly"); $tmpXml->addChild("priority", 1); $time = $o->updated; if(!$time || $time == '0000-00-00 00:00:00'){ $time = '2000-01-01 00:00:00'; } $tmpXml->addChild("lastmod", date("Y-m-d", strtotime($time))); // $a = $xml->addChild("url"); // $a->addChild("loc", 'http://www.prettybooked.com'); // $a = $xml->addChild("url"); // $a->addChild("loc", 'http://www.prettybooked.com2'); } // return $xml; } function comments($count = false) { $comments = DB_DataObject::factory('cms_comments'); $comments->ontable = 'cms_page'; $comments->entry_id = $this->id; if(!empty($count)){ return $comments->count(); } $comments->_join .= ' LEFT JOIN Person ON Person.email = cms_comments.email '; $person = DB_DataObject::Factory('core_person'); $comments->selectAs($person, 'person_%s'); $comments->orderBy('posted ASC'); return $comments->fetchAll(); } function beforeDelete($dependants_array, $roo) { $this->beforeDeleteInterests($dependants_array, $roo); } /**---------- crm related interest - no idea how this snuck in here --*/ function beforeDeleteInterests($dependants_array, $roo) { // why is this using crm interest??? $ff = HTML_FlexyFramework::get(); if (!in_array('Crm', $ff->enableArray)) { return; } $interest = DB_DataObject::factory('crm_interest'); $interest->onid = $this->id; $interest->ontable = $this->tableName(); foreach($interest->fetchAll() as $i){ $i->delete(); } } function updateInterests($interests = array(), $roo = false) { $ff = HTML_FlexyFramework::get(); if (!in_array('Crm', $ff->enableArray)) { return; } $type = $this->page_type(); if($type->name != 'blog'){ return; } $exists = $this->interests(); $interests = array_filter(explode(',', $interests)); foreach ($interests as $i){ if(array_key_exists($i, $exists)){ unset($exists[$i]); continue; } $ci = DB_DataObject::factory('crm_interest'); $ci->setFrom(array( 'onid' => $this->id, 'ontable' => $this->tableName(), 'interest_id' => $i, 'created_dt' => $ci->sqlValue("NOW()") )); $ci->insert(); } foreach ($exists as $e){ $e->delete(); } } function updatecategory($category = array(), $roo = false) { $exists = $this->categories(); foreach ($category as $c){ if(array_key_exists($c, $exists)){ unset($exists[$c]); continue; } $cms_page_category = DB_DataObject::factory('cms_page_category'); $cms_page_category->setFrom(array( 'page_id' => $this->id, 'category_id' => $c )); $cms_page_category->insert(); } foreach ($exists as $e){ $e->delete(); } } function categories() { $cms_page_category = DB_DataObject::factory('cms_page_category'); $cms_page_category->setFrom(array( 'page_id' => $this->id )); $cms_page_category->find(); $ret = array(); while ($cms_page_category->fetch()){ $o = clone($cms_page_category); $ret[$o->category_id] = $o; } return $ret; } function interests() { $ff = HTML_FlexyFramework::get(); if (!in_array('Crm', $ff->enableArray)) { return array(); } $i = DB_DataObject::factory('crm_interest'); $i->autoJoin(); $i->onid = $this->id; $i->ontable = $this->tableName(); $i->find(); $ret = array(); while ($i->fetch()){ $ii = clone($i); $ret[$ii->interest_id] = $ii; } return $ret; } function toRooSingleArrayInterests($ret, $req) { $ff = HTML_FlexyFramework::get(); if (!in_array('Crm', $ff->enableArray)) { return $ret; } if($ret['page_type_id_name'] == 'blog') { $li = array(); $interest = DB_DataObject::factory('crm_interest'); $interest->autoJoin(); $interest->onid = $this->id; $interest->ontable = $this->tableName(); $interest = $interest->fetchAll('interest_id', 'interest_id_display_name'); foreach($interest as $k => $v) { $li[] = array( 'id' => $k, 'display_name' => $v ); } $ret["interests"] = json_encode($li); } return $ret; } function extra_css() { if (empty($this->extra_css)) { return ''; } return "\n"; } function stylesheets($roo) { $enum = DB_DataObject::factory('core_enum'); $enum->setFrom(array( 'etype' => 'Cms.Settings', 'active' => 1, 'name' => 'stylesheets' )); $stylesheets = $enum->fetchAll('display_name'); $stylesheets = implode("\n", $stylesheets); $roo->jdata(array( '_stylesheets' => $stylesheets )); } function updateStylesheets($stylesheets, $roo) { $stylesheets = empty($stylesheets) ? array() : array_unique(array_filter(explode("\n", $stylesheets))); $enum = DB_DataObject::factory('core_enum'); $enum->setFrom(array( 'etype' => 'Cms.Settings', 'active' => 1, 'name' => 'stylesheets' )); $enum->find(); while ($enum->fetch()){ $o = clone ($enum); if(in_array($o->display_name, $stylesheets)){ unset($stylesheets[array_search($o->display_name, $stylesheets)]); continue; } $o->delete(); } foreach ($stylesheets as $s){ $enum = DB_DataObject::factory('core_enum'); $enum->setFrom(array( 'etype' => 'Cms.Settings', 'active' => 1, 'name' => 'stylesheets', 'display_name' => $s )); $enum->insert(); } $roo->jok('DONE'); } function build_tree_sequence($page_type_id) { $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); $mid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'menu'); $cid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'category'); if(empty($page_type_id) || !in_array($page_type_id, array($pid, $mid, $cid))){ return; } $cms_page = DB_DataObject::factory('cms_page'); $cms_page->setFrom(array( 'page_type_id' => $page_type_id, 'parent_id' => 0 )); if($page_type_id == $pid){ $cms_page->orderBy('cms_page.page_link ASC'); } else { $cms_page->orderBy('cms_page.seq_id ASC'); } $data = $cms_page->fetchAll(); $this->_build_tree_sequence($data, 0, 0); } function _build_tree_sequence($data, $sequence, $depth) { foreach ($data as $d){ $dd = clone ($d); $d->setFrom(array( 'tree_sequence' => $sequence, 'tree_depth' => $depth )); $d->update($dd); $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); $cms_page = DB_DataObject::factory('cms_page'); $cms_page->setFrom(array( 'parent_id' => $d->id, 'page_type_id' => $d->page_type_id )); if($d->page_type_id == $pid){ $cms_page->orderBy('cms_page.page_link ASC'); } else { $cms_page->orderBy('cms_page.seq_id ASC'); } $children = $cms_page->fetchAll(); $seq = $sequence + 1; $dep = $depth + 1; $sequence = $this->_build_tree_sequence($children, $seq, $dep); } return $sequence; } function toPublicData($country = false) { $ret = array(); if(empty($this->id)){ return $ret; } $children = DB_DataObject::factory('cms_page'); $children->autoJoin(); $children->setFrom(array( 'parent_id' => (!empty($this->translation_of_id)) ? $this->translation_of_id : $this->id, 'is_draft' => 0, 'is_deleted' => 0, 'is_element' => 1, 'translation_of_id' => 0 )); $children->whereAdd('cms_page.element_id != 0'); $children->orderBy('cms_page.seq_id ASC'); $ff = HTML_FlexyFramework::get(); foreach ($children->fetchAll() as $c){ $cc = $c->inLanguage($ff->locale); if(!isset($ret[$c->element_id_name])){ $ret[$c->element_id_name] = array(); } $image = DB_DataObject::factory('Images'); $image->setFrom(array( 'ontable' => 'cms_page', 'onid' => $c->id )); $image->orderBy('Images.displayorder ASC'); $bgimage = $image->fetchAll(false, false, 'toArray'); $video = false; $player = (empty($country) || $country != 'CN') ? 'youtu.be' : 'youku.com'; foreach ($bgimage as $k => $v) { if(empty($v['linkurl'])){ continue; } if(!preg_match('/(youtu.be|youku.com)/i', $v['linkurl'])){ continue; } if(strpos($v['linkurl'], $player) === false){ if(empty($video)){ $video = $v; } unset($bgimage[$k]); continue; } $video = $v; unset($bgimage[$k]); } if(!empty($video)){ array_unshift($bgimage, $video); } $ret[$c->element_id_name][] = array( 'size' => (empty($c->template_id_template)) ? '' : $c->template_id_template, 'title' => $cc->title, 'html' => $cc->body, 'extended' => $cc->extended, 'href' => $c->page_link, 'cls' => implode(' ', explode(',', $c->page_cls)), 'bgimage' => $bgimage ); } $ret['page'] = array( 'target' => (!empty($this->translation_of_id)) ? $this->translation_of_id : $this->id, 'title' => $this->title, 'body' => $this->body ); return $ret; } function gatherMenu($name) { $ret = array(); $cms_page = DB_DataObject::factory('cms_page'); $cms_page->setFrom(array( 'is_draft' => 0, 'is_deleted' => 0, 'page_link' => $name, 'is_menuitem' => 1 )); $cms_page->orderBy('cms_page.seq_id ASC'); if(empty($name) || !$cms_page->find(true)){ return $ret; } return $cms_page->gatherSubMenu(); } function gatherSubMenu() { $ret = array(); if(empty($this->id)){ return $ret; } $ff = HTML_FlexyFramework::get(); $cfg = array( 'type' => 'menu', 'language' => 'en' ); $sub = $this->children($cfg); foreach ($sub as $k => $v){ $vv = $v->inLanguage($ff->locale); $item = array( 'target' => (empty($v->menu_page_id)) ? 0 : $v->menu_page_id, 'html' => $vv->title, 'href' => empty($v->menu_page_id_page_link) ? '' : $v->menu_page_id_page_link ); $item['children'] = $v->gatherSubMenu(); $ret[] = $item; } return $ret; } function dump_pages($q, $au, $roo) { if (!extension_loaded('zip')) { // sudo apt-get install php5.6-zip?? die('Please install php zip extension'); } $pages = array(); $cms_page = DB_DataObject::factory('cms_page'); foreach ($cms_page->fetchAll() as $cp){ $pages[$cp->id] = $cp->toArray(); } $types = array(); $core_enum = DB_DataObject::factory('core_enum'); $core_enum->setFrom(array( 'etype' => 'cms_page_type', 'active' => 1 )); foreach ($core_enum->fetchAll() as $ce){ $types[$ce->id] = $ce->toArray(); } $categories = array(); $cms_page_category = DB_DataObject::factory('cms_page_category'); foreach ($cms_page_category->fetchAll() as $cpc){ $categories[$cpc->id] = $cpc->toArray(); } $templates = array(); $cms_template = DB_DataObject::factory('cms_template'); foreach ($cms_template->fetchAll() as $ct){ $templates[$ct->id] = $ct->toArray(); } $elements = array(); $cms_template_element = DB_DataObject::factory('cms_template_element'); foreach ($cms_template_element->fetchAll() as $cte){ $elements[$cte->id] = $cte->toArray(); } $images = array(); $photos = array(); $img = DB_DataObject::factory('Images'); $img->setFrom(array( 'ontable' => 'cms_page' )); foreach ($img->fetchAll() as $i){ $images[$i->id] = $i->toArray(); if(!array_key_exists($i->filename, $photos)){ $photos[$i->filename] = $i->getStoreName(); } } $json = json_encode(array( 'pages' => $pages, 'types' => $types, 'categories' => $categories, 'templates' => $templates, 'elements' => $elements, 'images' => $images, 'photos' => array_keys($photos) )); $zipFile = $roo->tempName('zip'); $zip = new ZipArchive(); if ($zip->open($zipFile, ZipArchive::CREATE) !== TRUE) { die('Can not create zip file'); } $zip->addFromString('data.json', $json); foreach ($photos as $name => $path){ $zip->addFile($path, $name); } $zip->close(); require_once 'File/Convert.php'; $fc= new File_Convert($zipFile, 'pplication/zip'); $fn = $fc->convert('pplication/zip'); $fc->serve('attachment', 'cms-page-dummy-page.zip', true); exit; } function applyFilterTemplateElements($q, $au, $roo) { $cms_page = DB_DataObject::factory('cms_page'); if(!$cms_page->get($q['_list_elements'])){ $roo->jerr('Invalid id'); } $pid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'page'); if($cms_page->page_type_id != $pid || empty($cms_page->template_id)){ $roo->jdata(array()); } $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element'); $items = DB_DataObject::factory('cms_page'); $items->autoJoin(); $items->setFrom(array( 'parent_id' => $cms_page->id, 'is_element' => 1, 'page_type_id' => $eid )); $items->whereAdd('cms_page.element_id != 0 AND cms_page.translation_of_id = 0'); if (empty($q['_show_deleted'])) { $items->is_deleted = 0 ; } $items->selectAdd(); $items->selectAdd(" cms_page.id AS id, cms_page.title AS title, join_element_id_id.name AS element_id_name, cms_page.seq_id AS seq_id, cms_page.is_draft AS is_draft, cms_page.is_deleted AS is_deleted, cms_page.language AS language, join_template_id_id.template AS template_id_template, ( SELECT GROUP_CONCAT(cp.language SEPARATOR ',') FROM cms_page AS cp WHERE cp.translation_of_id = cms_page.id ) AS translation_type, ( SELECT id FROM Images WHERE Images.ontable = 'cms_page' AND Images.onid = cms_page.id ORDER BY Images.displayorder ASC LIMIT 1 ) AS primary_image_id "); $items->orderBy("join_element_id_id.name ASC, cms_page.seq_id ASC"); $total = $items->count(); $start = (empty($q['start'])) ? 0 : $q['start']; $limit = (empty($q['limit'])) ? 25 : $q['limit']; $items->limit($start, $limit); $ret = $items->fetchAll(false, false, 'toArray'); $roo->jdata($ret, $total); } function updatePageSeq($type, $roo) { $this->reOrderSeq($roo); $target = DB_DataObject::factory('cms_page'); $target->get($this->id); $cms_page = DB_DataObject::factory('cms_page'); $cms_page->setFrom(array( 'is_draft' => 0, 'is_deleted' => 0, 'parent_id' => $target->parent_id, 'element_id' => $target->element_id, 'page_type_id' => $target->page_type_id, 'is_element' => 1 )); switch ($type) { case 'down' : $cms_page->whereAdd("cms_page.seq_id > {$target->seq_id}"); $cms_page->orderBy('cms_page.seq_id ASC'); break; case 'up' : $cms_page->whereAdd("cms_page.seq_id < {$target->seq_id}"); $cms_page->orderBy('cms_page.seq_id DESC'); break; } if(!$cms_page->find(true)){ $roo->jok('OK'); } $ot = clone($target); $oc = clone($cms_page); $target->seq_id = $oc->seq_id; $cms_page->seq_id = $ot->seq_id; $target->update($ot); $cms_page->update($oc); $roo->jok('OK'); } function reOrderSeq($roo) { $cms_page = DB_DataObject::factory('cms_page'); $cms_page->setFrom(array( 'is_draft' => 0, 'is_deleted' => 0, 'parent_id' => $this->parent_id, 'element_id' => $this->element_id, 'page_type_id' => $this->page_type_id, 'is_element' => 1 )); $validate = clone($cms_page); $validate->selectAdd(); $validate->selectAdd(" DISTINCT(cms_page.seq_id) AS seq_id, COUNT(cms_page.id) AS total "); $validate->groupBy('cms_page.seq_id'); $validate->having('total > 1'); $validate->limit(1); $res = $validate->fetchAll(); if(empty($res)){ // looks good... return; } $cms_page->orderBy('cms_page.seq_id ASC, cms_page.id ASC'); foreach ($cms_page->fetchAll() as $k => $v){ $o = clone($v); $v->seq_id = $k + 1; $v->update($o); } return; } function copy($id, $roo) { $cms_page = DB_DataObject::factory('cms_page'); if(empty($id) || !$cms_page->get($id)){ $roo->jerr('Invalid id'); } $n = DB_DataObject::factory('cms_page'); $n->setFrom($cms_page->toArray()); $n->setFrom(array( 'title' => (!empty($cms_page->title)) ? "Copy of {$cms_page->title}" : '', 'page_link' => (!empty($cms_page->page_link)) ? "{$cms_page->page_link}-copy" : '', 'updated' => date('Y-m-d H:i:s'), 'created' => date('Y-m-d H:i:s') )); $n->insert(); $images = DB_DataObject::factory('Images'); $images->setFrom(array( 'ontable' => 'cms_page', 'onid' => $cms_page->id )); foreach ($images->fetchAll() as $i){ $ni = DB_DataObject::factory('Images'); $ni->setFrom(array( 'ontable' => 'cms_page', 'onid' => $n->id )); $ni->createFrom($i->getStoreName(), $i->filename); if(!empty($ni->err)){ $roo->jerr($ni->err); } } $eid = DB_DataObject::factory('core_enum')->lookup('cms_page_type', 'element'); $elements = DB_DataObject::factory('cms_page'); $elements->setFrom(array( 'parent_id' => $cms_page->id, 'is_element' => 1, 'page_type_id' => $eid )); $elements->whereAdd('cms_page.element_id != 0 AND cms_page.translation_of_id = 0'); foreach ($elements->fetchAll() as $element) { $ne = DB_DataObject::factory('cms_page'); $ne->setFrom($element->toArray()); $ne->setFrom(array( 'parent_id' => $n->id, 'title' => (!empty($element->title)) ? "Copy of {$element->title}" : '', 'page_link' => (!empty($element->page_link)) ? "{$element->page_link}-copy" : '', 'updated' => date('Y-m-d H:i:s'), 'created' => date('Y-m-d H:i:s') )); $ne->insert(); $images = DB_DataObject::factory('Images'); $images->setFrom(array( 'ontable' => 'cms_page', 'onid' => $element->id )); foreach ($images->fetchAll() as $i){ $nei = DB_DataObject::factory('Images'); $nei->setFrom(array( 'ontable' => 'cms_page', 'onid' => $ne->id )); $nei->createFrom($i->getStoreName(), $i->filename); if(!empty($nei->err)){ $roo->jerr($nei->err); } } } $roo->jok($n->id); } }