Спонсор: Lenivec
Краткое описание:
-----------------
- работает с обоими видами характеристик - заданных и набором вариантов, и произвольной строкой.
- минимальное/максимальное значение диапазона находится автоматически путем перебора характеристик, имеющихся у товаров текущей категории.
т.к. характеристики штатно текстовые, то в число они преобразоуются следующим образом - убираются все пробелы, запятые меняются на точки, затем полученная строка преобразуется во float.
Из "1 234 см." получится 1234, из "2345,67об/мин" получится 2345.67 и т.п.
Соответственно, задавать тип фильтра "слайдер" для чисто текстовых (буквенных) характеристик совершенно бессмысленно.
- аналогичным образом происходит и фильтрация. Если не стоит галка "не важно", то при проверке товара на соответствие
он считается прошедшим фильтр если эта его характеристика (преобразованная во float) попадает в заданный диапазон.
В случае нескольких заданных товару вариантов характеристики - если попадает хотя бы одна.
- ну и до кучи цена тоже движками с изначальным min-max исходя из цен имеющихся в категории и подкатегориях товаров.
все остальное как в обычном штатном фильтре.
Установка:
----------
1. копируем filter.tpl.html поверх штатного в /core/tpl/user/[шаблон]/blocks/
2. В head.tpl.html вписываем линки на jquery и jquery-ui, если они еще не вписаны
<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
3. в файле advanced_search_in_category.php
3.1 перед
foreach( $options as $option ){
вставляем
# BEGIN filter-slider
$addonStock = (CONF_CHECKSTOCK == 1 && CONF_SHOW_NULL_STOCK == 1)?' AND in_stock > 0 ':'';
$catIDs = catGetSubCategories($_GET["categoryID"]);
$addonCat = (string)$_GET["categoryID"];
foreach ($catIDs as $catID) $addonCat .= ','.$catID;
$data = db_query("SELECT productID FROM ".CATEGORIY_PRODUCT_TABLE." WHERE categoryID IN($addonCat)");
$addPrd = array();
while ($row = db_fetch_assoc($data)) $addPrd[] = $row['productID'];
$addon = "$addonStock AND ".(empty($addPrd)?"categoryID IN ($addonCat)":"(categoryID IN($addonCat) OR productID IN(".implode(',',$addPrd)."))");
$row = db_fetch_assoc(db_query("SELECT MIN(Price) as MinPrice, MAX(Price) as MaxPrice FROM ".PRODUCTS_TABLE." WHERE enabled=1 $addon"));
$smarty->assign( "price_min", floor($row['MinPrice']*$selected_currency_details["currency_value"]));
$smarty->assign( "price_max", ceil($row['MaxPrice']*$selected_currency_details["currency_value"]));
# END filter-slider
3.2 перед
$params[] = $item;
вставляем
# BEGIN filter-slider
elseif ( $set_arbitrarily == 2 )
{
$row = db_fetch_assoc(db_query(
"SELECT MIN(REPLACE(REPLACE(option_value,',','.'),' ','')+0.0) AS min,
MAX(REPLACE(REPLACE(option_value,',','.'),' ','')+0.0) AS max
FROM ".PRODUCT_OPTIONS_VALUES_TABLE."
JOIN ".PRODUCTS_TABLE." USING (productID)
WHERE optionID=".$option['optionID']." AND option_type=0 AND option_value>'' AND enabled=1 $addon"));
$row1 = db_fetch_assoc(db_query("
SELECT MIN(REPLACE(REPLACE(option_value,',','.'),' ','')+0.0) AS min,
MAX(REPLACE(REPLACE(option_value,',','.'),' ','')+0.0) AS max
FROM ".PRODUCTS_OPTIONS_SET_TABLE." AS pos
JOIN ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." USING (variantID)
JOIN ".PRODUCTS_TABLE." USING (productID)
WHERE pos.optionID=".$option['optionID']." AND enabled=1 $addon"));
$item["min"] = floor(min(is_null($row['min'])?$row1['min']:$row['min'],is_null($row1['min'])?$row['min']:$row1['min']));
$item["max"] = ceil(max(is_null($row['max'])?$row1['max']:$row['max'],is_null($row1['max'])?$row['max']:$row1['max']));
$item["min_set"] = isset($getData[$option["optionID"]]["param"][0])?$getData[$option["optionID"]]["param"][0]:$item["min"];
$item["max_set"] = isset($getData[$option["optionID"]]["param"][1])?$getData[$option["optionID"]]["param"][1]:$item["max"];
}
# END filter-slider
4. в файле product_functions.php в функции _testExtraParametrsTemplate
после
if ( $item['set_arbitrarily'] == 1 ){
$valueFromForm = $item["value"];
вставляем
# BEGIN filter-slider
}
elseif ( $item['set_arbitrarily'] == 2 ){
if(!isset($item['value'][2]))
{
$row = db_fetch_assoc(db_query("
SELECT COUNT(*) AS count
FROM ".PRODUCT_OPTIONS_VALUES_TABLE." AS pov
LEFT JOIN ".PRODUCTS_OPTIONS_SET_TABLE." AS pos ON (pos.optionID=pov.optionID AND pos.productID=pov.productID)
LEFT JOIN ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." AS povv ON (povv.variantID=pos.variantID)
WHERE pov.productID=$productID
AND pov.optionID=".$item['optionID']."
AND (pov.option_type=1
AND (REPLACE(REPLACE(povv.option_value,',','.'),' ','')+0.0) >=".$item['value'][0]."
AND (REPLACE(REPLACE(povv.option_value,',','.'),' ','')+0.0) <=".$item['value'][1]."
OR pov.option_type=0
AND (REPLACE(REPLACE(pov.option_value,',','.'),' ','')+0.0) >=".$item['value'][0]."
AND (REPLACE(REPLACE(pov.option_value,',','.'),' ','')+0.0) <=".$item['value'][1].")"));
if ($row['count'] == 0) return false;
else continue;
}
else continue;
# END filter-slider
5. в файле admin.php
5.1 блок (искать по "id='select_arbitrarily1")
if (count($option["variants"]) != 0)
{
?>
<tr><td></td>
<td align="center" valign="middle" class="cssel"><input type="radio" name='select_arbitrarily_<?php
echo $option["optionID"];
?>' id='select_arbitrarily1_<?php
изменяем на (комментируем две строки)
# BEGIN filter-slider
// if (count($option["variants"]) != 0)
// {
# END filter-slider
?>
<tr><td></td>
<td align="center" valign="middle" class="cssel"><input type="radio" name='select_arbitrarily_<?php
echo $option["optionID"];
?>' id='select_arbitrarily1_<?php
5.2 перед
<tr><td></td><td align="center" valign="middle" class="cssel"><input type="radio" name='select_arbitrarily_<?php
вставляем
<!-- BEGIN filter-slider -->
<tr><td></td>
<td align="center" valign="middle" class="cssel"><input type="radio" name='select_arbitrarily_<?php
echo $option["optionID"];
?>' id='select_arbitrarily3_<?php
echo $option["optionID"];
?>'
<?php
if ($option["set_arbitrarily"] == 2)
{
?>
checked
<?php
}
?>
value='2' onclick='Select_arbitrarily_Change_<?php
echo $option["optionID"];
?>()'></td><td colspan="2" align="left" valign="middle" class="toph3"><?php
echo 'Движки (слайдер)';
?></td>
</tr>
<?php
if (count($option["variants"]) != 0)
{
?>
<!-- END filter-slider -->
5.3 блок (искать по "getElementById('select_arbitrarily1")
if (count($option["variants"]) != 0)
{
?>
document.getElementById('select_arbitrarily1_<?php
изменяем на (комментируем две строки)
# BEGIN filter-slider
// if (count($option["variants"]) != 0)
// {
# END filter-slider
?>
document.getElementById('select_arbitrarily1_<?php
5.4 после
document.getElementById('select_arbitrarily1_<?php
echo $option["optionID"];
?>').disabled =!_checked;
вставляем
<!-- BEGIN filter-slider -->
document.getElementById('select_arbitrarily3_<?php
echo $option["optionID"];
?>').disabled =!_checked;
<?php
if (count($option["variants"]) != 0)
{
?>
<!-- END filter-slider -->