/** * Gets list of menu items for block menu * * @param mixed $value Default value of current block content item * @param array $block Block params * @param array $block_scheme Scheme of block * @return array List of menu items */ function fn_get_menu_items($value, $block, $block_scheme) { $menu_items = array(); if (!empty($block['content']['menu']) && Menu::getStatus($block['content']['menu']) == 'A') { $params = array('section' => 'A', 'get_params' => true, 'icon_name' => '', 'multi_level' => true, 'use_localization' => true, 'status' => 'A', 'generate_levels' => true, 'request' => array('menu_id' => $block['content']['menu'])); $menu_items = fn_top_menu_form(fn_get_static_data($params)); fn_dropdown_appearance_cut_second_third_levels($menu_items, 'subitems', $block['properties']); } return $menu_items; }
/** * Gets categories tree beginning from category identifier defined in params or root category * @param array $params Categories search params * category_id - Root category identifier * visible - Flag that defines if only visible categories should be included * current_category_id - Identifier of current node for visible categories * simple - Flag that defines if category path should be getted as set of category IDs * plain - Flag that defines if continues list of categories should be returned * -------------------------------------- * Examples: * Gets whole categories tree: * fn_get_categories() * -------------------------------------- * Gets subcategories tree of the category: * fn_get_categories(array( * 'category_id' => 123 * )) * -------------------------------------- * Gets all first-level nodes of the category * fn_get_categories(array( * 'category_id' => 123, * 'visible' => true * )) * -------------------------------------- * Gets all visible nodes of the category, start from the root * fn_get_categories(array( * 'category_id' => 0, * 'current_category_id' => 234, * 'visible' => true * )) * @param string $lang_code 2-letters language code * @return array Categories tree */ function fn_get_categories($params = array(), $lang_code = CART_LANGUAGE) { /** * Changes params for the categories search * * @param array $params Categories search params * @param string $lang_code 2-letters language code */ fn_set_hook('get_categories_pre', $params, $lang_code); $default_params = array('category_id' => 0, 'visible' => false, 'current_category_id' => 0, 'simple' => true, 'plain' => false, 'limit' => 0, 'item_ids' => '', 'group_by_level' => true, 'get_images' => false, 'category_delimiter' => '/', 'get_frontend_urls' => false, 'max_nesting_level' => null); $params = array_merge($default_params, $params); $sortings = array('timestamp' => '?:categories.timestamp', 'name' => '?:category_descriptions.category', 'position' => array('?:categories.is_trash', '?:categories.position', '?:category_descriptions.category')); $auth =& Tygh::$app['session']['auth']; $fields = array('?:categories.category_id', '?:categories.parent_id', '?:categories.id_path', '?:category_descriptions.category', '?:categories.position', '?:categories.status'); if (!$params['simple']) { $fields[] = '?:categories.product_count'; } if (empty($params['current_category_id']) && !empty($params['product_category_id'])) { $params['current_category_id'] = $params['product_category_id']; } $condition = ''; if (AREA == 'C') { $_statuses = array('A'); // Show enabled products/categories $condition .= fn_get_localizations_condition('?:categories.localization', true); $condition .= " AND (" . fn_find_array_in_set($auth['usergroup_ids'], '?:categories.usergroup_ids', true) . ")"; $condition .= db_quote(" AND ?:categories.status IN (?a)", $_statuses); } if (!empty($params['status'])) { $condition .= db_quote(" AND ?:categories.status IN (?a)", $params['status']); } if (isset($params['parent_category_id'])) { // set parent id, that was set in block properties $params['category_id'] = $params['parent_category_id']; } if ($params['visible'] == true && empty($params['b_id'])) { if (!empty($params['current_category_id'])) { $cur_id_path = db_get_field("SELECT id_path FROM ?:categories WHERE category_id = ?i", $params['current_category_id']); if (!empty($cur_id_path)) { $parent_categories_ids = explode('/', $cur_id_path); } } if (!empty($params['category_id']) || empty($parent_categories_ids)) { $parent_categories_ids[] = $params['category_id']; } $condition .= db_quote(" AND ?:categories.parent_id IN (?n)", $parent_categories_ids); } if (!empty($params['category_id'])) { $from_id_path = db_get_field("SELECT id_path FROM ?:categories WHERE category_id = ?i", $params['category_id']); $condition .= db_quote(" AND ?:categories.id_path LIKE ?l", "{$from_id_path}/%"); } if (!empty($params['item_ids'])) { $condition .= db_quote(' AND ?:categories.category_id IN (?n)', explode(',', $params['item_ids'])); } if (!empty($params['except_id']) && (empty($params['item_ids']) || !empty($params['item_ids']) && !in_array($params['except_id'], explode(',', $params['item_ids'])))) { $condition .= db_quote(' AND ?:categories.category_id != ?i AND ?:categories.parent_id != ?i', $params['except_id'], $params['except_id']); } if (!empty($params['period']) && $params['period'] != 'A') { list($params['time_from'], $params['time_to']) = fn_create_periods($params); $condition .= db_quote(" AND (?:categories.timestamp >= ?i AND ?:categories.timestamp <= ?i)", $params['time_from'], $params['time_to']); } if (!empty($params['max_nesting_level'])) { if (!empty($params['parent_category_id'])) { $parent_nesting_level = (int) db_get_field("SELECT level FROM ?:categories WHERE category_id = ?i", $params['parent_category_id']); } else { $parent_nesting_level = 0; } $condition .= db_quote(" AND ?:categories.level <= ?i", $params['max_nesting_level'] + $parent_nesting_level); } $limit = $join = $group_by = ''; /** * Changes SQL params for the categories search * * @param array $params Categories search params * @param string $join Join parametrs * @param string $condition Request condition * @param array $fields Selectable fields * @param string $group_by Group by parameters * @param array $sortings Sorting fields * @param string $lang_code Language code */ fn_set_hook('get_categories', $params, $join, $condition, $fields, $group_by, $sortings, $lang_code); if (!empty($params['limit'])) { $limit = db_quote(' LIMIT 0, ?i', $params['limit']); } $sorting = db_sort($params, $sortings, 'position', 'asc'); if (!empty($params['get_conditions'])) { return array($fields, $join, $condition, $group_by, $sorting, $limit); } $categories = db_get_hash_array('SELECT ' . implode(',', $fields) . " FROM ?:categories LEFT JOIN ?:category_descriptions ON ?:categories.category_id = ?:category_descriptions.category_id AND ?:category_descriptions.lang_code = ?s {$join} WHERE 1 ?p {$group_by} {$sorting} ?p", 'category_id', $lang_code, $condition, $limit); /** * Process categories list after getting it * @param array $categories Categories list * @param array $params Categories search params * @param string $join Join parametrs * @param string $condition Request condition * @param array $fields Selectable fields * @param string $group_by Group by parameters * @param array $sortings Sorting fields * @param string $sorting Sorting parameters * @param string $limit Limit parameter * @param string $lang_code Language code */ fn_set_hook('get_categories_after_sql', $categories, $params, $join, $condition, $fields, $group_by, $sortings, $sorting, $limit, $lang_code); if (empty($categories)) { return array(array()); } // @TODO remove from here, because active category may not exist in the resulting set. This is the job for controller. if (!empty($params['active_category_id']) && !empty($categories[$params['active_category_id']])) { $categories[$params['active_category_id']]['active'] = true; Registry::set('runtime.active_category_ids', explode('/', $categories[$params['active_category_id']]['id_path'])); } $categories_list = array(); if ($params['simple'] == true || $params['group_by_level'] == true) { $child_for = array_keys($categories); $where_condition = !empty($params['except_id']) ? db_quote(' AND category_id != ?i', $params['except_id']) : ''; $has_children = db_get_hash_array("SELECT category_id, parent_id FROM ?:categories WHERE parent_id IN(?n) ?p", 'parent_id', $child_for, $where_condition); } $category_ids = array(); // Group categories by the level (simple) if ($params['simple'] == true) { foreach ($categories as $k => $v) { $v['level'] = substr_count($v['id_path'], '/'); if ((!empty($params['current_category_id']) || $v['level'] == 0) && isset($has_children[$k])) { $v['has_children'] = $has_children[$k]['category_id']; } $categories_list[$v['level']][$v['category_id']] = $v; $category_ids[] = $v['category_id']; } } elseif ($params['group_by_level'] == true) { // Group categories by the level (simple) and literalize path foreach ($categories as $k => $v) { $path = explode('/', $v['id_path']); $category_path = array(); foreach ($path as $__k => $__v) { $category_path[$__v] = @$categories[$__v]['category']; } $v['category_path'] = implode($params['category_delimiter'], $category_path); $v['level'] = substr_count($v['id_path'], "/"); if ((!empty($params['current_category_id']) || $v['level'] == 0) && isset($has_children[$k])) { $v['has_children'] = $has_children[$k]['category_id']; } $categories_list[$v['level']][$v['category_id']] = $v; $category_ids[] = $v['category_id']; } } else { // @FIXME: Seems that this code isn't being executed anywhere $categories_list = $categories; $category_ids = fn_fields_from_multi_level($categories_list, 'category_id', 'category_id'); } ksort($categories_list, SORT_NUMERIC); $categories_list = array_reverse($categories_list, !$params['simple'] && !$params['group_by_level']); // Lazy-load category image pairs if ($params['get_images']) { $image_pairs_for_categories = fn_get_image_pairs($category_ids, 'category', 'M', true, true, $lang_code); } // Rearrangement of subcategories and filling with images foreach ($categories_list as $level => $categories_of_level) { // Fill categories' image pairs for plain structure of array if ($params['get_images'] && !$params['simple'] && !$params['group_by_level'] && !empty($image_pairs_for_categories[$level])) { $categories_list[$level]['main_pair'] = reset($image_pairs_for_categories[$level]); } foreach ($categories_of_level as $category_id => $category_data) { // Fill categories' image pairs for multi-level structure of array if ($params['get_images'] && !empty($image_pairs_for_categories[$category_id]) && ($params['simple'] || $params['group_by_level'])) { $categories_list[$level][$category_id]['main_pair'] = reset($image_pairs_for_categories[$category_id]); } // Move subcategories to their parents' elements if (isset($category_data['parent_id']) && isset($categories_list[$level + 1][$category_data['parent_id']])) { $categories_list[$level + 1][$category_data['parent_id']]['subcategories'][] = $categories_list[$level][$category_id]; unset($categories_list[$level][$category_id]); } } } if (!empty($params['get_frontend_urls'])) { foreach ($categories_list as &$category) { $category['url'] = fn_url('categories.view?category_id=' . $category['category_id'], 'C'); } } if ($params['group_by_level'] == true) { $categories_list = array_pop($categories_list); } if ($params['plain'] == true) { $categories_list = fn_multi_level_to_plain($categories_list, 'subcategories'); } if (!empty($params['item_ids'])) { $categories_list = fn_sort_by_ids($categories_list, explode(',', $params['item_ids']), 'category_id'); } if (!empty($params['add_root'])) { array_unshift($categories_list, array('category_id' => 0, 'category' => $params['add_root'])); } /** * Process categories list before cutting second and fird levels * * @param array $categories_list Categories list * @param array $params Categories search params */ fn_set_hook('get_categories_before_cut_levels', $categories_list, $params); fn_dropdown_appearance_cut_second_third_levels($categories_list, 'subcategories', $params); /** * Process final category list * * @param array $categories_list Categories list * @param array $params Categories search params * @param string $lang_code Language code */ fn_set_hook('get_categories_post', $categories_list, $params, $lang_code); // process search results if (!empty($params['save_view_results'])) { $request = $params; $request['page'] = 1; $categories_res = $params['plain'] == true ? $categories_list : fn_multi_level_to_plain($categories_list, 'subcategories'); foreach ($categories_res as $key => $item) { if (empty($item['category_id'])) { unset($categories_res[$key]); } } $request['total_items'] = $request['items_per_page'] = count($categories_res); LastView::instance()->processResults('categories', $categories_res, $request); } return array($categories_list, $params); }
/** * Gets categories tree beginning from category identifier defined in params or root category * @param array $params Categories search params * category_id - Root category identifier * visible - Flag that defines if only visible categories should be included * current_category_id - Identifier of current node for visible categories * simple - Flag that defines if category path should be getted as set of category IDs * plain - Flag that defines if continues list of categories should be returned * -------------------------------------- * Examples: * Gets whole categories tree: * fn_get_categories() * -------------------------------------- * Gets subcategories tree of the category: * fn_get_categories(array( * 'category_id' => 123 * )) * -------------------------------------- * Gets all first-level nodes of the category * fn_get_categories(array( * 'category_id' => 123, * 'visible' => true * )) * -------------------------------------- * Gets all visible nodes of the category, start from the root * fn_get_categories(array( * 'category_id' => 0, * 'current_category_id' => 234, * 'visible' => true * )) * @param string $lang_code 2-letters language code * @return array Categories tree */ function fn_get_categories($params = array(), $lang_code = CART_LANGUAGE) { /** * Changes params for the categories search * * @param array $params Categories search params * @param string $lang_code 2-letters language code */ fn_set_hook('get_categories_pre', $params, $lang_code); $default_params = array('category_id' => 0, 'visible' => false, 'current_category_id' => 0, 'simple' => true, 'plain' => false, 'limit' => 0, 'item_ids' => '', 'group_by_level' => true, 'get_images' => false, 'category_delimiter' => '/', 'get_frontend_urls' => false); $params = array_merge($default_params, $params); $sortings = array('timestamp' => '?:categories.timestamp', 'name' => '?:category_descriptions.category', 'position' => array('?:categories.position', '?:category_descriptions.category')); $auth =& $_SESSION['auth']; $fields = array('?:categories.category_id', '?:categories.parent_id', '?:categories.id_path', '?:category_descriptions.category', '?:categories.position', '?:categories.status'); if ($params['simple'] == false) { $fields[] = '?:categories.product_count'; } if (empty($params['current_category_id']) && !empty($params['product_category_id'])) { $params['current_category_id'] = $params['product_category_id']; } $condition = ''; if (fn_allowed_for('MULTIVENDOR')) { if (Registry::get('runtime.company_id')) { $company_id = Registry::get('runtime.company_id'); } elseif (!empty($params['company_ids'])) { $company_id = (int) $params['company_ids']; } if (!empty($company_id)) { $company_data = fn_get_company_data($company_id); if (!empty($company_data['category_ids'])) { $company_condition = db_quote(' AND ?:categories.category_id IN (?n)', $company_data['category_ids']); $condition .= $company_condition; } } } if (AREA == 'C') { $_statuses = array('A'); // Show enabled products/categories $condition .= fn_get_localizations_condition('?:categories.localization', true); $condition .= " AND (" . fn_find_array_in_set($auth['usergroup_ids'], '?:categories.usergroup_ids', true) . ")"; $condition .= db_quote(" AND ?:categories.status IN (?a)", $_statuses); } if (!empty($params['status'])) { $condition .= db_quote(" AND ?:categories.status IN (?a)", $params['status']); } if (isset($params['parent_category_id'])) { // set parent id, that was set in block properties $params['category_id'] = $params['parent_category_id']; } if ($params['visible'] == true && empty($params['b_id'])) { if (!empty($params['current_category_id'])) { $cur_id_path = db_get_field("SELECT id_path FROM ?:categories WHERE category_id = ?i", $params['current_category_id']); if (!empty($cur_id_path)) { $parent_categories_ids = explode('/', $cur_id_path); } } if (!empty($params['category_id']) || empty($parent_categories_ids)) { $parent_categories_ids[] = $params['category_id']; } $parents_condition = db_quote(" AND ?:categories.parent_id IN (?n)", $parent_categories_ids); } // if we have company_condtion, skip $parents_condition, it will be processed later by PHP if (!empty($parents_condition) && empty($company_condition)) { $condition .= $parents_condition; } if (!empty($params['category_id'])) { $from_id_path = db_get_field("SELECT id_path FROM ?:categories WHERE category_id = ?i", $params['category_id']); $condition .= db_quote(" AND ?:categories.id_path LIKE ?l", "{$from_id_path}/%"); } if (!empty($params['item_ids'])) { $condition .= db_quote(' AND ?:categories.category_id IN (?n)', explode(',', $params['item_ids'])); } if (!empty($params['except_id']) && (empty($params['item_ids']) || !empty($params['item_ids']) && !in_array($params['except_id'], explode(',', $params['item_ids'])))) { $condition .= db_quote(' AND ?:categories.category_id != ?i AND ?:categories.parent_id != ?i', $params['except_id'], $params['except_id']); } if (!empty($params['period']) && $params['period'] != 'A') { list($params['time_from'], $params['time_to']) = fn_create_periods($params); $condition .= db_quote(" AND (?:categories.timestamp >= ?i AND ?:categories.timestamp <= ?i)", $params['time_from'], $params['time_to']); } $limit = $join = $group_by = ''; /** * Changes SQL params for the categories search * * @param array $params Categories search params * @param string $join Join parametrs * @param string $condition Request condition * @param array $fields Selectable fields * @param string $group_by Group by parameters * @param array $sortings Sorting fields * @param string $lang_code Language code */ fn_set_hook('get_categories', $params, $join, $condition, $fields, $group_by, $sortings, $lang_code); if (!empty($params['limit'])) { $limit = db_quote(' LIMIT 0, ?i', $params['limit']); } $sorting = db_sort($params, $sortings, 'position', 'asc'); if (!empty($params['get_conditions'])) { return array($fields, $join, $condition, $group_by, $sorting, $limit); } $categories = db_get_hash_array('SELECT ' . implode(',', $fields) . " FROM ?:categories LEFT JOIN ?:category_descriptions ON ?:categories.category_id = ?:category_descriptions.category_id AND ?:category_descriptions.lang_code = ?s {$join} WHERE 1 ?p {$group_by} {$sorting} ?p", 'category_id', $lang_code, $condition, $limit); /** * Process categories list after getting it * @param array $categories Categories list * @param array $params Categories search params */ fn_set_hook('get_categories_after_sql', $categories, $params); if (empty($categories)) { return array(array()); } if (fn_allowed_for('ULTIMATE')) { // we can't build the correct tree for vendors if there are not available parent categories if (!empty($company_condition)) { $selected_ids = array_keys($categories); $parent_ids = array(); // so get skipped parent categories ids foreach ($categories as $v) { if ($v['parent_id'] && !in_array($v['parent_id'], $selected_ids)) { $parent_ids = array_merge($parent_ids, explode('/', $v['id_path'])); } } if (!empty($parent_ids)) { // and retrieve its data if (Registry::get('runtime.company_id') && !empty($company_condition)) { $condition = str_replace($company_condition, '', $condition); } $condition .= db_quote(' AND ?:categories.category_id IN (?a)', $parent_ids); $fields[] = '1 as disabled'; //mark such categories as disabled $parent_categories = db_get_hash_array('SELECT ' . implode(',', $fields) . " FROM ?:categories LEFT JOIN ?:category_descriptions ON ?:categories.category_id = ?:category_descriptions.category_id AND ?:category_descriptions.lang_code = ?s {$join} WHERE 1 ?p {$group_by} {$sorting} ?p", 'category_id', $lang_code, $condition, $limit); $categories = $categories + $parent_categories; } // process parents_condition if it was skipped if (!empty($parent_categories_ids)) { foreach ($categories as $k => $v) { if (!in_array($v['parent_id'], $parent_categories_ids)) { unset($categories[$k]); } } } } } if (!empty($params['active_category_id']) && !empty($categories[$params['active_category_id']])) { $categories[$params['active_category_id']]['active'] = true; Registry::set('runtime.active_category_ids', explode('/', $categories[$params['active_category_id']]['id_path'])); } $categories_list = array(); if ($params['simple'] == true || $params['group_by_level'] == true) { $child_for = array_keys($categories); $where_condition = !empty($params['except_id']) ? db_quote(' AND category_id != ?i', $params['except_id']) : ''; $has_children = db_get_hash_array("SELECT category_id, parent_id FROM ?:categories WHERE parent_id IN(?n) ?p", 'parent_id', $child_for, $where_condition); } // Group categories by the level (simple) if ($params['simple'] == true) { foreach ($categories as $k => $v) { $v['level'] = substr_count($v['id_path'], '/'); if ((!empty($params['current_category_id']) || $v['level'] == 0) && isset($has_children[$k])) { $v['has_children'] = $has_children[$k]['category_id']; } $categories_list[$v['level']][$v['category_id']] = $v; if ($params['get_images'] == true) { $categories_list[$v['level']][$v['category_id']]['main_pair'] = fn_get_image_pairs($v['category_id'], 'category', 'M', true, true, $lang_code); } } } elseif ($params['group_by_level'] == true) { // Group categories by the level (simple) and literalize path foreach ($categories as $k => $v) { $path = explode('/', $v['id_path']); $category_path = array(); foreach ($path as $__k => $__v) { $category_path[$__v] = @$categories[$__v]['category']; } $v['category_path'] = implode($params['category_delimiter'], $category_path); $v['level'] = substr_count($v['id_path'], "/"); if ((!empty($params['current_category_id']) || $v['level'] == 0) && isset($has_children[$k])) { $v['has_children'] = $has_children[$k]['category_id']; } $categories_list[$v['level']][$v['category_id']] = $v; if ($params['get_images'] == true) { $categories_list[$v['level']][$v['category_id']]['main_pair'] = fn_get_image_pairs($v['category_id'], 'category', 'M', true, true, $lang_code); } } } else { $categories_list = $categories; if ($params['get_images'] == true) { foreach ($categories_list as $k => $v) { if ($params['get_images'] == true) { $categories_list[$k]['main_pair'] = fn_get_image_pairs($v['category_id'], 'category', 'M', true, true, $lang_code); } } } } ksort($categories_list, SORT_NUMERIC); $categories_list = array_reverse($categories_list); foreach ($categories_list as $level => $v) { foreach ($v as $k => $data) { if (isset($data['parent_id']) && isset($categories_list[$level + 1][$data['parent_id']])) { $categories_list[$level + 1][$data['parent_id']]['subcategories'][] = $categories_list[$level][$k]; unset($categories_list[$level][$k]); } } } if (!empty($params['get_frontend_urls'])) { foreach ($categories_list as &$category) { $category['url'] = fn_url('categories.view?category_id=' . $category['category_id'], 'C'); } } if ($params['group_by_level'] == true) { $categories_list = array_pop($categories_list); } if ($params['plain'] == true) { $categories_list = fn_multi_level_to_plain($categories_list, 'subcategories'); } if (!empty($params['item_ids'])) { $categories_list = fn_sort_by_ids($categories_list, explode(',', $params['item_ids']), 'category_id'); } if (!empty($params['add_root'])) { array_unshift($categories_list, array('category_id' => 0, 'category' => $params['add_root'])); } /** * Process categories list before cutting second and fird levels * * @param array $categories_list Categories list * @param array $params Categories search params */ fn_set_hook('get_categories_before_cut_levels', $categories_list, $params); fn_dropdown_appearance_cut_second_third_levels($categories_list, 'subcategories', $params); /** * Process final category list * * @param array $categories_list Categories list * @param array $params Categories search params * @param string $lang_code Language code */ fn_set_hook('get_categories_post', $categories_list, $params, $lang_code); // process search results if (!empty($params['save_view_results'])) { $request = $params; $request['page'] = 1; $categories_res = $params['plain'] == true ? $categories_list : fn_multi_level_to_plain($categories_list, 'subcategories'); foreach ($categories_res as $key => $item) { if (empty($item['category_id'])) { unset($categories_res[$key]); } } $request['total_items'] = $request['items_per_page'] = count($categories_res); LastView::instance()->processResults('categories', $categories_res, $request); } return array($categories_list, $params); }
/** * Gets categories tree beginning from category identifier defined in params or root category * @param array $params Categories search params * category_id - Root category identifier * visible - Flag that defines if only visible categories should be included * current_category_id - Identifier of current node for visible categories * simple - Flag that defines if category path should be getted as set of category IDs * plain - Flag that defines if continues list of categories should be returned * -------------------------------------- * Examples: * Gets whole categories tree: * fn_ebay_get_categories() * -------------------------------------- * Gets subcategories tree of the category: * fn_ebay_get_categories(array( * 'category_id' => 123 * )) * -------------------------------------- * Gets all first-level nodes of the category * fn_ebay_get_categories(array( * 'category_id' => 123, * 'visible' => true * )) * -------------------------------------- * Gets all visible nodes of the category, start from the root * fn_ebay_get_categories(array( * 'category_id' => 0, * 'current_category_id' => 234, * 'visible' => true * )) * @param int $site_id * @param string $lang_code 2-letters language code * @return array Categories tree */ function fn_ebay_get_categories($params = array(), $site_id = 0, $lang_code = CART_LANGUAGE) { $default_params = array('category_id' => 0, 'visible' => false, 'current_category_id' => 0, 'simple' => true, 'plain' => false, 'limit' => 0, 'item_ids' => '', 'group_by_level' => true, 'category_delimiter' => ',', 'max_nesting_level' => null); $params = array_merge($default_params, $params); $sortings = array('name' => '?:ebay_categories.name'); $fields = array('category_id', 'parent_id', 'id_path', 'name', 'level', 'leaf', 'site_id'); if (empty($params['current_category_id']) && !empty($params['product_category_id'])) { $params['current_category_id'] = $params['product_category_id']; } $condition = db_quote('AND site_id = ?i', $site_id); if (isset($params['parent_category_id'])) { // set parent id, that was set in block properties $params['category_id'] = $params['parent_category_id']; } if (empty($params['b_id'])) { $parent_categories_ids = array(); if (!empty($params['current_category_id'])) { $cur_id_path = db_get_field("SELECT id_path FROM ?:ebay_categories WHERE category_id = ?i AND site_id = ?i", $params['current_category_id'], $site_id); if (!empty($cur_id_path)) { $parent_categories_ids = explode(',', $cur_id_path); } } if (!empty($params['category_id']) || empty($parent_categories_ids)) { $parent_categories_ids[] = $params['category_id']; } $parents_condition = db_quote(" AND ?:ebay_categories.parent_id IN (?n)", $parent_categories_ids); } // if we have company_condtion, skip $parents_condition, it will be processed later by PHP if (!empty($parents_condition) && empty($company_condition)) { $condition .= $parents_condition; } if (!empty($params['category_id'])) { $from_id_path = db_get_field("SELECT id_path FROM ?:ebay_categories WHERE category_id = ?i AND site_id = ?i", $params['category_id'], $site_id); $condition .= db_quote(" AND ?:ebay_categories.id_path LIKE ?l", "{$from_id_path},%"); } if (!empty($params['item_ids'])) { $condition .= db_quote(' AND ?:ebay_categories.category_id IN (?n)', explode(',', $params['item_ids'])); } if (!empty($params['except_id']) && (empty($params['item_ids']) || !empty($params['item_ids']) && !in_array($params['except_id'], explode(',', $params['item_ids'])))) { $condition .= db_quote(' AND ?:ebay_categories.category_id != ?i AND ?:ebay_categories.parent_id != ?i', $params['except_id'], $params['except_id']); } if (!empty($params['max_nesting_level'])) { $condition .= db_quote(" AND ?:ebay_categories.level <= ?i", $params['max_nesting_level']); } $limit = $join = $group_by = ''; if (!empty($params['limit'])) { $limit = db_quote(' LIMIT 0, ?i', $params['limit']); } $sorting = db_sort($params, $sortings, 'name', 'asc'); $categories = db_get_hash_array('SELECT ' . implode(',', $fields) . " FROM ?:ebay_categories WHERE 1 ?p {$group_by} {$sorting} ?p", 'category_id', $condition, $limit); if (empty($categories)) { return array(array()); } // @TODO remove from here, because active category may not exist in the resulting set. This is the job for controller. if (!empty($params['active_category_id']) && !empty($categories[$params['active_category_id']])) { $categories[$params['active_category_id']]['active'] = true; } $categories_list = array(); if ($params['simple'] == true || $params['group_by_level'] == true) { $child_for = array_keys($categories); $where_condition = !empty($params['except_id']) ? db_quote(' AND category_id != ?i', $params['except_id']) : ''; $has_children = db_get_hash_array("SELECT category_id, parent_id FROM ?:ebay_categories WHERE parent_id IN(?n) AND site_id = ?i ?p", 'parent_id', $child_for, $site_id, $where_condition); } $category_ids = array(); // Group categories by the level (simple) if ($params['simple'] == true) { foreach ($categories as $k => $v) { $v['level'] = substr_count($v['id_path'], ','); if ((!empty($params['current_category_id']) || $v['level'] == 0) && isset($has_children[$k])) { $v['has_children'] = $has_children[$k]['category_id']; } $categories_list[$v['level']][$v['category_id']] = $v; $category_ids[] = $v['category_id']; } } elseif ($params['group_by_level'] == true) { // Group categories by the level (simple) and literalize path foreach ($categories as $k => $v) { $path = explode('/', $v['id_path']); $category_path = array(); foreach ($path as $__k => $__v) { $category_path[$__v] = @$categories[$__v]['category']; } $v['category_path'] = implode($params['category_delimiter'], $category_path); $v['level'] = substr_count($v['id_path'], ","); if ((!empty($params['current_category_id']) || $v['level'] == 0) && isset($has_children[$k])) { $v['has_children'] = $has_children[$k]['category_id']; } $categories_list[$v['level']][$v['category_id']] = $v; $category_ids[] = $v['category_id']; } } else { // @FIXME: Seems that this code isn't being executed anywhere $categories_list = $categories; $category_ids = fn_fields_from_multi_level($categories_list, 'category_id', 'category_id'); } ksort($categories_list, SORT_NUMERIC); $categories_list = array_reverse($categories_list, !$params['simple'] && !$params['group_by_level']); // Rearrangement of subcategories and filling with images foreach ($categories_list as $level => $categories_of_level) { foreach ($categories_of_level as $category_id => $category_data) { // Move subcategories to their parents' elements if (isset($category_data['parent_id']) && isset($categories_list[$level + 1][$category_data['parent_id']])) { $categories_list[$level + 1][$category_data['parent_id']]['subcategories'][] = $categories_list[$level][$category_id]; unset($categories_list[$level][$category_id]); } } } if ($params['group_by_level'] == true) { $categories_list = array_pop($categories_list); } if ($params['plain'] == true) { $categories_list = fn_multi_level_to_plain($categories_list, 'subcategories'); } if (!empty($params['item_ids'])) { $categories_list = fn_sort_by_ids($categories_list, explode(',', $params['item_ids']), 'category_id'); } if (!empty($params['add_root'])) { array_unshift($categories_list, array('category_id' => 0, 'category' => $params['add_root'])); } fn_dropdown_appearance_cut_second_third_levels($categories_list, 'subcategories', $params); return array($categories_list, $params); }