관리-도구
편집 파일: header_php.php
<?php /** * Header code file for the Search Results page * * @copyright Copyright 2003-2023 Zen Cart Development Team * @copyright Portions Copyright 2003 osCommerce * @license http://www.zen-cart.com/license/2_0.txt GNU Public License V2.0 * @version $Id: pRose on charmes 2023 Feb 03 Modified in v1.5.8a $ */ // This should be first line of the script: $zco_notifier->notify('NOTIFY_HEADER_START_ADVANCED_SEARCH_RESULTS'); if (!defined('KEYWORD_FORMAT_STRING')) define('KEYWORD_FORMAT_STRING', 'keywords'); if (!defined('ADVANCED_SEARCH_INCLUDE_METATAGS')) define('ADVANCED_SEARCH_INCLUDE_METATAGS', 'true'); require(DIR_WS_MODULES . zen_get_module_directory('require_languages.php')); // set the product filters according to selected product type $typefilter = 'default'; if (isset($_GET['typefilter'])) $typefilter = $_GET['typefilter']; require(zen_get_index_filters_directory($typefilter . '_filter.php')); $error = false; $missing_one_input = false; $_GET['keyword'] = isset($_GET['keyword']) ? trim($_GET['keyword']) : ''; // ----- // Give an observer the chance to indicate that there's another element to the search // that **is** provided, enabling the search to continue. // $search_additional_clause = false; $zco_notifier->notify('NOTIFY_ADVANCED_SEARCH_RESULTS_ADDL_CLAUSE', [], $search_additional_clause); if ($search_additional_clause === false && (empty($_GET['keyword']) || $_GET['keyword'] == HEADER_SEARCH_DEFAULT_TEXT || $_GET['keyword'] == KEYWORD_FORMAT_STRING) && (isset($_GET['dfrom']) && (empty($_GET['dfrom']) || ($_GET['dfrom'] == DOB_FORMAT_STRING))) && (isset($_GET['dto']) && (empty($_GET['dto']) || ($_GET['dto'] == DOB_FORMAT_STRING))) && (isset($_GET['pfrom']) && !is_numeric($_GET['pfrom'])) && (isset($_GET['pto']) && !is_numeric($_GET['pto'])) ) { $error = true; $missing_one_input = true; $messageStack->add_session('search', ERROR_AT_LEAST_ONE_INPUT); } else { $dfrom = ''; $dto = ''; $pfrom = ''; $pto = ''; $keywords = ''; $dfrom_array = []; $dto_array = []; if (isset($_GET['dfrom'])) { $dfrom = (($_GET['dfrom'] == DOB_FORMAT_STRING) ? '' : $_GET['dfrom']); } if (isset($_GET['dto'])) { $dto = (($_GET['dto'] == DOB_FORMAT_STRING) ? '' : $_GET['dto']); } if (isset($_GET['pfrom'])) { $pfrom = $_GET['pfrom']; } if (isset($_GET['pto'])) { $pto = $_GET['pto']; } if (isset($_GET['keyword']) && $_GET['keyword'] != HEADER_SEARCH_DEFAULT_TEXT && $_GET['keyword'] != KEYWORD_FORMAT_STRING) { $keywords = $_GET['keyword']; } $date_check_error = false; if (zen_not_null($dfrom)) { if (!zen_checkdate($dfrom, DOB_FORMAT_STRING, $dfrom_array)) { $error = true; $date_check_error = true; $messageStack->add_session('search', ERROR_INVALID_FROM_DATE); } } if (zen_not_null($dto)) { if (!zen_checkdate($dto, DOB_FORMAT_STRING, $dto_array)) { $error = true; $date_check_error = true; $messageStack->add_session('search', ERROR_INVALID_TO_DATE); } } if (($date_check_error == false) && zen_not_null($dfrom) && zen_not_null($dto)) { if (mktime(0, 0, 0, $dfrom_array[1], $dfrom_array[2], $dfrom_array[0]) > mktime(0, 0, 0, $dto_array[1], $dto_array[2], $dto_array[0])) { $error = true; $messageStack->add_session('search', ERROR_TO_DATE_LESS_THAN_FROM_DATE); } } $price_check_error = false; if (zen_not_null($pfrom)) { if (!settype($pfrom, 'float')) { $error = true; $price_check_error = true; $messageStack->add_session('search', ERROR_PRICE_FROM_MUST_BE_NUM); } } if (zen_not_null($pto)) { if (!settype($pto, 'float')) { $error = true; $price_check_error = true; $messageStack->add_session('search', ERROR_PRICE_TO_MUST_BE_NUM); } } if (($price_check_error == false) && is_float($pfrom) && is_float($pto)) { if ($pfrom > $pto) { $error = true; $messageStack->add_session('search', ERROR_PRICE_TO_LESS_THAN_PRICE_FROM); } } if (zen_not_null($keywords)) { if (!zen_parse_search_string(stripslashes($keywords), $search_keywords)) { $error = true; $messageStack->add_session('search', ERROR_INVALID_KEYWORDS); } } } if (empty($dfrom) && empty($dto) && empty($pfrom) && empty($pto) && empty($keywords) && $search_additional_clause === false) { $error = true; // redundant should be able to remove this if (!$missing_one_input) { $messageStack->add_session('search', ERROR_AT_LEAST_ONE_INPUT); } } if ($error == true) { zen_redirect(zen_href_link(FILENAME_SEARCH, zen_get_all_get_params(), 'NONSSL', true, false)); } $define_list = [ 'PRODUCT_LIST_MODEL' => PRODUCT_LIST_MODEL, 'PRODUCT_LIST_NAME' => PRODUCT_LIST_NAME, 'PRODUCT_LIST_MANUFACTURER' => PRODUCT_LIST_MANUFACTURER, 'PRODUCT_LIST_PRICE' => PRODUCT_LIST_PRICE, 'PRODUCT_LIST_QUANTITY' => PRODUCT_LIST_QUANTITY, 'PRODUCT_LIST_WEIGHT' => PRODUCT_LIST_WEIGHT, 'PRODUCT_LIST_IMAGE' => PRODUCT_LIST_IMAGE ]; asort($define_list); $column_list = []; foreach ($define_list as $column => $value) { if ($value) $column_list[] = $column; } $select_column_list = ''; foreach ($column_list as $column) { if (in_array($column, ['PRODUCT_LIST_NAME', 'PRODUCT_LIST_PRICE'])) { continue; } if (!empty($select_column_list)) { $select_column_list .= ', '; } switch ($column) { case 'PRODUCT_LIST_MODEL': $select_column_list .= 'p.products_model'; break; case 'PRODUCT_LIST_MANUFACTURER': $select_column_list .= 'm.manufacturers_name'; break; case 'PRODUCT_LIST_QUANTITY': $select_column_list .= 'p.products_quantity'; break; case 'PRODUCT_LIST_IMAGE': $select_column_list .= 'p.products_image'; break; case 'PRODUCT_LIST_WEIGHT': $select_column_list .= 'p.products_weight'; break; } } /* // always add quantity regardless of whether or not it is in the listing for add to cart buttons if (PRODUCT_LIST_QUANTITY < 1) { $select_column_list .= ', p.products_quantity '; } */ // always add quantity regardless of whether or not it is in the listing for add to cart buttons if (PRODUCT_LIST_QUANTITY < 1) { if (empty($select_column_list)) { $select_column_list .= ' p.products_quantity '; } else { $select_column_list .= ', p.products_quantity '; } } if (!empty($select_column_list)) { $select_column_list .= ', '; } // Notifier Point $zco_notifier->notify('NOTIFY_SEARCH_COLUMNLIST_STRING', $select_column_list, $select_column_list); // $select_str = "select distinct " . $select_column_list . " m.manufacturers_id, p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, IF(s.status = 1, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status = 1, s.specials_new_products_price, p.products_price) as final_price "; $select_str = "SELECT DISTINCT " . $select_column_list . " p.products_sort_order, m.manufacturers_id, p.products_id, pd.products_name, p.products_price, p.products_tax_class_id, p.products_price_sorter, p.products_qty_box_status, p.master_categories_id, p.product_is_call "; if ((DISPLAY_PRICE_WITH_TAX == 'true') && ((isset($_GET['pfrom']) && zen_not_null($_GET['pfrom'])) || (isset($_GET['pto']) && zen_not_null($_GET['pto'])))) { $select_str .= ", SUM(tr.tax_rate) AS tax_rate "; } // Notifier Point $zco_notifier->notify('NOTIFY_SEARCH_SELECT_STRING', $select_str, $select_str); // $from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c"; $from_str = "FROM (" . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_MANUFACTURERS . " m USING(manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c )"; if (ADVANCED_SEARCH_INCLUDE_METATAGS == 'true') { $from_str .= " LEFT JOIN " . TABLE_META_TAGS_PRODUCTS_DESCRIPTION . " mtpd ON (mtpd.products_id= p2c.products_id AND mtpd.language_id = :languagesID)"; $from_str = $db->bindVars($from_str, ':languagesID', $_SESSION['languages_id'], 'integer'); } if ((DISPLAY_PRICE_WITH_TAX == 'true') && ((isset($_GET['pfrom']) && zen_not_null($_GET['pfrom'])) || (isset($_GET['pto']) && zen_not_null($_GET['pto'])))) { if (empty($_SESSION['customer_country_id'])) { $_SESSION['customer_country_id'] = STORE_COUNTRY; $_SESSION['customer_zone_id'] = STORE_ZONE; } $from_str .= " LEFT JOIN " . TABLE_TAX_RATES . " tr ON p.products_tax_class_id = tr.tax_class_id LEFT JOIN " . TABLE_ZONES_TO_GEO_ZONES . " gz ON tr.tax_zone_id = gz.geo_zone_id AND (gz.zone_country_id IS null OR gz.zone_country_id = 0 OR gz.zone_country_id = :zoneCountryID) AND (gz.zone_id IS null OR gz.zone_id = 0 OR gz.zone_id = :zoneID)"; $from_str = $db->bindVars($from_str, ':zoneCountryID', $_SESSION['customer_country_id'], 'integer'); $from_str = $db->bindVars($from_str, ':zoneID', $_SESSION['customer_zone_id'], 'integer'); } // Notifier Point $zco_notifier->notify('NOTIFY_SEARCH_FROM_STRING', $from_str, $from_str); $where_str = " WHERE (p.products_status = 1 AND p.products_id = pd.products_id AND pd.language_id = :languagesID AND p.products_id = p2c.products_id AND p2c.categories_id = c.categories_id "; $where_str = $db->bindVars($where_str, ':languagesID', $_SESSION['languages_id'], 'integer'); // reset previous selection if (!isset($_GET['inc_subcat'])) { $_GET['inc_subcat'] = '0'; } if (!isset($_GET['search_in_description'])) { $_GET['search_in_description'] = '0'; } $_GET['search_in_description'] = (int)$_GET['search_in_description']; if (!empty($_GET['categories_id'])) { if ($_GET['inc_subcat'] == '1') { $subcategories_array = []; zen_get_subcategories($subcategories_array, $_GET['categories_id']); $where_str .= " AND p2c.products_id = p.products_id AND p2c.products_id = pd.products_id AND (p2c.categories_id = :categoriesID"; $where_str = $db->bindVars($where_str, ':categoriesID', $_GET['categories_id'], 'integer'); if (count($subcategories_array) > 0) { $where_str .= " OR p2c.categories_id in ("; for ($i = 0, $n = count($subcategories_array); $i < $n; $i++) { $where_str .= " :categoriesID"; if ($i + 1 < $n) $where_str .= ","; $where_str = $db->bindVars($where_str, ':categoriesID', $subcategories_array[$i], 'integer'); } $where_str .= ")"; } $where_str .= ")"; } else { $where_str .= " AND p2c.products_id = p.products_id AND p2c.products_id = pd.products_id AND pd.language_id = :languagesID AND p2c.categories_id = :categoriesID"; $where_str = $db->bindVars($where_str, ':categoriesID', $_GET['categories_id'], 'integer'); $where_str = $db->bindVars($where_str, ':languagesID', $_SESSION['languages_id'], 'integer'); } } if (!empty($_GET['manufacturers_id'])) { $where_str .= " AND m.manufacturers_id = :manufacturersID"; $where_str = $db->bindVars($where_str, ':manufacturersID', $_GET['manufacturers_id'], 'integer'); } if (isset($keywords) && zen_not_null($keywords)) { $keyword_search_fields = [ 'pd.products_name', 'p.products_model', 'm.manufacturers_name', ]; if (ADVANCED_SEARCH_INCLUDE_METATAGS == 'true') { $keyword_search_fields[] = 'mtpd.metatags_keywords'; $keyword_search_fields[] = 'mtpd.metatags_description'; } if (isset($_GET['search_in_description']) && ($_GET['search_in_description'] == '1')) { $keyword_search_fields[] = 'pd.products_description'; } $zco_notifier->notify('NOTIFY_SEARCH_MATCHING_KEYWORD_FIELDS', '', $keyword_search_fields); $where_str .= zen_build_keyword_where_clause($keyword_search_fields, trim($keywords)); } $where_str .= ')'; if (isset($_GET['alpha_filter_id']) && (int)$_GET['alpha_filter_id'] > 0) { $alpha_sort = " and (pd.products_name LIKE '" . chr((int)$_GET['alpha_filter_id']) . "%') "; $where_str .= $alpha_sort; } else { $alpha_sort = ''; $where_str .= $alpha_sort; } if (isset($_GET['dfrom']) && zen_not_null($_GET['dfrom']) && ($_GET['dfrom'] != DOB_FORMAT_STRING)) { $where_str .= " AND p.products_date_added >= :dateAdded"; $where_str = $db->bindVars($where_str, ':dateAdded', zen_date_raw($dfrom), 'date'); } if (isset($_GET['dto']) && zen_not_null($_GET['dto']) && ($_GET['dto'] != DOB_FORMAT_STRING)) { $where_str .= " and p.products_date_added <= :dateAdded"; $where_str = $db->bindVars($where_str, ':dateAdded', zen_date_raw($dto), 'date'); } $rate = $currencies->get_value($_SESSION['currency']); $pfrom = 0.0; $pto = 0.0; if ($rate) { if (!empty($_GET['pfrom'])) { $pfrom = (float)$_GET['pfrom'] / $rate; } if (!empty($_GET['pto'])) { $pto = (float)$_GET['pto'] / $rate; } } if (DISPLAY_PRICE_WITH_TAX == 'true') { if ($pfrom) { $where_str .= " AND (p.products_price_sorter * IF(gz.geo_zone_id IS null, 1, 1 + (tr.tax_rate / 100)) >= :price)"; $where_str = $db->bindVars($where_str, ':price', $pfrom, 'float'); } if ($pto) { $where_str .= " AND (p.products_price_sorter * IF(gz.geo_zone_id IS null, 1, 1 + (tr.tax_rate / 100)) <= :price)"; $where_str = $db->bindVars($where_str, ':price', $pto, 'float'); } } else { if ($pfrom) { $where_str .= " and (p.products_price_sorter >= :price)"; $where_str = $db->bindVars($where_str, ':price', $pfrom, 'float'); } if ($pto) { $where_str .= " and (p.products_price_sorter <= :price)"; $where_str = $db->bindVars($where_str, ':price', $pto, 'float'); } } $order_str = ''; // Notifier Point $zco_notifier->notify('NOTIFY_SEARCH_WHERE_STRING', $keywords, $where_str, $keyword_search_fields); if ((DISPLAY_PRICE_WITH_TAX == 'true') && ((isset($_GET['pfrom']) && zen_not_null($_GET['pfrom'])) || (isset($_GET['pto']) && zen_not_null($_GET['pto'])))) { $where_str .= " group by p.products_id, tr.tax_priority"; } // set the default sort order setting from the Admin when not defined by customer if (!isset($_GET['sort']) and PRODUCT_LISTING_DEFAULT_SORT_ORDER != '') { $_GET['sort'] = PRODUCT_LISTING_DEFAULT_SORT_ORDER; } if ((!isset($_GET['sort'])) || (!preg_match('/[1-8][ad]/', $_GET['sort'])) || (substr($_GET['sort'], 0, 1) > count($column_list))) { for ($col = 0, $n = sizeof($column_list); $col < $n; $col++) { if ($column_list[$col] == 'PRODUCT_LIST_NAME') { $_GET['sort'] = $col + 1 . 'a'; $order_str .= ' ORDER BY pd.products_name'; break; } else { // sort by products_sort_order when PRODUCT_LISTING_DEFAULT_SORT_ORDER ia left blank // for reverse, descending order use: // $listing_sql .= " order by p.products_sort_order desc, pd.products_name"; $order_str .= " order by p.products_sort_order, pd.products_name"; break; } } // if set to nothing use products_sort_order and PRODUCTS_LIST_NAME is off if (PRODUCT_LISTING_DEFAULT_SORT_ORDER == '') { $_GET['sort'] = '20a'; } } else { $sort_col = substr($_GET['sort'], 0, 1); $sort_order = substr($_GET['sort'], -1); $order_str = ' order by '; switch ($column_list[$sort_col - 1]) { case 'PRODUCT_LIST_MODEL': $order_str .= "p.products_model " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_NAME': $order_str .= "pd.products_name " . ($sort_order == 'd' ? "desc" : ""); break; case 'PRODUCT_LIST_MANUFACTURER': $order_str .= "m.manufacturers_name " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_QUANTITY': $order_str .= "p.products_quantity " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_IMAGE': $order_str .= "pd.products_name"; break; case 'PRODUCT_LIST_WEIGHT': $order_str .= "p.products_weight " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; case 'PRODUCT_LIST_PRICE': // $order_str .= "final_price " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; $order_str .= "p.products_price_sorter " . ($sort_order == 'd' ? "desc" : "") . ", pd.products_name"; break; } } //$_GET['keyword'] = zen_output_string_protected($_GET['keyword']); $zco_notifier->notify('NOTIFY_SEARCH_REAL_ORDERBY_STRING', $order_str, $order_str); $listing_sql = $select_str . $from_str . $where_str . $order_str; // Notifier Point $zco_notifier->notify('NOTIFY_SEARCH_ORDERBY_STRING', $listing_sql, $listing_sql); $breadcrumb->add(NAVBAR_TITLE_1, zen_href_link(FILENAME_SEARCH)); //$breadcrumb->add(NAVBAR_TITLE_2); $breadcrumb->add(zen_output_string_protected($keywords)); $result = new splitPageResults($listing_sql, MAX_DISPLAY_PRODUCTS_LISTING, 'p.products_id', 'page'); $zco_notifier->notify('NOTIFY_SEARCH_RESULTS', $listing_sql, $keywords, $result); if ($result->number_of_rows == 0) { $messageStack->add_session('search', TEXT_NO_PRODUCTS, 'caution'); zen_redirect(zen_href_link(FILENAME_SEARCH, zen_get_all_get_params('action'))); } // if only one product found in search results, go directly to the product page, instead of displaying a link to just one item: if ($result->number_of_rows == 1 && SKIP_SINGLE_PRODUCT_CATEGORIES == 'True') { $result = $db->Execute($listing_sql); zen_redirect(zen_href_link(zen_get_info_page($result->fields['products_id']), 'cPath=' . zen_get_product_path($result->fields['products_id']) . '&products_id=' . $result->fields['products_id'])); } // This should be last line of the script: $zco_notifier->notify('NOTIFY_HEADER_END_ADVANCED_SEARCH_RESULTS', $keywords);