/** * Hook "load_products_extra_data_post" handler. * * @param $products * @param $product_ids * @param $params * @param $lang_code */ function fn_ult_load_products_extra_data_post(&$products, $product_ids, $params, $lang_code) { if (!($company_id = Registry::get('runtime.company_id')) || !in_array('product_name', $params['extend'])) { return; } $extra_fields = array('?:ult_product_descriptions' => array('primary_key' => 'product_id', 'condition' => db_quote('AND ?:ult_product_descriptions.company_id = ?i AND ?:ult_product_descriptions.lang_code = ?s', $company_id, $lang_code), 'fields' => array('short_description', 'full_description' => 'IF(?:ult_product_descriptions.short_description = "", ?:ult_product_descriptions.full_description, "")', 'meta_keywords', 'meta_description', 'search_words', 'promo_text'))); // Load shared prices lazily when they are needed and no sorting or filtering by price is applied if (in_array('prices', $params['extend']) && $params['sort_by'] != 'price' && !in_array('prices2', $params['extend'])) { $extra_fields['?:ult_product_prices'] = array('primary_key' => 'product_id', 'fields' => array('price' => 'MIN(IF(' . '?:ult_product_prices.percentage_discount = 0,' . '?:ult_product_prices.price,' . '?:ult_product_prices.price - (?:ult_product_prices.price * ?:ult_product_prices.percentage_discount)/100' . '))'), 'condition' => db_quote(' AND ?:ult_product_prices.lower_limit = 1' . ' AND ?:ult_product_prices.company_id = ?i' . ' AND ?:ult_product_prices.usergroup_id IN (?n)', $company_id, $params['area'] == 'A' ? USERGROUP_ALL : array_merge(array(USERGROUP_ALL), $_SESSION['auth']['usergroup_ids'])), 'group_by' => ' GROUP BY ?:ult_product_prices.product_id'); } fn_merge_extra_data_to_entity_list(fn_load_extra_data_by_entity_ids($extra_fields, $product_ids), $products); }
/** * Lazily loads additional data related to products after they have been fetched from DB. * Used to ease main product loading SQL-query. * * @param array $products List of products * @param array $params Parameters passed to fn_get_products() * @param string $lang_code Language code passed to fn_get_products() * * @return array List of products with additional data merged into. */ function fn_load_products_extra_data($products, $params, $lang_code) { $products = fn_array_elements_to_keys($products, 'product_id'); $product_ids = array_keys($products); $extra_fields = array(); // Fields from "products" table $extra_fields['?:products'] = array('primary_key' => 'product_id', 'fields' => empty($params['only_short_fields']) ? array('*') : array('product_id', 'product_code', 'product_type', 'status', 'company_id', 'list_price', 'amount', 'weight', 'tracking', 'is_edp')); // Load prices lazily when they are needed and no sorting or filtering by price is applied if (in_array('prices', $params['extend']) && $params['sort_by'] != 'price' && !in_array('prices2', $params['extend'])) { $extra_fields['?:product_prices'] = array('primary_key' => 'product_id', 'fields' => array('price' => 'MIN(IF(' . '?:product_prices.percentage_discount = 0,' . '?:product_prices.price,' . '?:product_prices.price - (?:product_prices.price * ?:product_prices.percentage_discount)/100' . '))'), 'condition' => db_quote(' AND ?:product_prices.lower_limit = 1 AND ?:product_prices.usergroup_id IN (?n)', $params['area'] == 'A' ? USERGROUP_ALL : array_unique(array_merge(array(USERGROUP_ALL), $_SESSION['auth']['usergroup_ids']))), 'group_by' => ' GROUP BY ?:product_prices.product_id'); } // Descriptions $extra_fields['?:product_descriptions']['primary_key'] = 'product_id'; $extra_fields['?:product_descriptions']['condition'] = db_quote(" AND ?:product_descriptions.lang_code = ?s", $lang_code); if (in_array('search_words', $params['extend'])) { $extra_fields['?:product_descriptions']['fields'][] = 'search_words'; } if (in_array('description', $params['extend'])) { $extra_fields['?:product_descriptions']['fields'][] = 'short_description'; if (in_array('full_description', $params['extend'])) { $extra_fields['?:product_descriptions']['fields'][] = 'full_description'; } else { $extra_fields['?:product_descriptions']['fields']['full_description'] = "IF(?:product_descriptions.short_description = '', ?:product_descriptions.full_description, '')"; } } // Categories if (in_array('categories', $params['extend'])) { $categories_join = ' INNER JOIN ?:categories ON ?:categories.category_id = ?:products_categories.category_id'; if ($params['area'] == 'C') { if (!fn_is_preview_action($_SESSION['auth'], $params)) { $categories_join .= ' AND (' . fn_find_array_in_set($_SESSION['auth']['usergroup_ids'], '?:categories.usergroup_ids', true) . ')'; } $categories_join .= db_quote(' AND ?:categories.status IN (?a) ', array('A', 'H')); } $extra_fields['?:products_categories'] = array('primary_key' => 'product_id', 'fields' => array('category_ids' => 'GROUP_CONCAT(' . 'IF(?:products_categories.link_type = "M",' . ' CONCAT(?:products_categories.category_id, "M"),' . ' ?:products_categories.category_id)' . ')', 'position' => '?:products_categories.position'), 'condition' => fn_get_localizations_condition('?:categories.localization', true), 'join' => $categories_join, 'group_by' => ' GROUP BY ?:products_categories.product_id'); if (!empty($params['cid'])) { $extra_fields['?:products_categories']['group_by'] .= db_quote(' ,?:products_categories.category_id = ?i', $params['cid']); } } /** * Allows you to extend configuration of extra fields that should be lazily loaded for products. * * @see fn_load_extra_data_by_item_ids() * @param array $extra_fields * @param array $products List of products * @param array $product_ids List of product identifiers * @param array $params Parameters passed to fn_get_products() * @param string $lang_code Language code passed to fn_get_products() */ fn_set_hook('load_products_extra_data', $extra_fields, $products, $product_ids, $params, $lang_code); // Execute extra data loading SQL-queries and merge results into $products array fn_merge_extra_data_to_entity_list(fn_load_extra_data_by_entity_ids($extra_fields, $product_ids), $products); // Categories post-processing if (in_array('categories', $params['extend'])) { foreach ($products as $k => $v) { list($products[$k]['category_ids'], $products[$k]['main_category']) = fn_convert_categories($v['category_ids']); } } /** * Allows you lazily load extra data for products after they were fetched from DB or post-process lazy-loaded * additional data related to products. * * @param array $products List of products * @param array $product_ids List of product identifiers * @param array $params Parameters passed to fn_get_products() * @param string $lang_code Language code passed to fn_get_products() */ fn_set_hook('load_products_extra_data_post', $products, $product_ids, $params, $lang_code); return $products; }