/** * Renders container * @param array $container Container data to be rendered * @return string HTML code of rendered container */ private function _renderContainer($container) { static $layout_width = 0; if (empty($layout_width)) { $layout_width = Registry::get('runtime.layout.width'); } $content = ''; $container['width'] = $layout_width; $this->_view->assign('container', $container); if (isset($this->_grids[$container['container_id']]) && ($this->_area == 'A' || $container['status'] != 'D')) { $grids = $this->_grids[$container['container_id']]; $grids = fn_build_hierarchic_tree($grids, 'grid_id'); $grids = $this->sortGrids($grids); $this->_parent_grid = array(); $content = $this->_renderGrids($grids); $this->_view->assign('content', $content); // Cleanup old blocks content to avoid extra memory using $this->_rendered_blocks = array(); return $this->_view->fetch($this->_theme . 'container.tpl'); } else { $this->_view->assign('content', ''); if ($this->_area == 'A') { return $this->_view->fetch($this->_theme . 'container.tpl'); } } }
/** * Builds hierarchic tree from array width id and parent_id * @param array $array array of data, must be sorted ASC by parent_id * @param string $object_key name of id key in array * @param string $parent_key name of parent key in array * @param string $cildren_key name of key whee sub elements will be located in tree * @return array */ function fn_build_hierarchic_tree(&$array, $object_key, $parent_key = 'parent_id', $child_key = 'children', &$current_item = null, $parent_id = 0) { $sorted = array(); foreach ($array as $_id => $item) { if ($item[$parent_key] == $parent_id) { $sorted[$item[$object_key]] = $item; $sorted[$item[$object_key]][$child_key] = fn_build_hierarchic_tree($array, $object_key, $parent_key, $child_key, $sorted[$item[$object_key]], $item[$object_key]); } } return $sorted; }
/** * Export blocks to XML structure * * @param array $location_ids * @param array $params * @param string $lang_code * @return ExSimpleXmlElement */ public function export($layout_id, $location_ids = array(), $params = array(), $lang_code = DESCR_SL) { /* Exclude unnecessary fields*/ $except_location_fields = array('location_id', 'company_id'); $except_container_fields = array('container_id', 'location_id', 'dispatch', 'is_default', 'company_id', 'default'); $except_grid_fields = array('container_id', 'location_id', 'position', 'grid_id', 'parent_id', 'order', 'children'); $except_layout_fields = array('layout_id', 'theme_name', 'company_id'); $except_location_fields = array_flip($except_location_fields); $except_container_fields = array_flip($except_container_fields); $except_grid_fields = array_flip($except_grid_fields); $except_layout_fields = array_flip($except_layout_fields); $layout_data = Layout::instance($this->_company_id)->get($layout_id); $layout_data = array_diff_key($layout_data, $except_layout_fields); $xml_root = new ExSimpleXmlElement('<block_scheme></block_scheme>'); $xml_root->addAttribute('scheme', '1.0'); $settings = $xml_root->addChild('settings'); $settings->addChild('default_language', $lang_code); $layout_xml = $xml_root->addChild('layout'); foreach ($layout_data as $field_name => $field_value) { $layout_xml->addChild($field_name, $field_value); } if (empty($location_ids)) { $location_ids = Location::instance($this->_layout_id)->getList(array(), $lang_code); $location_ids = array_keys($location_ids); } foreach ($location_ids as $location_id) { $location = Location::instance($this->_layout_id)->getById($location_id); $containers = Container::getList(array('location_id' => $location_id)); $xml_location = $xml_root->addChild('location'); $location = array_diff_key($location, $except_location_fields); foreach ($location as $attr => $value) { $xml_location->addAttribute($attr, $value); } $xml_containers = $xml_location->addChild('containers'); $xml_translations = $xml_location->addChild('translations'); $translations = Location::instance($this->_layout_id)->getAllDescriptions($location_id); foreach ($translations as $translation) { if ($translation['lang_code'] == $lang_code) { // We do not needed default language continue; } $xml_translation = $xml_translations->addChild('translation'); $xml_translation->addChildCData('meta_keywords', $translation['meta_keywords']); $xml_translation->addChildCData('page_title', $translation['title']); $xml_translation->addChildCData('meta_description', $translation['meta_description']); $xml_translation->addChild('name', $translation['name']); $xml_translation->addAttribute('lang_code', $translation['lang_code']); } unset($xml_translations); foreach ($containers as $position => $container) { $grids = Grid::getList(array('container_ids' => $container['container_id'])); $xml_container = $xml_containers->addChild('container'); foreach ($container as $attr => $value) { $xml_container->addAttribute($attr, $value); } if (!empty($grids) && isset($grids[$container['container_id']])) { $grids = $grids[$container['container_id']]; $grids = fn_build_hierarchic_tree($grids, 'grid_id'); $container = array_diff_key($container, $except_container_fields); $this->_buildGridStructure($xml_container, $grids, $except_grid_fields, $lang_code); } } } return $xml_root->asXML(); }
/** * Removes grid * @param int $grid_id Grid identifier * @return bool True in success, false otherwise */ public static function remove($grid_id) { $grids = db_get_hash_array('SELECT b.grid_id, b.parent_id FROM ?:bm_grids as a LEFT JOIN ?:bm_grids as b ON a.container_id = b.container_id WHERE a.grid_id = ?i ORDER BY b.parent_id, b.grid_id ASC', 'grid_id', $grid_id); if (!empty($grids)) { $grids = fn_build_hierarchic_tree($grids, 'grid_id'); foreach ($grids as $grid) { self::_remove($grid_id, $grid); } self::removeMissing(); return true; } else { return false; } }
/** * Renders container * @param array $container Container data to be rendered * @return string HTML code of rendered container */ private function _renderContainer($container) { static $layout_width = 0; if (empty($layout_width)) { $layout_width = Registry::get('runtime.layout.width'); } $content = ''; $container['width'] = $layout_width; $this->_view->assign('container', $container); if (isset($this->_grids[$container['container_id']]) && ($this->_area == 'A' || $container['status'] != 'D')) { $grids = $this->_grids[$container['container_id']]; $grids = fn_build_hierarchic_tree($grids, 'grid_id'); $this->_parent_grid = array(); foreach ($grids as $grid) { $content .= $this->_renderGrid($grid); } $this->_view->assign('content', $content); return $this->_view->fetch($this->_theme . 'container.tpl'); } else { $this->_view->assign('content', ''); if ($this->_area == 'A') { return $this->_view->fetch($this->_theme . 'container.tpl'); } } }