fn_se_set_simple_setting('last_resync', TIME); } } elseif ($q['action'] == 'categories_update') { $data = fn_se_get_categories_data($data, $company_id, $lang_code); if (!empty($data)) { $data = json_encode(array_merge($json_header, array('categories' => $data))); $status = fn_se_send_request('/api/items/update/json', $private_key, array('data' => $data)); } } elseif ($q['action'] == 'pages_update') { $data = fn_se_get_pages_data($data, $company_id, $lang_code); if (!empty($data)) { $data = json_encode(array_merge($json_header, array('pages' => $data))); $status = fn_se_send_request('/api/items/update/json', $private_key, array('data' => $data)); } } elseif ($q['action'] == 'facet_update') { list($filters, ) = fn_get_product_filters(array('filter_id' => $filter_ids, 'get_variants' => true), 0, $lang_code); $facets = array(); foreach ($filters as $filter_data) { $facets[] = fn_se_prepare_facet_data($filter_data); } if (!empty($facets)) { $data = json_encode(array_merge($json_header, array('schema' => $facets))); $status = fn_se_send_request('/api/items/update/json', $private_key, array('data' => $data)); } } elseif ($q['action'] == 'update') { $data = fn_se_get_products_data($data, $company_id, $lang_code, true); if (!empty($data)) { $data = json_encode(array_merge($json_header, $data)); if (function_exists('gzcompress')) { $_data = gzcompress($data, 5); if (!empty($_data)) {
Tygh::$app['view']->assign('filter_fields', fn_get_product_filter_fields()); if (empty($filters) && defined('AJAX_REQUEST')) { Tygh::$app['ajax']->assign('force_redirection', fn_url('product_filters.manage')); } $params = array('variants' => true, 'plain' => true, 'feature_types' => array(ProductFeatures::SINGLE_CHECKBOX, ProductFeatures::TEXT_SELECTBOX, ProductFeatures::EXTENDED, ProductFeatures::NUMBER_SELECTBOX, ProductFeatures::MULTIPLE_CHECKBOX, ProductFeatures::NUMBER_FIELD, ProductFeatures::DATE)); list($filter_features) = fn_get_product_features($params, 0, DESCR_SL); Tygh::$app['view']->assign('filter_features', $filter_features); } if ($mode == 'picker') { Tygh::$app['view']->display('pickers/filters/picker_contents.tpl'); exit; } } elseif ($mode == 'update') { $params = $_REQUEST; $params['get_variants'] = true; list($filters) = fn_get_product_filters($params); Tygh::$app['view']->assign('filter', array_shift($filters)); if (fn_allowed_for('ULTIMATE') && !Registry::get('runtime.company_id')) { Tygh::$app['view']->assign('picker_selected_companies', fn_ult_get_controller_shared_companies($_REQUEST['filter_id'])); } } function fn_update_product_filter($filter_data, $filter_id, $lang_code = DESCR_SL) { if (fn_allowed_for('ULTIMATE') && Registry::get('runtime.company_id')) { if (!empty($filter_id) && !fn_check_company_id('product_filters', 'filter_id', $filter_id)) { fn_company_access_denied_notification(); return false; } if (!empty($filter_id)) { unset($filter_data['company_id']); }
function fn_searchanise_get_filters_products_count($params) { if (AREA == 'A' || fn_se_check_disabled() || !empty($params['disable_searchanise']) || empty($params['q']) && fn_se_get_simple_setting('use_navigation') !== 'Y' || fn_se_get_import_status(fn_se_get_company_id(), CART_LANGUAGE) != 'done' || Registry::ifGet('addons.age_verification.status', 'D') == 'A' || Registry::ifGet('addons.vendor_data_premoderation.status', 'D') == 'A') { return fn_get_filters_products_count($params); } $key = 'pfilters_se_' . md5(serialize($params)); Registry::registerCache($key, array('products', 'product_features', 'product_filters', 'product_features_values', 'categories'), Registry::cacheLevel('user')); // Check exist cache. if (Registry::isExist($key) == true) { list($filters, $view_all) = Registry::get($key); } else { if (!fn_se_check_product_filter_block()) { return array(); } if (!empty($params['check_location'])) { // FIXME: this is bad style, should be refactored $valid_locations = array('index.index', 'products.search', 'categories.view', 'product_features.view'); if (!in_array($params['dispatch'], $valid_locations)) { return array(); } if ($params['dispatch'] == 'categories.view') { $params['simple_link'] = true; // this parameter means that extended filters on this page should be displayed as simple $params['filter_custom_advanced'] = true; // this parameter means that extended filtering should be stayed on the same page } else { if ($params['dispatch'] == 'product_features.view') { $params['simple_link'] = true; $params['features_hash'] = (!empty($params['features_hash']) ? $params['features_hash'] . '.' : '') . 'V' . $params['variant_id']; //$params['exclude_feature_id'] = db_get_field("SELECT feature_id FROM ?:product_features_values WHERE variant_id = ?i", $params['variant_id']); } $params['get_for_home'] = 'Y'; } } // hide filters block on the advanced search page if (!empty($params['skip_if_advanced']) && !empty($params['advanced_filter']) && $params['advanced_filter'] == 'Y') { return array(); } // End copied code. $get_custom = !empty($params['get_custom']); $received_facets = Registry::get('searchanise.received_facets'); $r_filters = $view_all = $variants_ids = $feature_variants = $fields_ids = $slider_vals = $category_facets = array(); $params['filters_category_id'] = empty($params['category_id']) ? 0 : $params['category_id']; if (is_null($received_facets) || $get_custom) { list($restrict_by, $query_by, $union) = fn_se_prepare_request_params($params); $request_params = array('items' => 'false', 'facets' => 'true', 'union' => $union, 'queryBy' => $query_by, 'restrictBy' => $restrict_by); $result = fn_searchanise_send_search_request($request_params); if (empty($result)) { return fn_get_filters_products_count($params); } $received_facets = $result['facets']; } if (empty($received_facets)) { // Nothing found return array(); } if (!empty($params['features_hash'])) { list(, , $fields_ids, $slider_vals) = fn_parse_features_hash($params['features_hash']); // // Get without // list($restrict_by, $query_by, $union) = fn_se_prepare_request_params(array_merge($params, array('features_hash' => ''))); $request_params = array('items' => 'false', 'facets' => 'true', 'union' => $union, 'queryBy' => $query_by, 'restrictBy' => $restrict_by); $result = fn_searchanise_send_search_request($request_params); if (empty($result)) { return fn_get_filters_products_count($params); } else { $category_facets = $result['facets']; } } $params_for_filters = array('get_variants' => true); if (!empty($params['item_ids'])) { $params_for_filters['filter_id'] = $params['item_ids']; } $params_for_filters = array_merge($params_for_filters, $params); list($filters, ) = fn_get_product_filters($params_for_filters); if (empty($filters)) { return array(array(), false); } $fields = fn_get_product_filter_fields(); foreach ($filters as $filter_id => $filter) { $r_facet = $c_facet = array(); foreach ($received_facets as $r) { $r_feature_id = str_replace('feature_', '', $r['attribute']); if (!empty($filter['feature_id']) && $r_feature_id == $filter['feature_id'] || !empty($filter['field_type']) && !empty($fields[$filter['field_type']]['db_field']) && $fields[$filter['field_type']]['db_field'] == $r_feature_id) { $r_facet = $r; break; } } if (empty($r_facet) && $get_custom == false) { unset($filters[$filter_id]); continue; } foreach ($category_facets as $c) { if ($c['attribute'] == $r_facet['attribute']) { $c_facet = $c; break; } } if ($filter['field_type'] == 'F') { $filters[$filter_id]['ranges'] = $filter['ranges'] = array('N' => array('range_id' => 0, 'range_name' => __('no'), 'products' => 0), 'Y' => array('range_id' => 1, 'range_name' => __('yes'), 'products' => 0)); } elseif ($filter['field_type'] == 'S' && (count($r_facet['buckets']) == 1 && $r_facet['buckets'][0]['value'] == 0) == false) { //skip if only default vendor (id=0) range passed $_companies = array(); $companies = db_get_hash_single_array("SELECT ?:companies.company_id, ?:companies.company FROM ?:companies WHERE status = 'A' ORDER BY ?:companies.company", array('company_id', 'company')); foreach ($companies as $company_id => $company) { $_companies[$company_id] = array('range_id' => $company_id, 'range_name' => $company, 'products' => 0); } $filters[$filter_id]['ranges'] = $filter['ranges'] = $_companies; } $ranges_count = 0; $tmp_ranges = array('selected' => array(), 'used' => array(), 'disabled' => array()); $filter['ranges'] = isset($filter['ranges']) ? $filter['ranges'] : array(); // // Speed up for many variants! // if (!empty($filter['feature_id']) && !in_array($filter['feature_type'], array('D', 'N', 'O'))) { $rr_ranges = array(); foreach ($r_facet['buckets'] as $r) { $rr_ranges[$r['value']] = $r; } $cc_ranges = array(); if (!empty($c_facet)) { foreach ($c_facet['buckets'] as $cc) { $cc_ranges[$cc['value']] = $cc; } } } foreach ($filter['ranges'] as $s_range_id => $s_range) { $r_range = array(); if (!empty($filter['feature_id']) && !in_array($filter['feature_type'], array('D', 'N', 'O'))) { // features with variants $r_range = isset($rr_ranges[$s_range['variant_id']]) ? $rr_ranges[$s_range['variant_id']] : array(); } elseif ($filter['field_type'] == 'F') { // Free shipping foreach ($r_facet['buckets'] as $r) { if ($r['value'] == $s_range_id) { $r_range = $r; break; } } } elseif ($filter['field_type'] == 'S') { // Vendors foreach ($r_facet['buckets'] as $r) { if ($r['value'] == $s_range_id) { unset($r['selected']); foreach ($fields_ids as $fr_id => $ff_type) { if ($ff_type == 'S' && $fr_id == $r['value']) { $r['selected'] = true; } } $r_range = $r; break; } } } else { // range foreach ($r_facet['buckets'] as $r) { if (abs($r['from'] - $s_range['from']) < 0.01 && abs($r['to'] - $s_range['to']) < 0.01) { $r_range = $r; break; } } } $range_id = isset($s_range['variant_id']) ? $s_range['variant_id'] : $s_range['range_id']; $new_range = array('feature_id' => $filter['feature_id'], 'range_id' => $range_id, 'range_name' => isset($s_range['variant']) ? $s_range['variant'] : $s_range['range_name'], 'feature_type' => $filter['feature_type'], 'filter_id' => $filter_id); if (!empty($r_range)) { $new_range['products'] = $r_range['count']; } if (empty($r_range['selected']) && fn_check_selected_filter($new_range['range_id'], !empty($new_range['feature_type']) ? $new_range['feature_type'] : '', $params, $filter['field_type'])) { $new_range['checked'] = true; } if (!empty($r_range['selected'])) { $is_select_found = true; $new_range['selected'] = true; $tmp_ranges['selected'][$range_id] = $new_range; } elseif (!empty($r_range)) { $tmp_ranges['used'][$range_id] = $new_range; } elseif (!empty($c_facet['buckets'])) { $c_range = false; if (!empty($filter['feature_id']) && !in_array($filter['feature_type'], array('D', 'N', 'O'))) { // features with variants $c_range = isset($cc_ranges[$s_range['variant_id']]) ? $cc_ranges[$s_range['variant_id']] : array(); } elseif ($filter['field_type'] == 'F') { // Free shipping foreach ($c_facet['buckets'] as $c) { if ($c['value'] == $s_range_id) { $c_range = $c; break; } } } elseif ($filter['field_type'] == 'S') { // Suppliers foreach ($c_facet['buckets'] as $c) { if ($c['value'] == $s_range_id) { $c_range = $c; break; } } } else { // range foreach ($c_facet['buckets'] as $c) { if (abs($c['from'] - $s_range['from']) < 0.01 && abs($c['to'] - $s_range['to']) < 0.01) { $c_range = $c; break; } } } if (!empty($c_range)) { $new_range['disabled'] = true; $tmp_ranges['disabled'][$range_id] = $new_range; } } $ranges_count++; } // \ by store filter ranges if (!empty($filters[$filter_id]['slider'])) { $is_select_found = true; $r_range = $r_facet['buckets'][0]; $r = array('min' => $r_range['from'], 'max' => $r_range['to']); $field_type = $filters[$filter_id]['field_type']; if ($field_type == 'P' && CART_SECONDARY_CURRENCY != CART_PRIMARY_CURRENCY) { $coef = Registry::get('currencies.' . CART_SECONDARY_CURRENCY . '.coefficient'); $r['min'] = floatval($r['min']) / floatval($coef); $r['max'] = floatval($r['max']) / floatval($coef); } $r['min'] = floor($r['min'] / $filters[$filter_id]['round_to']) * $filters[$filter_id]['round_to']; $r['max'] = ceil($r['max'] / $filters[$filter_id]['round_to']) * $filters[$filter_id]['round_to']; if ($r['max'] - $r['min'] <= $filters[$filter_id]['round_to']) { $r['max'] = $r['min'] + $filters[$filter_id]['round_to']; } if (!empty($slider_vals[$field_type])) { if ($field_type == 'P' && $slider_vals['P'][2] != CART_SECONDARY_CURRENCY) { $prev_coef = Registry::get('currencies.' . $slider_vals['P'][2] . '.coefficient'); $cur_coef = Registry::get('currencies.' . CART_SECONDARY_CURRENCY . '.coefficient'); $slider_vals['P'][0] = floor(floatval($slider_vals['P'][0]) * floatval($prev_coef) / floatval($cur_coef)); $slider_vals['P'][1] = ceil(floatval($slider_vals['P'][1]) * floatval($prev_coef) / floatval($cur_coef)); } $r['left'] = $slider_vals[$field_type][0]; $r['right'] = $slider_vals[$field_type][1]; if ($r['left'] < $r['min']) { $r['left'] = $r['min']; } if ($r['left'] > $r['max']) { $r['left'] = $r['max']; } if ($r['right'] > $r['max']) { $r['right'] = $r['max']; } if ($r['right'] < $r['min']) { $r['right'] = $r['min']; } if ($r['right'] < $r['left']) { $tmp = $r['right']; $r['right'] = $r['left']; $r['left'] = $tmp; } $r['left'] = floor($r['left'] / $filters[$filter_id]['round_to']) * $filters[$filter_id]['round_to']; $r['right'] = ceil($r['right'] / $filters[$filter_id]['round_to']) * $filters[$filter_id]['round_to']; } $filters[$filter_id]['range_values'] = $r; } else { if (empty($tmp_ranges)) { unset($filters[$filter_id]); } else { if (!empty($tmp_ranges['selected'])) { $filters[$filter_id]['selected_ranges'] = $tmp_ranges['selected']; } $filters[$filter_id]['ranges'] = $tmp_ranges['used'] + $tmp_ranges['disabled']; // Calculate number of ranges and compare with displaying count if (empty($params['get_all'])) { if (!empty($filters[$filter_id]['ranges'])) { $count = count($filters[$filter_id]['ranges']); } else { $count = 1; } if ($count > $filters[$filter_id]['display_more_count']) { $filters[$filter_id]['more_ranges'] = array_slice($filters[$filter_id]['ranges'], 0, $filters[$filter_id]['display_more_count'], true); $count = $filters[$filter_id]['display_more_count']; $filters[$filter_id]['more_cut'] = true; } else { $filters[$filter_id]['more_ranges'] = $filters[$filter_id]['ranges']; } $filters[$filter_id]['ranges'] = array_slice($filters[$filter_id]['more_ranges'], 0, $filters[$filter_id]['display_count'], true); $filters[$filter_id]['more_ranges'] = array_slice($filters[$filter_id]['more_ranges'], $filters[$filter_id]['display_count'], $count, true); } if (!empty($params['simple_link']) && $filters[$filter_id]['feature_type'] == 'E') { $filters[$filter_id]['simple_link'] = true; } } } } if (empty($is_select_found) && empty($params['skip_other_variants']) && !empty($params['features_hash'])) { fn_set_notification('W', __('text_nothing_found'), __('text_nothing_found_filter_message')); if (defined('AJAX_REQUEST')) { die; } elseif (!empty($_SERVER['HTTP_REFERER'])) { fn_redirect($_SERVER['HTTP_REFERER'], true); } else { $_params = $params; $_params['skip_advanced_variants'] = true; $_params['only_selected'] = true; if (!empty($params['features_hash']) && empty($params['skip_advanced_variants'])) { list(, , , , $field_ranges_ids) = fn_parse_features_hash($params['features_hash']); } list($_f, $_view_all) = fn_get_filters_products_count($_params); foreach ($_f as $filter_id => $filter) { if (!empty($field_range_values[$filter_id])) { $_f[$filter_id]['range_values'] = $field_range_values[$filter_id]; } } return array($_f, $_view_all); } } // Adding to the cache. Registry::set($key, array($filters, $view_all)); } return array($filters, $view_all); }