$url2search_no_html = substr($url2search, 0, -5); } if (strtolower(substr($url2search, -4)) == ".htm") { $url2search_no_html = substr($url2search, 0, -4); } if (!empty($url2search_no_html)) { $clean_url_html_sql_lookup = "or (value = '" . $url2search_no_html . "' and attribute_id IN ('" . implode("','", $clean_url_html_attribute_ids) . "'))"; } } $data = cw_query_first("SELECT item_id, item_type\n FROM {$tables['attributes_values']}\n WHERE attribute_id IN ('" . implode("','", $clean_url_attrubute_ids) . "') AND \n (value = '" . $url2search . "' {$clean_url_html_sql_lookup}) AND code = '{$lang}'"); if (empty($data)) { array_unshift($clean_url_values, array_pop($clean_url_parts)); } } while (empty($data) && count($clean_url_parts)); if (cw_clean_url_check_url_is_in_history($clean_url) && empty($data)) { $redirect_url = cw_clean_url_get_url_by_history_url($clean_url); $clean_urls[$urk_key] = $redirect_url; $location = $current_location . '/' . implode('/', $clean_urls); $location .= cw_clean_url_get_additional_query($url['query'], $params_query); cw_header_location($location, true, false, 301); } $params = array('P' => array('target' => 'product', 'param' => 'product_id'), 'C' => array('target' => 'index', 'param' => 'cat'), 'M' => array('target' => 'manufacturers', 'param' => 'manufacturer_id'), 'AB' => array('target' => 'pages', 'param' => 'page_id'), 'Q' => array('target' => 'search', 'param' => 'mode')); if ($data['item_type'] == 'O') { // owner urls $static_url = cw_query_first_cell("\n SELECT value\n FROM {$tables['attributes_values']}\n WHERE item_id = '{$data['item_id']}' AND item_type = 'OS' AND value <> ''\n "); $parsed_static_url = parse_url($static_url); if (!empty($parsed_static_url['query'])) { parse_str($parsed_static_url['query'], $parsed_arr); if (is_array($parsed_arr) && !empty($parsed_arr)) { foreach ($parsed_arr as $_key => $_value) { global ${$_key};
/** * Translate seo/mixed URL to dynamic * * @param string $url - mixed url * http://domain.com/cw/CustomFacetUrl/AttributeA/AttributeB-value?page=2&sort=name * * @return string $url - dynamic url * http://domain.com/cw/index.php?target=search&mode=search&att[A][]=AV&att[B][]=value&att[C][]=CV&page=2&sort=name */ function cw_clean_url_get_dynamic_url($mixed_url) { global $tables, $app_web_dir; cw_load('attributes'); $clean_urls = $params0 = $paramsC = $paramsF = $paramsS = $params1 = array(); $url = parse_url($mixed_url); parse_str($url['query'], $params0); $clean_url = $url['path']; if (strlen($app_web_dir) && strpos($url['path'], $app_web_dir) === 0) { $clean_url = substr($url['path'], strlen($app_web_dir)); } $clean_url = trim($clean_url, '/'); if (!empty($clean_url)) { $clean_urls = explode('/', $clean_url); } // Translate history URLs to actual if (count($clean_urls)) { foreach ($clean_urls as $k => $u) { $clean_urls[$k] = cw_clean_url_get_url_by_history_url($u); } } // Translate custom defined urls if (count($clean_urls)) { $attributeO = cw_call('cw_attributes_filter', array(array('field' => 'clean_url', 'item_type' => 'O'), true)); //$attributeOS = cw_call('cw_attributes_filter',array(array('field'=>'clean_url','item_type'=>'OS'), true)); $_clean_urls = array(); foreach ($clean_urls as $k => $u) { $static_url = cw_query_first_cell("\n SELECT item_id\n FROM {$tables['attributes_values']}\n WHERE attribute_id='{$attributeO['attribute_id']}' AND item_type='O' AND\n value = '" . mysql_real_escape_string($u) . "'\n "); if ($static_url) { $dynamic_url = cw_query_first_cell("\n SELECT value\n FROM {$tables['attributes_values']}\n WHERE attribute_id='{$attributeO['attribute_id']}' AND item_type='OS' AND\n item_id = {$static_url} "); $parsed_dynamic_url = parse_url($dynamic_url); parse_str($parsed_dynamic_url['query'], $_paramsC); $paramsC = array_merge($paramsC, $_paramsC); unset($clean_urls[$k]); $_clean_urls = array_merge($_clean_urls, explode('/', trim($parsed_dynamic_url['path'], '/'))); } } $clean_urls = array_merge($clean_urls, $_clean_urls); unset($_clean_urls); } if (count($clean_urls)) { foreach ($clean_urls as $k => $u) { if ($u == '' || $u == 'index.php') { unset($clean_urls[$k]); } } } // Translate clean urls if (count($clean_urls)) { $item_type_params = array('P' => array('target' => 'product', 'param' => 'product_id'), 'C' => array('target' => 'index', 'param' => 'cat'), 'M' => array('target' => 'manufacturers', 'param' => 'manufacturer_id'), 'AB' => array('target' => 'pages', 'param' => 'page_id')); $attributes = cw_call('cw_attributes_filter', array(array('field' => 'clean_url'))); $att_ids = array_column($attributes, 'attribute_id'); foreach ($clean_urls as $k => $u) { $data = cw_query_first("SELECT item_id, attribute_id, item_type FROM {$tables['attributes_values']}\n WHERE attribute_id IN (" . join(',', $att_ids) . ") AND\n value = '" . mysql_real_escape_string($u) . "'"); $found = true; if ($item_type_params[$data['item_type']]) { $params1['target'] = $item_type_params[$data['item_type']]['target']; $params1[$item_type_params[$data['item_type']]['param']] = $data['item_id']; } elseif ($data['item_type'] == 'Q') { $params1['target'] = 'search'; $params1['mode'] = 'search'; } elseif ($data['item_type'] == 'AV') { $params1['att'][$data['attribute_id']][] = $data['item_id']; } else { $found = false; } if ($found) { unset($clean_urls[$k]); } } } // Translate custom facet urls if (count($clean_urls)) { foreach ($clean_urls as $k => $u) { $value_ids = cw_query_first_cell("\n SELECT GROUP_CONCAT(fuo.attribute_value_ids SEPARATOR ',') as ids\n FROM {$tables['clean_urls_custom_facet_urls']} fu, {$tables['clean_urls_custom_facet_urls_options']} fuo\n WHERE fu.custom_facet_url = '{$u}' and fu.url_id=fuo.url_id\n GROUP BY fu.url_id\n "); if ($value_ids) { $att_params = cw_query("SELECT attribute_id, attribute_value_id \n FROM {$tables['attributes_default']} WHERE attribute_value_id IN ({$value_ids})"); foreach ($att_params as $att_param) { $paramsF['att'][$att_param['attribute_id']][] = $att_param['attribute_value_id']; } unset($clean_urls[$k]); } } } // Translate complex URL with attribute and value if (count($clean_urls)) { $attributePA = cw_call('cw_attributes_filter', array(array('field' => 'clean_url', 'item_type' => 'PA'), true)); foreach ($clean_urls as $k => $u) { // Detect data $clean_url_values = array(); // values for range or select attributes $clean_url_parts = explode('-', $u); if (count($clean_url_parts) == 1) { continue; } // for substring use special code if ($clean_url_parts[0] == 'substring') { unset($clean_url_parts[0]); $paramsS['att']['substring'] = implode('-', $clean_url_parts); unset($clean_urls[$k]); continue; } do { $data = cw_query_first("SELECT item_id, item_type\n FROM {$tables['attributes_values']}\n WHERE attribute_id = {$attributePA['attribute_id']} AND \n value = '" . addslashes(implode('-', $clean_url_parts)) . "'"); if (empty($data)) { array_unshift($clean_url_values, array_pop($clean_url_parts)); } } while (empty($data) && count($clean_url_parts)); if (empty($data)) { continue; } $attribute = cw_call('cw_attributes_filter', array(array('attribute_id' => $data['item_id']), true)); if (in_array($attribute['type'], array("decimal", "integer"))) { $paramsS['att'][$attribute['attribute_id']]['min'] = $clean_url_values[0]; $paramsS['att'][$attribute['attribute_id']]['max'] = $clean_url_values[1]; } elseif ($attribute['type'] == "manufacturer-selector") { $attributeM = cw_call('cw_attributes_filter', array(array('field' => 'clean_url', 'item_type' => 'M'), true)); $manufacturer_item_id = cw_query_first_cell("SELECT av.item_id\n FROM {$tables['attributes_values']} av\n WHERE av.attribute_id={$attributeM['attribute_id']} \n AND av.value = '" . addslashes(implode('-', $clean_url_values)) . "'"); $paramsS['att'][$attribute['attribute_id']][] = $manufacturer_item_id; } else { $paramsS['att'][$attribute['attribute_id']][] = implode('-', $clean_url_values); } unset($clean_urls[$k]); } } $result = array_replace_recursive($paramsC, $paramsF, $params1, $paramsS, $params0); //cw_var_dump($result,$paramsC, $paramsF, $params1, $paramsS, $params0); $url['query'] = urldecode(http_build_query($result)); $scheme = isset($url['scheme']) ? $url['scheme'] . '://' : ''; $host = isset($url['host']) ? $url['host'] : ''; $path = isset($url['path']) ? (!empty($app_web_dir) && strpos($url['path'], $app_web_dir) === 0 ? $app_web_dir : '') . '/index.php' : ''; $query = isset($url['query']) ? '?' . $url['query'] : ''; return $scheme . $host . $path . $query; }