Index: branches/RC/core/units/categories/categories_tag_processor.php =================================================================== diff -u -N --- branches/RC/core/units/categories/categories_tag_processor.php (revision 11963) +++ branches/RC/core/units/categories/categories_tag_processor.php (revision 0) @@ -1,2077 +0,0 @@ -getObject($params); - - if (isset($params['today']) && $params['today']) { - $sql = 'SELECT COUNT(*) - FROM '.$object->TableName.' - WHERE (ParentPath LIKE "'.$object->GetDBField('ParentPath').'%") AND (CreatedOn > '.(adodb_mktime() - 86400).')'; - return $this->Conn->GetOne($sql) - 1; - } - - return $object->GetDBField('CachedDescendantCatsQty'); - } - - /** - * Returns category count in system - * - * @param Array $params - * @return int - */ - function CategoryCount($params) - { - $count_helper =& $this->Application->recallObject('CountHelper'); - /* @var $count_helper kCountHelper */ - - $today_only = isset($params['today']) && $params['today']; - return $count_helper->CategoryCount($today_only); - } - - function IsNew($params) - { - $object =& $this->getObject($params); - return $object->GetDBField('IsNew') ? 1 : 0; - } - - function IsPick($params) - { - return $this->IsEditorsPick($params); - } - - /** - * Returns item's editors pick status (using not formatted value) - * - * @param Array $params - * @return bool - */ - function IsEditorsPick($params) - { - $object =& $this->getObject($params); - - return $object->GetDBField('EditorsPick') == 1; - } - - function ItemIcon($params) - { - // only for categories, not structure - if ($this->Prefix != 'c') { - return parent::ItemIcon($params); - } - - $object =& $this->getObject($params); - if ($object->GetDBField('IsMenu')) { - $status = $object->GetDBField('Status'); - if ($status == 1) { - $ret = $object->GetDBField('IsNew') ? 'icon16_cat_new.gif' : 'icon16_folder.gif'; - } - else { - $ret = $status ? 'icon16_cat_pending.gif' : 'icon16_cat_disabled.gif'; - } - } - else { - $ret = 'icon16_folder-red.gif'; - } - - return $ret; - } - - function ItemCount($params) - { - $object =& $this->getObject($params); - $ci_table = $this->Application->getUnitOption('l-ci', 'TableName'); - - $sql = 'SELECT COUNT(*) - FROM ' . $object->TableName . ' c - LEFT JOIN ' . $ci_table . ' ci ON c.CategoryId = ci.CategoryId - WHERE (c.TreeLeft BETWEEN ' . $object->GetDBField('TreeLeft') . ' AND ' . $object->GetDBField('TreeRight') . ') AND NOT (ci.CategoryId IS NULL)'; - return $this->Conn->GetOne($sql); - } - - function ListCategories($params) - { - return $this->PrintList2($params); - } - - function RootCategoryName($params) - { - return $this->Application->ProcessParsedTag('m', 'RootCategoryName', $params); - } - - function CheckModuleRoot($params) - { - $module_name = getArrayValue($params, 'module') ? $params['module'] : 'In-Commerce'; - $module_root_cat = $this->Application->findModule('Name', $module_name, 'RootCat'); - - $additional_cats = $this->SelectParam($params, 'add_cats'); - if ($additional_cats) { - $additional_cats = explode(',', $additional_cats); - } - else { - $additional_cats = array(); - } - - if ($this->Application->GetVar('m_cat_id') == $module_root_cat || in_array($this->Application->GetVar('m_cat_id'), $additional_cats)) { - $home_template = getArrayValue($params, 'home_template'); - if (!$home_template) return; - $this->Application->Redirect($home_template, Array('pass'=>'all')); - }; - } - - function CategoryPath($params) - { - $category_helper =& $this->Application->recallObject('CategoryHelper'); - /* @var $category_helper CategoryHelper */ - - return $category_helper->NavigationBar($params); - } - - /** - * Shows category path to specified category - * - * @param Array $params - * @return string - */ - function FieldCategoryPath($params) - { - $object =& $this->getObject(); - /* @var $object kDBItem */ - - $field = $this->SelectParam($params, 'name,field'); - $category_id = $object->GetDBField($field); - - if ($category_id) { - $params['cat_id'] = $category_id; - return $this->CategoryPath($params); - } - - return ''; - } - - function CurrentCategoryName($params) - { - $cat_object =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix.'_List'); - $sql = 'SELECT '.$this->getTitleField().' - FROM '.$cat_object->TableName.' - WHERE CategoryId = '.$this->Application->GetVar('m_cat_id'); - return $this->Conn->GetOne($sql); - } - - /** - * Returns current category name - * - * @param Array $params - * @return string - * @todo Find where it's used - */ - function CurrentCategory($params) - { - return $this->CurrentCategoryName($params); - } - - function getTitleField() - { - $ml_formatter =& $this->Application->recallObject('kMultiLanguage'); - return $ml_formatter->LangFieldName('Name'); - } - - function getCategorySymLink($category_id) - { - static $cache = null; - - if (!isset($cache)) { - $id_field = $this->Application->getUnitOption($this->Prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($this->Prefix, 'TableName'); - - $sql = 'SELECT SymLinkCategoryId, '.$id_field.' - FROM '.$table_name.' - WHERE SymLinkCategoryId IS NOT NULL'; - $cache = $this->Conn->GetCol($sql, $id_field); - } - - if (isset($cache[$category_id])) { - - //check if sym. link category is valid - $id_field = $this->Application->getUnitOption($this->Prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($this->Prefix, 'TableName'); - - $sql = 'SELECT '.$id_field.' - FROM '.$table_name.' - WHERE '.$id_field.' = '.$cache[$category_id]; - - $category_id = $this->Conn->GetOne($sql)? $cache[$category_id] : $category_id; - } - - return $category_id; - } - - function CategoryLink($params) - { - $category_id = getArrayValue($params, 'cat_id'); - - if ($category_id === false) { - $category_id = $this->Application->GetVar($this->getPrefixSpecial().'_id'); - } - - if ("$category_id" == 'Root') { - $category_id = $this->Application->findModule('Name', $params['module'], 'RootCat'); - } - elseif ("$category_id" == 'current') { - $category_id = $this->Application->GetVar('m_cat_id'); - } - - $category_id = $this->getCategorySymLink($category_id); - - unset($params['cat_id'], $params['module']); - - $new_params = Array ('pass' => 'm', 'm_cat_id' => $category_id, 'pass_category' => 1); - $params = array_merge_recursive2($params, $new_params); - - return $this->Application->ProcessParsedTag('m', 't', $params); - } - - function CategoryList($params) - { - //$object =& $this->Application->recallObject( $this->getPrefixSpecial() , $this->Prefix.'_List', $params ); - $object =& $this->GetList($params); - - - if ($object->RecordsCount == 0) - { - if (isset($params['block_no_cats'])) { - $params['name'] = $params['block_no_cats']; - return $this->Application->ParseBlock($params); - } - else { - return ''; - } - } - - if (isset($params['block'])) { - return $this->PrintList($params); - } - else { - $params['block'] = $params['block_main']; - if (isset($params['block_row_start'])) { - $params['row_start_block'] = $params['block_row_start']; - } - - if (isset($params['block_row_end'])) { - $params['row_end_block'] = $params['block_row_end']; - } - return $this->PrintList2($params); - } - } - - function Meta($params) - { - $object =& $this->Application->recallObject($this->Prefix); // .'.-item' - /* @var $object CategoriesItem */ - - $meta_type = $params['name']; - if ($object->isLoaded()) { - // 1. get module prefix by current category - $category_helper =& $this->Application->recallObject('CategoryHelper'); - /* @var $category_helper CategoryHelper */ - - $category_path = explode('|', substr($object->GetDBField('ParentPath'), 1, -1)); - $module_info = $category_helper->getCategoryModule($params, $category_path); - - // In-Edit & Proj-CMS module prefixes doesn't have custom field with item template - if ($module_info && $module_info['Var'] != 'adm' && $module_info['Var'] != 'st') { - - // 2. get item template by current category & module prefix - $mod_rewrite_helper = $this->Application->recallObject('ModRewriteHelper'); - /* @var $mod_rewrite_helper kModRewriteHelper */ - - $category_params = Array ( - 'CategoryId' => $object->GetID(), - 'ParentPath' => $object->GetDBField('ParentPath'), - ); - - $item_template = $mod_rewrite_helper->GetItemTemplate($category_params, $module_info['Var']); - - if ($this->Application->GetVar('t') == $item_template) { - // we are located on item's details page - $item =& $this->Application->recallObject($module_info['Var']); - /* @var $item kCatDBItem */ - - // 3. get item's meta data - $value = $item->GetField('Meta'.$meta_type); - if ($value) { - return $value; - } - } - - // 4. get category meta data - $value = $object->GetField('Meta'.$meta_type); - if ($value) { - return $value; - } - } - } - - // 5. get default meta data - switch ($meta_type) { - case 'Description': - $config_name = 'Category_MetaDesc'; - break; - case 'Keywords': - $config_name = 'Category_MetaKey'; - break; - } - - return $this->Application->ConfigValue($config_name); - } - - function BuildListSpecial($params) - { - if ( isset($params['parent_cat_id']) ) { - $parent_cat_id = $params['parent_cat_id']; - } - else { - $parent_cat_id = $this->Application->GetVar($this->Prefix.'_id'); - if (!$parent_cat_id) { - $parent_cat_id = $this->Application->GetVar('m_cat_id'); - } - if (!$parent_cat_id) { - $parent_cat_id = 0; - } - } - - $no_special = isset($params['no_special']) && $params['no_special']; - if ($no_special) return $this->Special; - - $list_unique_key = $this->getUniqueListKey($params); - // check for "admin" variable, because we are parsing front-end template from admin when using template editor feature - if ($this->Application->GetVar('admin') || !$this->Application->IsAdmin()) { - // add parent category to special, when on Front-End, - // because there can be many category lists on same page - $list_unique_key .= $parent_cat_id; - } - - if ($list_unique_key == '') { - return parent::BuildListSpecial($params); - } - - return crc32($list_unique_key); - } - - function IsCurrent($params) - { - $object =& $this->getObject($params); - if ($object->GetID() == $this->Application->GetVar('m_cat_id')) { - return true; - } - else { - return false; - } - } - - /** - * Substitutes category in last template base on current category - * This is required becasue when you navigate catalog using AJAX, last_template is not updated - * but when you open item edit from catalog last_template is used to build opener_stack - * So, if we don't substitute m_cat_id in last_template, after saving item we'll get redirected - * to the first category we've opened, not the one we navigated to using AJAX - * - * @param Array $params - */ - function UpdateLastTemplate($params) - { - $category_id = $this->Application->GetVar('m_cat_id'); - - $wid = $this->Application->GetVar('m_wid'); - list($index_file, $env) = explode('|', $this->Application->RecallVar(rtrim('last_template_'.$wid, '_')), 2); - - $vars_backup = Array (); - $vars = $this->Application->HttpQuery->processQueryString( str_replace('%5C', '\\', $env) ); - - foreach ($vars as $var_name => $var_value) { - $vars_backup[$var_name] = $this->Application->GetVar($var_name); - $this->Application->SetVar($var_name, $var_value); - } - - // update required fields - $this->Application->SetVar('m_cat_id', $category_id); - $this->Application->Session->SaveLastTemplate($params['template']); - - foreach ($vars_backup as $var_name => $var_value) { - $this->Application->SetVar($var_name, $var_value); - } - } - - function GetParentCategory($params) - { - $parent_id = 0; - $id_field = $this->Application->getUnitOption($this->Prefix, 'IDField'); - $table = $this->Application->getUnitOption($this->Prefix,'TableName'); - $cat_id = $this->Application->GetVar('m_cat_id'); - if ($cat_id > 0) { - $sql = 'SELECT ParentId - FROM '.$table.' - WHERE '.$id_field.' = '.$cat_id; - $parent_id = $this->Conn->GetOne($sql); - } - return $parent_id; - } - - function InitCacheUpdater($params) - { - safeDefine('CACHE_PERM_CHUNK_SIZE', 30); - - $continue = $this->Application->GetVar('continue'); - $total_cats = (int) $this->Conn->GetOne('SELECT COUNT(*) FROM '.TABLE_PREFIX.'Category'); - - if ($continue === false && $total_cats > CACHE_PERM_CHUNK_SIZE) { - // first step, if category count > CACHE_PERM_CHUNK_SIZE, then ask for cache update - return true; - } - - if ($continue === false) { - // if we don't have to ask, then assume user selected "Yes" in permcache update dialog - $continue = 1; - } - - $updater =& $this->Application->recallObject('kPermCacheUpdater', null, Array('continue' => $continue)); - /* @var $updater kPermCacheUpdater */ - if ($continue === '0') { // No in dialog - $updater->clearData(); - $this->Application->Redirect($params['destination_template']); - } - - $ret = false; // don't ask for update - if ($continue == 1) { // Initial run - $updater->setData(); - } - if ($continue == 2) { // Continuing - // called from AJAX request => returns percent - $needs_more = true; - while ($needs_more && $updater->iteration <= CACHE_PERM_CHUNK_SIZE) { - // until proceeeded in this step category count exceeds category per step limit - $needs_more = $updater->DoTheJob(); - } - - if ($needs_more) { - // still some categories are left for next step - $updater->setData(); - } - else { - // all done -> redirect - $updater->SaveData(); - $this->Application->RemoveVar('PermCache_UpdateRequired'); - $this->Application->Redirect($params['destination_template']); - } - - $ret = $updater->getDonePercent(); - } - return $ret; - } - - /** - * Parses warning block, but with style="display: none;". Used during permissions saving from AJAX - * - * @param Array $params - * @return string - */ - function SaveWarning($params) - { - if ($this->Prefix == 'st') { - // don't use this method for other prefixes then Category, that use this tag processor - return parent::SaveWarning($params); - } - - $main_prefix = getArrayValue($params, 'main_prefix'); - if ($main_prefix && $main_prefix != '$main_prefix') { - $top_prefix = $main_prefix; - } - else { - $top_prefix = $this->Application->GetTopmostPrefix($this->Prefix); - } - - $temp_tables = substr($this->Application->GetVar($top_prefix.'_mode'), 0, 1) == 't'; - $modified = $this->Application->RecallVar($top_prefix.'_modified'); - - if (!$temp_tables) { - $this->Application->RemoveVar($top_prefix.'_modified'); - return ''; - } - - $block_name = $this->SelectParam($params, 'render_as,name'); - if ($block_name) { - $block_params = $this->prepareTagParams($params); - $block_params['name'] = $block_name; - $block_params['edit_mode'] = $temp_tables ? 1 : 0; - $block_params['display'] = $temp_tables && $modified ? 1 : 0; - return $this->Application->ParseBlock($block_params); - } - else { - return $temp_tables && $modified ? 1 : 0; - } - return ; - } - - /** - * Allows to detect if this prefix has something in clipboard - * - * @param Array $params - * @return bool - */ - function HasClipboard($params) - { - $clipboard = $this->Application->RecallVar('clipboard'); - if ($clipboard) { - $clipboard = unserialize($clipboard); - foreach ($clipboard as $prefix => $clipboard_data) { - foreach ($clipboard_data as $mode => $ids) { - if (count($ids)) return 1; - } - } - } - return 0; - } - - /** - * Allows to detect if root category being edited - * - * @param Array $params - */ - function IsRootCategory($params) - { - $object =& $this->getObject($params); - return $object->IsRoot(); - } - - /** - * Returns home category id - * - * @param Array $params - * @return int - */ - function HomeCategory($params) - { - static $root_category = null; - - if (!isset($root_category)) { - $root_category = $this->Application->findModule('Name', 'Core', 'RootCat'); - } - - return $root_category; - } - - /** - * Used for disabling "Home" and "Up" buttons in category list - * - * @param Array $params - * @return bool - */ - function ModuleRootCategory($params) - { - return $this->Application->GetVar('m_cat_id') == $this->HomeCategory($params); - } - - function CatalogItemCount($params) - { - $object =& $this->GetList($params); - if (!$object->Counted) { - $object->CountRecs(); - } - return $object->NoFilterCount != $object->RecordsCount ? $object->RecordsCount.' / '.$object->NoFilterCount : $object->RecordsCount; - } - - /** - * Print grid pagination using - * block names specified - * - * @param Array $params - * @return string - * @access public - */ - function PrintPages($params) - { - if ($this->Application->Parser->GetParam('no_special')) { - $params['no_special'] = $this->Application->Parser->GetParam('no_special'); - } - return parent::PrintPages($params); - } - - function InitCatalog($params) - { - $tab_prefixes = $this->Application->GetVar('tp'); // {all, , none} - if ($tab_prefixes === false) $tab_prefixes = 'all'; - $skip_prefixes = isset($params['skip_prefixes']) && $params['skip_prefixes'] ? explode(',', $params['skip_prefixes']) : Array(); - $replace_main = isset($params['replace_m']) && $params['replace_m']; - - // get all prefixes available - $prefixes = Array(); - foreach ($this->Application->ModuleInfo as $module_name => $module_data) { - $prefix = $module_data['Var']; - - if ($prefix == 'adm'/* || $prefix == 'm'*/) continue; - - if ($prefix == 'm' && $replace_main) { - $prefix = 'c'; - } - - $prefixes[] = $prefix; - } - - if ($tab_prefixes == 'none') { - $skip_prefixes = array_unique(array_merge($skip_prefixes, $prefixes)); - unset($skip_prefixes[ array_search($replace_main ? 'c' : 'm', $skip_prefixes) ]); - } - elseif ($tab_prefixes != 'all') { - // prefix list here - $tab_prefixes = explode(',', $tab_prefixes); // list of prefixes that should stay - $skip_prefixes = array_unique(array_merge($skip_prefixes, array_diff($prefixes, $tab_prefixes))); - } - - $params['name'] = $params['render_as']; - $params['skip_prefixes'] = implode(',', $skip_prefixes); - return $this->Application->ParseBlock($params, 1); - } - - /** - * Determines, that printed category/menu item is currently active (will also match parent category) - * - * @param Array $params - * @return bool - */ - function IsActive($params) - { - static $current_path = null; - - if (!isset($current_path)) { - $sql = 'SELECT ParentPath - FROM ' . TABLE_PREFIX . 'Category - WHERE CategoryId = ' . $this->Application->GetVar('m_cat_id'); - $current_path = $this->Conn->GetOne($sql); - } - - if (array_key_exists('parent_path', $params)) { - $test_path = $params['parent_path']; - } - else { - $template = $params['template']; - if ($template) { - // when using from "c:CachedMenu" tag - $sql = 'SELECT ParentPath - FROM ' . TABLE_PREFIX . 'Category - WHERE NamedParentPath = ' . $this->Conn->qstr('Content/' . $template); - $test_path = $this->Conn->GetOne($sql); - } - else { - // when using from "c:PrintList" tag - $cat_id = array_key_exists('cat_id', $params) && $params['cat_id'] ? $params['cat_id'] : false; - if ($cat_id === false) { - // category not supplied -> get current from PrintList - $category =& $this->getObject($params); - } - else { - if ("$cat_id" == 'Root') { - $cat_id = $this->Application->findModule('Name', $params['module'], 'RootCat'); - } - - $category =& $this->Application->recallObject($this->Prefix . '.-c' . $cat_id, $this->Prefix, Array ('skip_autoload' => true)); - $category->Load($cat_id); - } - - $test_path = $category->GetDBField('ParentPath'); - } - } - - return strpos($current_path, $test_path) !== false; - } - - /** - * Checks if user have one of required permissions - * - * @param Array $params - * @return bool - */ - function HasPermission($params) - { - $perm_helper =& $this->Application->recallObject('PermissionsHelper'); - /* @var $perm_helper kPermissionsHelper */ - - $params['raise_warnings'] = 0; - $object =& $this->getObject($params); - /* @var $object kDBItem */ - - $params['cat_id'] = $object->isLoaded() ? $object->GetDBField('ParentPath') : $this->Application->GetVar('m_cat_id'); - return $perm_helper->TagPermissionCheck($params); - } - - /** - * Prepares name for field with event in it (used only on front-end) - * - * @param Array $params - * @return string - */ - function SubmitName($params) - { - return 'events['.$this->Prefix.']['.$params['event'].']'; - } - - /** - * Returns last modification date of items in category / system - * - * @param Array $params - * @return string - */ - function LastUpdated($params) - { - $category_id = $this->Application->GetVar('m_cat_id'); - $table_name = $this->Application->getUnitOption($this->Prefix, 'TableName'); - - if (isset($params['local']) && $params['local'] && $category_id > 0) { - // scan only current category & it's children - $sql = 'SELECT TreeLeft, TreeRight - FROM '.TABLE_PREFIX.'Category - WHERE CategoryId = '.$category_id; - $tree_info = $this->Conn->GetRow($sql); - - $sql = 'SELECT MAX(c.Modified) AS ModDate, MAX(c.CreatedOn) AS NewDate - FROM '.TABLE_PREFIX.'Category c - WHERE c.TreeLeft BETWEEN '.$tree_info['TreeLeft'].' AND '.$tree_info['TreeRight']; - } - else { - // scan all categories in system - $sql = 'SELECT MAX(Modified) AS ModDate, MAX(CreatedOn) AS NewDate - FROM '.$table_name; - } - - $row_data = $this->Conn->GetRow($sql); - if (!$row_data) { - return ''; - } - - $date = $row_data[ $row_data['NewDate'] > $row_data['ModDate'] ? 'NewDate' : 'ModDate' ]; - - // format date - $format = isset($params['format']) ? $params['format'] : '_regional_DateTimeFormat'; - if (preg_match("/_regional_(.*)/", $format, $regs)) { - $lang =& $this->Application->recallObject('lang.current'); - if ($regs[1] == 'DateTimeFormat') { - // combined format - $format = $lang->GetDBField('DateFormat').' '.$lang->GetDBField('TimeFormat'); - } - else { - // simple format - $format = $lang->GetDBField($regs[1]); - } - } - - return adodb_date($format, $date); - } - - function CategoryItemCount($params) - { - $object =& $this->getObject($params); - /* @var $object kDBList */ - - $params['cat_id'] = $object->GetID(); - - $count_helper =& $this->Application->recallObject('CountHelper'); - /* @var $count_helper kCountHelper */ - - return $count_helper->CategoryItemCount($params['prefix'], $params); - } - - /** - * Returns prefix + any word (used for shared between categories per page settings) - * - * @param Array $params - * @return string - */ - function VarName($params) - { - return $this->Prefix.'_'.$params['type']; - } - - /** - * Checks if current category is valid symbolic link to another category - * - * @param Array $params - * @return string - */ - function IsCategorySymLink($params) - { - $object =& $this->getObject($params); - /* @var $object kDBList */ - - $sym_category_id = $object->GetDBField('SymLinkCategoryId'); - - if (is_null($sym_category_id)) - { - return false; - } - - $id_field = $this->Application->getUnitOption($this->Prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($this->Prefix, 'TableName'); - - $sql = 'SELECT '.$id_field.' - FROM '.$table_name.' - WHERE '.$id_field.' = '.$sym_category_id; - - return $this->Conn->GetOne($sql)? true : false; - } - - /** - * Returns module prefix based on root category for given - * - * @param Array $params - * @return string - */ - function GetModulePrefix($params) - { - $object =& $this->getObject($params); - /* @var $object kDBItem */ - - $parent_path = explode('|', substr($object->GetDBField('ParentPath'), 1, -1)); - - $category_helper =& $this->Application->recallObject('CategoryHelper'); - /* @var $category_helper CategoryHelper */ - - $module_info = $category_helper->getCategoryModule($params, $parent_path); - return $module_info['Var']; - } - - function ImageSrc($params) - { - list ($ret, $tag_processed) = $this->processAggregatedTag('ImageSrc', $params, $this->getPrefixSpecial()); - return $tag_processed ? $ret : false; - } - - function PageLink($params) - { - $t = isset($params['template']) ? $params['template'] : ''; - unset($params['template']); - - if (!$t) $t = $this->Application->GetVar('t'); - - if (isset($params['page'])) { - $this->Application->SetVar($this->getPrefixSpecial().'_Page', $params['page']); - unset($params['page']); - } - - $params['m_cat_page'] = $this->Application->GetVar($this->getPrefixSpecial().'_Page'); - - if (!isset($params['pass'])) { - $params['pass'] = 'm,'.$this->getPrefixSpecial(); - } - - return $this->Application->HREF($t, '', $params); - } - - /** - * Returns spelling suggestions against search keyword - * - * @param Array $params - * @return string - */ - function SpellingSuggestions($params) - { - $keywords = unhtmlentities( trim($this->Application->GetVar('keywords')) ); - if (!$keywords) { - return ; - } - - // 1. try to get already cached suggestion - $suggestion = $this->Application->getCache('search.suggestion', $keywords); - if ($suggestion !== false) { - return $suggestion; - } - - $table_name = $this->Application->getUnitOption('spelling-dictionary', 'TableName'); - - // 2. search suggestion in database - $sql = 'SELECT SuggestedCorrection - FROM ' . $table_name . ' - WHERE MisspelledWord = ' . $this->Conn->qstr($keywords); - $suggestion = $this->Conn->GetOne($sql); - if ($suggestion !== false) { - $this->Application->setCache('search.suggestion', $keywords, $suggestion); - return $suggestion; - } - - // 3. suggestion not found in database, ask webservice - $app_id = $this->Application->ConfigValue('YahooApplicationId'); - $url = 'http://search.yahooapis.com/WebSearchService/V1/spellingSuggestion?appid=' . $app_id . '&query='; - - $curl_helper =& $this->Application->recallObject('CurlHelper'); - /* @var $curl_helper kCurlHelper */ - - $xml_data = $curl_helper->Send($url . urlencode($keywords)); - - $xml_helper =& $this->Application->recallObject('kXMLHelper'); - /* @var $xml_helper kXMLHelper */ - - $root_node =& $xml_helper->Parse($xml_data); - - $result = $root_node->FindChild('RESULT'); - /* @var $result kXMLNode */ - - if (is_object($result)) { - // webservice responded -> save in local database - $fields_hash = Array ( - 'MisspelledWord' => $keywords, - 'SuggestedCorrection' => $result->Data, - ); - - $this->Conn->doInsert($fields_hash, $table_name); - $this->Application->setCache('search.suggestion', $keywords, $result->Data); - - return $result->Data; - } - - return ''; - } - - /** - * Shows link for searching by suggested word - * - * @param Array $params - * @return string - */ - function SuggestionLink($params) - { - $params['keywords'] = $this->SpellingSuggestions($params); - - return $this->Application->ProcessParsedTag('m', 'Link', $params); - } - - function InitCatalogTab($params) - { - $tab_params['mode'] = $this->Application->GetVar('tm'); // single/multi selection possible - $tab_params['special'] = $this->Application->GetVar('ts'); // use special for this tab - $tab_params['dependant'] = $this->Application->GetVar('td'); // is grid dependant on categories grid - - // set default params (same as in catalog) - if ($tab_params['mode'] === false) $tab_params['mode'] = 'multi'; - if ($tab_params['special'] === false) $tab_params['special'] = ''; - if ($tab_params['dependant'] === false) $tab_params['dependant'] = 'yes'; - - // pass params to block with tab content - $params['name'] = $params['render_as']; - $special = $tab_params['special'] ? $tab_params['special'] : $this->Special; - $params['prefix'] = trim($this->Prefix.'.'.$special, '.'); - - $prefix_append = $this->Application->GetVar('prefix_append'); - if ($prefix_append) { - $params['prefix'] .= $prefix_append; - } - - $default_grid = array_key_exists('default_grid', $params) ? $params['default_grid'] : 'Default'; - $radio_grid = array_key_exists('radio_grid', $params) ? $params['radio_grid'] : 'Radio'; - - $params['cat_prefix'] = trim('c.'.($tab_params['special'] ? $tab_params['special'] : $this->Special), '.'); - $params['tab_mode'] = $tab_params['mode']; - $params['grid_name'] = ($tab_params['mode'] == 'multi') ? $default_grid : $radio_grid; - $params['tab_dependant'] = $tab_params['dependant']; - $params['show_category'] = $tab_params['special'] == 'showall' ? 1 : 0; // this is advanced view -> show category name - - if ($special == 'showall' || $special == 'user') { - $params['grid_name'] .= 'ShowAll'; - } - - return $this->Application->ParseBlock($params, 1); - } - - /** - * Show CachedNavbar of current item primary category - * - * @param Array $params - * @return string - */ - function CategoryName($params) - { - // show category cachednavbar of - $object =& $this->getObject($params); - $category_id = isset($params['cat_id']) ? $params['cat_id'] : $object->GetDBField('CategoryId'); - - $category_path = $this->Application->getCache('category_paths', $category_id); - if ($category_path === false) { - // not chached - if ($category_id > 0) { - $cached_navbar = $object->GetField('CachedNavbar'); - - if ($category_id == $object->GetDBField('ParentId')) { - // parent category cached navbar is one element smaller, then current ones - $cached_navbar = explode('&|&', $cached_navbar); - array_pop($cached_navbar); - $cached_navbar = implode('&|&', $cached_navbar); - } - else { - // no relation with current category object -> query from db - $sql = 'SELECT l' . $this->Application->GetVar('m_lang') . '_CachedNavbar - FROM ' . $object->TableName . ' - WHERE ' . $object->IDField . ' = ' . $category_id; - $cached_navbar = $this->Conn->GetOne($sql); - } - - $cached_navbar = preg_replace('/^(Content&\|&|Content)/i', '', $cached_navbar); - - $category_path = trim($this->CategoryName( Array('cat_id' => 0) ).' > '.str_replace('&|&', ' > ', $cached_navbar), ' > '); - } - else { - $category_path = $this->Application->Phrase( $this->Application->ConfigValue('Root_Name') ); - } - $this->Application->setCache('category_paths', $category_id, $category_path); - } - return $category_path; - } - - // structure related - - /** - * Returns page object based on requested params - * - * @param Array $params - * @return PagesItem - */ - function &_getPage($params) - { - $page =& $this->Application->recallObject($this->Prefix . '.-virtual', null, $params); - /* @var $page kDBItem */ - - // 1. load by given id - $page_id = array_key_exists('page_id', $params) ? $params['page_id'] : false; - if ($page_id) { - if ($page_id != $page->GetID()) { - // load if different - $page->Load($page_id); - } - - return $page; - } - - // 2. load by template - $template = array_key_exists('page', $params) ? $params['page'] : ''; - if (!$template) { - $template = $this->Application->GetVar('t'); - } - - // different path in structure AND design template differes from requested template - $structure_path_match = strtolower( $page->GetDBField('NamedParentPath') ) == strtolower('Content/' . $template); - $design_match = $page->GetDBField('CachedTemplate') == $template; - - if (!$structure_path_match && !$design_match) { - // Same sql like in "c:getPassedID". Load, when current page object doesn't match requested page object - $themes_helper =& $this->Application->recallObject('ThemesHelper'); - /* @var $themes_helper kThemesHelper */ - - $page_id = $themes_helper->getPageByTemplate($template); - - $page->Load($page_id); - } - - return $page; - } - - /** - * Returns requested content block content of current or specified page - * - * @param Array $params - * @return string - */ - function ContentBlock($params) - { - $num = getArrayValue($params, 'num'); - if (!$num) { - return 'NO CONTENT NUM SPECIFIED'; - } - - $page =& $this->_getPage($params); - /* @var $page kDBItem */ - - if (!$page->isLoaded()) { - // page is not created yet => all blocks are empty - return ''; - } - - $page_id = $page->GetID(); - - $content =& $this->Application->recallObject('content.-block', null, Array ('skip_autoload' => true)); - /* @var $content kDBItem */ - - $data = Array ('PageId' => $page_id, 'ContentNum' => $num); - $content->Load($data); - - if (!$content->isLoaded()) { - // bug: missing content blocks are created even if user have no SMS-management rights - $content->SetFieldsFromHash($data); - $content->Create(); - } - - $edit_code_before = $edit_code_after = ''; - - if (EDITING_MODE == EDITING_MODE_CMS) { - $bg_color = isset($params['bgcolor']) ? $params['bgcolor'] : '#ffffff'; - $url_params = Array ( - 'pass' => 'm,c,content', - 'm_opener' => 'd', - 'c_id' => $page->GetID(), - 'content_id' => $content->GetID(), - 'front' => 1, - 'admin' => 1, - '__URLENCODE__' => 1, - '__NO_REWRITE__'=> 1, - 'escape' => 1, - 'index_file' => 'index.php', -// 'bgcolor' => $bg_color, -// '__FORCE_SID__' => 1 - ); - - $additional_css = ''; - - if (isset($params['float'])) { - $additional_css .= 'position: relative; width: 100%; float: ' . $params['float'] . ';'; - } - - // link from Front-End to admin, don't remove "index.php" - $edit_url = $this->Application->HREF('categories/edit_content', ADMIN_DIRECTORY, $url_params, 'index.php'); - $edit_code_before = ' -
-
-
- -
-
Edit '.(defined('DEBUG_MODE') && DEBUG_MODE ? " - #{$num}" : '').'
-
-
'; - - $edit_form = '
'; - $edit_form .= ''; - $edit_form .= ''; - $edit_form .= ''; - $edit_form .= ''; - $edit_form .= ''; - $edit_form .= '
'; - - $edit_code_after = '
'; - - if (array_key_exists('forms_later', $params) && $params['forms_later']) { - $all_forms = $this->Application->GetVar('all_forms'); - $this->Application->SetVar('all_forms', $all_forms . $edit_form); - } - else { - $edit_code_after .= $edit_form; - } - } - - if ($this->Application->GetVar('_editor_preview_') == 1) { - $data = $this->Application->RecallVar('_editor_preview_content_'); - } else { - $data = $content->GetField('Content'); - } - - $data = $edit_code_before . $this->_transformContentBlockData($data, $params) . $edit_code_after; - - if ($data != '') { - $this->Application->Parser->DataExists = true; - } - - return $data; - } - - /** - * Apply all kinds of content block data transformations without rewriting ContentBlock tag - * - * @param string $data - * @return string - */ - function _transformContentBlockData(&$data, $params) - { - return $data; - } - - /** - * Returns current page name or page based on page/page_id parameters - * - * @param Array $params - * @return string - * @todo Used? - */ - function PageName($params) - { - $page =& $this->_getPage($params); - - return $page->GetDBField('Name'); - } - - /** - * Returns current/given page information - * - * @param Array $params - * @return string - */ - function PageInfo($params) - { - $page =& $this->_getPage($params); - - if ($params['type'] == 'index_tools') { - $page_info = $page->GetDBField('IndexTools'); - if ($page_info) { - return $page_info; - } - else { - if (PROTOCOL == 'https://') { - return $this->Application->ConfigValue('cms_DefaultIndextoolsCode_SSL'); - } - else { - return $this->Application->ConfigValue('cms_DefaultIndextoolsCode'); - } - } - } - - switch ($params['type']) { - case 'title': - $db_field = 'Title'; - break; - - case 'htmlhead_title': - $db_field = 'Name'; - break; - - case 'meta_title': - $db_field = 'MetaTitle'; - break; - - case 'meta_keywords': - $db_field = 'MetaKeywords'; - $cat_field = 'Keywords'; - break; - - case 'meta_description': - $db_field = 'MetaDescription'; - $cat_field = 'Description'; - break; - - default: - return ''; - } - - $default = isset($params['default']) ? $params['default'] : ''; - $val = $page->GetField($db_field); - if (!$default) { - if ($this->Application->isModuleEnabled('In-Portal')) { - if (!$val && ($params['type'] == 'meta_keywords' || $params['type'] == 'meta_description')) { - // take category meta if it's not set for the page - return $this->Application->ProcessParsedTag('c', 'Meta', Array('name' => $cat_field)); - } - } - } - - if (isset($params['force_default']) && $params['force_default']) { - return $default; - } - - if (preg_match('/^_Auto:/', $val)) { - $val = $default; - - /*if ($db_field == 'Title') { - $page->SetDBField($db_field, $default); - $page->Update(); - }*/ - } - elseif ($page->GetID() == false) { - return $default; - } - - return $val; - } - - /** - * Includes admin css and js, that are required for cms usage on Front-Edn - * - * - * @param Array $params - * @return string - */ - function EditingScripts($params) - { - if ($this->Application->GetVar('admin_scripts_included') || !EDITING_MODE) { - return ; - } - - $this->Application->SetVar('admin_scripts_included', 1); - - $js_url = $this->Application->BaseURL() . 'core/admin_templates/js'; - - $ret = '' . "\n"; - $ret .= '' . "\n"; - - if (EDITING_MODE == EDITING_MODE_LAYOUT) { - $ret .= ' '; - } - - $ret .= '' . "\n"; - $ret .= '' . "\n"; - $ret .= '' . "\n"; - $ret .= '' . "\n"; - $ret .= '' . "\n"; - $ret .= '' . "\n"; - $ret .= '' . "\n"; - $ret .= '' . "\n"; - - // add form, so admin scripts could work - $ret .= '
- - -
'; - - return $ret; - } - - /** - * Prints "Edit Page" button on cms page - * - * @param Array $params - * @return string - */ - function EditPage($params) - { - if (!EDITING_MODE) { - return ''; - } - - $display_mode = array_key_exists('mode', $params) ? $params['mode'] : false; - $edit_code = ''; - - $page =& $this->_getPage($params); - - if (!$page->isLoaded()) { - // when "EditingScripts" tag is not used, make sure, that scripts are also included - return $this->EditingScripts($params); - } - - // show "EditPage" button only for pages, that exists in structure - if ($display_mode != 'end') { - $url_params = Array( - 'pass' => 'm,c', - 'm_opener' => 'd', - 'c_id' => $page->GetID(), - 'c_mode' => 't', - 'c_event' => 'OnEdit', - 'front' => 1, - '__URLENCODE__' => 1, - '__NO_REWRITE__'=> 1, - 'escape' => 1, - 'index_file' => 'index.php', - ); - - $edit_url = $this->Application->HREF('categories/categories_edit', '/admin', $url_params); - - $edit_btn = ''; - - if (EDITING_MODE == EDITING_MODE_LAYOUT) { - $edit_btn .= ' -
-
- -
-
Save Layout
-
' . "\n"; - } - - $edit_btn .= ' -
-
- -
-
Section Properties
-
' . "\n"; - - if ($display_mode == 'start') { - // button with border around the page - $edit_code .= '
' . $edit_btn . '
'; - - } - else { - // button without border around the page - $edit_code .= $edit_btn; - } - } - - if ($display_mode == 'end') { - // draw border around the page - $edit_code .= '
'; - } - - if ($display_mode != 'end') { - $edit_code .= '
'; - - // when "EditingScripts" tag is not used, make sure, that scripts are also included - $edit_code .= $this->EditingScripts($params); - } - - return $edit_code; - } - - /** - * Builds cached menu version - * - * @return Array - */ - function _prepareMenu() - { - static $root_cat = null; - static $root_path = null; - - if (!$root_cat) { - $root_cat = $this->Application->ModuleInfo['Core']['RootCat']; - $root_path = $this->Conn->GetOne('SELECT ParentPath FROM '.TABLE_PREFIX.'Category WHERE CategoryId = '.$root_cat); - } - - if (!$this->Menu) { - $menu = $this->Conn->GetRow('SELECT Data, Cached FROM '.TABLE_PREFIX.'Cache WHERE VarName = "cms_menu"'); - if ($menu && $menu['Cached'] > 0) { - $menu = unserialize($menu['Data']); - $this->ParentPaths = $menu['ParentPaths']; - } - else { - $menu = $this->_altBuildMenuStructure(array('CategoryId' => $root_cat, 'ParentPath' => $root_path)); - $menu['ParentPaths'] = $this->ParentPaths; - $this->Conn->Query('REPLACE '.TABLE_PREFIX.'Cache (VarName, Data, Cached) VALUES ("cms_menu", '.$this->Conn->qstr(serialize($menu)).', '.adodb_mktime().')'); - } - unset($menu['ParentPaths']); - $this->Menu = $menu; - } - - return Array ($this->Menu, $root_path); - } - - /** - * Returns category id based tag parameters - * - * @param Array $params - * @return int - */ - function _getCategoryId($params) - { - $cat = isset($params['category_id']) && $params['category_id'] != '' ? $params['category_id'] : $this->Application->GetVar('m_cat_id'); - if ("$cat" == 'parent') { - $this_category =& $this->Application->recallObject('c'); - /* @var $this_category kDBItem */ - - $cat = $this_category->GetDBField('ParentId'); - } - else if ($cat == 0) { - $cat = $this->Application->ModuleInfo['Core']['RootCat']; - } - - return $cat; - } - - /** - * Prepares cms menu item block parameters - * - * @param Array $page - * @param int $real_cat_id - * @param string $root_path - * @return Array - */ - function _prepareMenuItem($page, $real_cat_id, $root_path) - { - static $language_id = null; - static $primary_language_id = null; - - if (!isset($language_id)) { - $language_id = $this->Application->GetVar('m_lang'); - $primary_language_id = $this->Application->GetDefaultLanguageId(); - } - - $title = $page['l'.$language_id.'_ItemName'] ? $page['l'.$language_id.'_ItemName'] : $page['l'.$primary_language_id.'_ItemName']; - $active = false; - $category_active = false; - - if ($page['ItemType'] == 'cat') { - if ( isset($this->ParentPaths[$real_cat_id])) { - $active = strpos($this->ParentPaths[$real_cat_id], $page['ParentPath']) !== false; - } - $category_active = $page['CategoryId'] == $real_cat_id; - } - - if ($page['ItemType'] == 'cat_index') { - $check_path = str_replace($root_path, '', $page['ParentPath']); - $active = strpos($parent_path, $check_path) !== false; - } - - if ($page['ItemType'] == 'page') { - $active = $page['ItemPath'] == preg_replace('/^Content\//i', '', $this->Application->GetVar('t')); - } - - $block_params = Array ( - 'title'=> $title, - 'template'=> preg_replace('/^Content\//i', '', $page['ItemPath']), - 'active'=>$active, - 'category_active' => $category_active, // new - 'parent_path'=>$page['ParentPath'], - 'parent_id'=>$page['ParentId'], - 'cat_id'=>$page['CategoryId'], - 'is_index'=>$page['IsIndex'], - 'item_type'=>$page['ItemType'], - 'page_id'=>$page['ItemId'], - 'has_sub_menu' => isset($page['sub_items']) && count($page['sub_items']) > 0, - 'external_url' => $page['UseExternalUrl'] ? $page['ExternalUrl'] : false, - 'menu_icon' => $page['UseMenuIconUrl'] ? $page['MenuIconUrl'] : false, - - ); - - return $block_params; - } - - /** - * Builds site menu - * - * @param Array $params - * @return string - */ - function CachedMenu($params) - { - list ($menu, $root_path) = $this->_prepareMenu(); - $cat = $this->_getCategoryId($params); - - $parent_path = isset($this->ParentPaths[$cat]) ? $this->ParentPaths[$cat] : ''; - $parent_path = str_replace($root_path, '', $parent_path); //menu starts from module path - $levels = explode('|',trim($parent_path,'|')); - if ($levels[0] === '') $levels = array(); - if (isset($params['level']) && $params['level'] > count($levels)) return ; - - $level = max(isset($params['level']) ? $params['level']-1 : count($levels)-1, 0); - $parent = isset($levels[$level]) ? $levels[$level] : 0; - - $cur_menu =& $menu; - $menu_path = array_slice($levels, 0, $level+1); - foreach ($menu_path as $elem) { - $cur_menu =& $cur_menu['c'.$elem]['sub_items']; - } - - $ret = ''; - $block_params = $this->prepareTagParams($params); - $block_params['name'] = $params['render_as']; - - $this->Application->SetVar('cur_parent_path', $parent_path); - $real_cat_id = $this->Application->GetVar('m_cat_id'); - if (is_array($cur_menu) && $cur_menu) { - $cur_item = 1; - $cur_menu = $this->_removeNonMenuItems($cur_menu); - $block_params['total_items'] = count($cur_menu); - - foreach ($cur_menu as $page) { - $block_params = array_merge_recursive2( - $block_params, - $this->_prepareMenuItem($page, $real_cat_id, $root_path) - ); - - $block_params['is_last'] = $cur_item == $block_params['total_items']; - $block_params['is_first'] = $cur_item == 1; - - // bug #1: this breaks active section highlighting when 2 menu levels are printed on same page (both visible) - // bug #2: people doesn't pass cat_id parameter to m_Link tags in their blocks, so this line helps them; when removed their links will lead to nowhere - $this->Application->SetVar('m_cat_id', $page['CategoryId']); - - $ret .= $this->Application->ParseBlock($block_params, 1); - $cur_item++; - } - - $this->Application->SetVar('m_cat_id', $real_cat_id); - } - - return $ret; - } - - /** - * Returns only items, that are visible in menu - * - * @param Array $menu - * @return Array - */ - function _removeNonMenuItems($menu) - { - foreach ($menu as $menu_index => $menu_item) { - // $menu_index is in "cN" format, where N is category id - if (!$menu_item['IsMenu']) { - unset($menu[$menu_index]); - } - } - - return $menu; - } - - /** - * Trick to allow some kind of output formatting when using CachedMenu tag - * - * @param Array $params - * @return bool - */ - function SplitColumn($params) - { - return $this->Application->GetVar($params['i']) > ceil($params['total'] / $params['columns']); - } - - /** - * Returns direct children count of given category - * - * @param Array $params - * @return int - */ - function HasSubCats($params) - { - $sql = 'SELECT COUNT(*) - FROM ' . TABLE_PREFIX . 'Category - WHERE ParentId = ' . $params['cat_id']; - - return $this->Conn->GetOne($sql); - } - - /** - * Prints sub-pages of given/current page. - * - * @param Array $params - * @return string - * @todo This could be reached by using "parent_cat_id" parameter. Only difference here is new block parameter "path". Need to rewrite. - */ - function PrintSubPages($params) - { - $list =& $this->Application->recallObject($this->getPrefixSpecial(), $this->Prefix.'_List', $params); - /* @var $list kDBList */ - - $category_id = array_key_exists('category_id', $params) ? $params['category_id'] : $this->Application->GetVar('m_cat_id'); - - $list->addFilter('current_pages', TABLE_PREFIX . 'CategoryItems.CategoryId = ' . $category_id); - $list->Query(); - $list->GoFirst(); - - $o = ''; - $block_params = $this->prepareTagParams($params); - $block_params['name'] = $params['render_as']; - - while (!$list->EOL()) { - $block_params['path'] = $list->GetDBField('Path'); - $o .= $this->Application->ParseBlock($block_params, 1); - - $list->GoNext(); - } - - return $o; - } - - /** - * Builds link for browsing current page on Front-End - * - * @param Array $params - * @return string - */ - function PageBrowseLink($params) - { - $object =& $this->getObject($params); - - $template = $object->GetDBField('NamedParentPath'); - $url_params = Array ('admin' => 1, 'pass' => 'm', 'm_cat_id' => $object->GetID(), 'index_file' => 'index.php'); - - return $this->Application->HREF($template, '_FRONT_END_', $url_params); - } - - /** - * Builds link to cms page (used?) - * - * @param Array $params - * @return string - */ - function ContentPageLink($params) - { - $object =& $this->getObject($params); - $params['t'] = $object->GetDBField('NamedParentPath'); - $params['m_cat_id'] = 0; - - return $this->Application->ProcessParsedTag('m', 'Link', $params); - } - - /** - * Builds cache for children of given category (no matter, what menu status is) - * - * @param Array $parent - * @return Array - */ - function _altBuildMenuStructure($parent) - { - static $languages_count = null; - - if (!isset($languages_count)) { - $sql = 'SELECT COUNT(*) - FROM ' . TABLE_PREFIX . 'Language'; - $languages_count = ceil($this->Conn->GetOne($sql) / 5) * 5; - } - - $items = Array (); - - $lang_part = ''; - for ($i = 1; $i <= $languages_count; $i++) { -// $lang_part .= 'c.l' . $i . '_Name AS l' . $i . '_ItemName,' . "\n"; - $lang_part .= 'c.l' . $i . '_MenuTitle AS l' . $i . '_ItemName,' . "\n"; - } - - // Sub-categories from current category - $query = 'SELECT - c.CategoryId AS CategoryId, - CONCAT(\'c\', c.CategoryId) AS ItemId, - c.Priority AS ItemPriority, - ' . $lang_part . ' - LOWER( IF(IsIndex = 2, ( - SELECT cc.NamedParentPath FROM ' . TABLE_PREFIX . 'Category AS cc - WHERE - cc.ParentId = c.CategoryId - AND - cc.Status IN (1,4) - AND - cc.IsIndex = 1 - ), - c.NamedParentPath) ) AS ItemPath, - 0 AS IsIndex, - c.ParentPath AS ParentPath, - c.ParentId As ParentId, - \'cat\' AS ItemType, - c.IsMenu, c.UseExternalUrl, c.ExternalUrl, c.UseMenuIconUrl, c.MenuIconUrl - FROM ' . TABLE_PREFIX . 'Category AS c - WHERE - c.Status IN (1,4) AND - #c.IsMenu = 1 AND - c.ParentId = ' . $parent['CategoryId']; - $items = array_merge($items, $this->Conn->Query($query, 'ItemId')); - - uasort($items, Array (&$this, '_menuSort')); - - $the_items = array(); - foreach ($items as $an_item) { - $the_items[ $an_item['ItemId'] ] = $an_item; - $this->ParentPaths[ $an_item['CategoryId'] ] = $an_item['ParentPath']; - } - - $items = $the_items; - foreach ($items as $key => $menu_item) { - if ($menu_item['CategoryId'] == $parent['CategoryId']) { - continue; - } - - $sub_items = $this->_altBuildMenuStructure($menu_item); - if ($sub_items) { - $items[$key]['sub_items'] = $sub_items; - } - } - - return $items; - } - - /** - * Method for sorting pages by priority in decending order - * - * @param Array $a - * @param Array $b - * @return int - */ - function _menuSort($a, $b) - { - if ($a['ItemPriority'] == $b['ItemPriority']) { - return 0; - } - - return ($a['ItemPriority'] < $b['ItemPriority']) ? 1 : -1; //descending - } - - /** - * Prepares cms page description for search result page - * - * @param Array $params - * @return string - */ - function SearchDescription($params) - { - $object =& $this->getObject($params); - $desc = $object->GetField('MetaDescription'); - if (!$desc) { - $sql = 'SELECT * - FROM ' . TABLE_PREFIX . 'PageContent - WHERE PageId = ' . $object->GetID() . ' AND ContentNum = 1'; - $content = $this->Conn->GetRow($sql); - - if ($content['l'.$this->Application->GetVar('m_lang').'_Content']) { - $desc = $content['l'.$this->Application->GetVar('m_lang').'_Content']; - } - else { - $desc = $content['l'.$this->Application->GetDefaultLanguageId().'_Content']; - } - } - - return mb_substr($desc, 0, 300).(mb_strlen($desc) > 300 ? '...' : ''); - } - - /** - * Simplified version of "c:CategoryLink" for "c:PrintList" - * - * @param Array $params - * @return string - * @todo Used? Needs refactoring. - */ - function EnterCatLink($params) - { - $object =& $this->getObject($params); - - $url_params = Array ('pass' => 'm', 'm_cat_id' => $object->GetID()); - return $this->Application->HREF($params['template'], '', $url_params); - } - - /** - * Simplified version of "c:CategoryPath", that do not use blocks for rendering - * - * @param Array $params - * @return string - * @todo Used? Maybe needs to be removed. - */ - function PagePath($params) - { - $object =& $this->getObject($params); - $path = $object->GetField('CachedNavbar'); - if ($path) { - $items = explode('&|&', $path); - array_shift($items); - return implode(' -> ', $items); - } - - return ''; - } - - /** - * Returns configuration variable value - * - * @param Array $params - * @return string - * @todo Needs to be replaced with "m:GetConfig" tag; Not used now (were used on structure_edit.tpl). - */ - function AllowManualFilenames($params) - { - return $this->Application->ConfigValue('ProjCMSAllowManualFilenames'); - } - - /** - * Draws path to current page (each page can be link to it) - * - * @param Array $params - * @return string - */ - function CurrentPath($params) - { - $block_params = $this->prepareTagParams($params); - $block_params['name'] = $block_params['render_as']; - - $object =& $this->Application->recallObject($this->Prefix); - /* @var $object kDBItem */ - - $category_ids = explode('|', substr($object->GetDBField('ParentPath'), 1, -1)); - - $id_field = $this->Application->getUnitOption($this->Prefix, 'IDField'); - $table_name = $this->Application->getUnitOption($this->Prefix, 'TableName'); - - $language = $this->Application->GetVar('m_lang'); - - $sql = 'SELECT l'.$language.'_Name AS Name, NamedParentPath - FROM '.$table_name.' - WHERE '.$id_field.' IN ('.implode(',', $category_ids).')'; - $categories_data = $this->Conn->Query($sql); - - $ret = ''; - foreach ($categories_data as $index => $category_data) { - if ($category_data['Name'] == 'Content') { - continue; - } - $block_params['title'] = $category_data['Name']; - $block_params['template'] = preg_replace('/^Content\//i', '', $category_data['NamedParentPath']); - $block_params['is_first'] = $index == 1; // because Content is 1st element - $block_params['is_last'] = $index == count($categories_data) - 1; - - $ret .= $this->Application->ParseBlock($block_params); - } - - return $ret; - } - - /** - * Synonim to PrintList2 for "onlinestore" theme - * - * @param Array $params - * @return string - */ - function ListPages($params) - { - return $this->PrintList2($params); - } - - /** - * Returns information about parser element locations in template - * - * @param Array $params - * @return mixed - */ - function BlockInfo($params) - { - if (!EDITING_MODE) { - return ''; - } - - $template_helper =& $this->Application->recallObject('TemplateHelper'); - /* @var $template_helper TemplateHelper */ - - return $template_helper->blockInfo( $params['name'] ); - } - - /** - * Hide all editing tabs except permission tab, when editing "Home" (ID = 0) category - * - * @param Array $params - */ - function ModifyUnitConfig($params) - { - $root_category = $this->Application->RecallVar('IsRootCategory_' . $this->Application->GetVar('m_wid')); - if (!$root_category) { - return ; - } - - $edit_tab_presets = $this->Application->getUnitOption($this->Prefix, 'EditTabPresets'); - $edit_tab_presets['Default'] = Array ( - 'permissions' => $edit_tab_presets['Default']['permissions'], - ); - $this->Application->setUnitOption($this->Prefix, 'EditTabPresets', $edit_tab_presets); - } - - /** - * Prints catalog export templates - * - * @param Array $params - * @return string - */ - function PrintCatalogExportTemplates($params) - { - $prefixes = explode(',', $params['prefixes']); - - $ret = Array (); - foreach ($prefixes as $prefix) { - if ($this->Application->prefixRegistred($prefix)) { - $ret[$prefix] = $this->Application->getUnitOption($prefix, 'ModuleFolder') . '/export'; - } - } - - $json_helper =& $this->Application->recallObject('JSONHelper'); - /* @var $json_helper JSONHelper */ - - return $json_helper->encode($ret); - } - - /** - * Checks, that "view in browse mode" functionality available - * - * @param Array $params - * @return bool - */ - function BrowseModeAvailable($params) - { - $valid_special = $params['Special'] != 'user'; - $not_selector = $this->Application->GetVar('type') != 'item_selector'; - - return $valid_special && $not_selector; - } - - /** - * Returns a link for editing product - * - * @param Array $params - * @return string - */ - function ItemEditLink($params) - { - $object =& $this->getObject(); - /* @var $object kDBList */ - - $edit_template = $this->Application->getUnitOption($this->Prefix, 'AdminTemplatePath') . '/' . $this->Application->getUnitOption($this->Prefix, 'AdminTemplatePrefix') . 'edit'; - - $url_params = Array ( - 'm_opener' => 'd', - $this->Prefix.'_mode' => 't', - $this->Prefix.'_event' => 'OnEdit', - $this->Prefix.'_id' => $object->GetID(), - 'm_cat_id' => $object->GetDBField('ParentId'), - 'pass' => 'all,'.$this->Prefix, - 'no_pass_through' => 1, - ); - - return $this->Application->HREF($edit_template,'', $url_params); - } -} \ No newline at end of file