Last update: 06.04.2014
Основные свойства модуля:
- модуль заменяет штатный фильтр товаров, позволяя фильтровать не по одной характеристике из выпадающего списка,
а по любому набору характеристик. Также этот фильтр работает не только в категориях, а везде.
- убрана необходимость в каждой категории задавать набор характеристик для фильтра, теперь этот набор строится
автоматически на лету. Характеристики и min/max-цены берутся по всем товарам выбранной категории, включая вложенные
любого уровня и дополнительные категории.
Заданные в "Редактировать категорию->Расширенный поиск->Выбрать параметры" галочки и точечки ни на что не влияют.
- добавлена возможность каждой характеристике задать ее тип при показе в фильтре (произвольная строка, набор чекбоксов, движки, выпадающий список с чекбоксами),
- добавлена возможность каждой характеристике задать ее показ/непоказ в фильтрах (см.ниже).
- фильтров теперь три. Первый (основной) и два дополнительных. Они совершенно равноправны, но в реальности второй и третий
нужны как дополнительные фильтры для каких-либо отдельных характеристик. Например, "Фильтр по производителю".
Для каждого фильтра показ/непоказ характеристики задается отдельно.
Установка:
1. переписываем файлы
ui.dropdownchecklist.standalone.css -> data\[шаблон]\
ui.dropdownchecklist-1.4-min.js -> data\[шаблон]\
jquery.selectBox.js -> data\[шаблон]\ (нужен только для filter3.tpl.html)
select-button.png -> data\[шаблон]\ (нужен только для filter3.tpl.html)
jquery.tinyTips.js -> data\[шаблон]\
tinyTips.css -> data\[шаблон]\
q.png -> data\[шаблон]\
filter1.tpl.html -> core\tpl\user\[шаблон]\blocks\
filter2.tpl.html -> core\tpl\user\[шаблон]\blocks\
filter3.tpl.html -> core\tpl\user\[шаблон]\blocks\
advanced_search_in_category_ef.php -> core\includes\
addon.php -> core\includes\admin
Файл addon.php нужен ОДИН РАЗ для создания в таблицах новых полей.
После первого же захода в админку его можно удалить, если он не удалился сам.
2. В head.tpl.html вписываем линки на jquery-ui и css от него. Ну и на сам jquery, если он еще не вписан
{* BEGIN ExtraFilter *}
<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>
{* END ExtraFilter *}
3. в файле catalog_extra.php (если он не менялся, то можно просто переписать файл из архива поверх)
вместо строки
$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort" ) );
вставляем
# BEGIN ExtraFilter
#$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort" ) );
$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort", "extra_filter1", "extra_filter2", "extra_filter3", "extra_type" ) );
# END ExtraFilter
4. в файле catalog_extra.tpl.html (если он не менялся, то можно просто переписать файл из архива поверх)
4.1 перед строкой
<td align="left" class="toph3">{$smarty.const.ADMIN_VALUE_VARIANTS}</td>
вставляем
{* BEGIN ExtraFilter *}
<td align="left">Фильтр1</td>
<td align="left">Фильтр2</td>
<td align="left">Фильтр3</td>
<td align="left">Тип фильтра</td>
{* END ExtraFilter *}
4.2 перед строкой
<td align="left" valign="middle" class="toph3"><span style="float: right;">({$options[i].count_variants})</span><a href="{$smarty.const.ADMIN_FILE}?dpt=catalog&sub=extra&optionID={$options[i][0]}" class="inl">{$smarty.const.ADMIN_VALUE_VARIANTS}</a></td>
вставляем
{* BEGIN ExtraFilter *}
<td align="left"><input type="checkbox" class="round" name="extra_filter1_{$options[i].optionID}" {if $options[i].filter1}checked{/if} title="Показывать характеристику в первом фильтре"></td>
<td align="left"><input type="checkbox" class="round" name="extra_filter2_{$options[i].optionID}" {if $options[i].filter2}checked{/if} title="Показывать характеристику во втором фильтре"></td>
<td align="left"><input type="checkbox" class="round" name="extra_filter3_{$options[i].optionID}" {if $options[i].filter3}checked{/if} title="Показывать характеристику в третьем фильтре"></td>
<td align="left">
<select name="extra_type_{$options[i].optionID}" title="Показывать характеристику как чекбоксы, строку ввода, слайдер или селект">
<option value="0"{if $options[i].filter_type==0} selected{/if}>Чекбоксы</option>
<option value="1"{if $options[i].filter_type==1} selected{/if}>Строка</option>
<option value="2"{if $options[i].filter_type==2} selected{/if}>Слайдер</option>
<option value="3"{if $options[i].filter_type==3} selected{/if}>Селект</option>
</select>
</td>
{* END ExtraFilter *}
5. в файле option_functions.php
5.1 в функции optGetOptions ищем строку
$SQL = 'select ps.optionID, ps.name, ps.sort_order, COUNT(povv.variantID) as count_variants FROM '.PRODUCT_OPTIONS_TABLE.' as ps
и заменяем ее на
# BEGIN ExtraFilter
#$SQL = 'select ps.optionID, ps.name, ps.sort_order, COUNT(povv.variantID) as count_variants FROM '.PRODUCT_OPTIONS_TABLE.' as ps
$SQL = 'select ps.optionID, ps.name, ps.sort_order, COUNT(povv.variantID) as count_variants, ps.filter1, ps.filter2, ps.filter3, ps.filter_type FROM '.PRODUCT_OPTIONS_TABLE.' as ps
5.2 в функции optUpdateOptions ищем строку
"', sort_order=".(int)$val["extra_sort"]." where optionID=".(int)$key);
и заменяем ее на
# BEGIN ExtraFilter
#"', sort_order=".(int)$val["extra_sort"]." where optionID=".(int)$key);
"', sort_order=".(int)$val["extra_sort"].
", filter1=".(isset($val["extra_filter1"])?1:0).
", filter2=".(isset($val["extra_filter2"])?1:0).
", filter3=".(isset($val["extra_filter3"])?1:0).
", filter_type=".(isset($val["extra_type"])?$val["extra_type"]:0).
" where optionID=".(int)$key);
# END ExtraFilter
6. в файле product_functions.php
6.2 в функции _testExtraParametrsTemplate
6.2.1 перед строками
// get category ID
$categoryID = $template["categoryID"];
вставляем
# BEGIN ExtraFilter
if (isset($_GET["extrafilter"])){
global $efTemplate;
$variants = array();
$filter_type = array();
foreach( $efTemplate as $key => $item )
if((string)$key != "categoryID" && isset($item["optionID"]))
{
if (is_array($item['value'])) $variants[$item["optionID"]] = $item['value'];
elseif ($item['value']>0) $variants[$item["optionID"]][] = $item['value'];
if (isset($item['filter_type'])) $filter_type[$item["optionID"]] = $item['filter_type'];
}
if (!$count = count($variants)) return true;
$filter = array();
foreach( $variants as $key => $item )
{
if (isset($filter_type[$key]))
{
switch ($filter_type[$key])
{
case '0':
$filter[] = "pos.variantID IN (".implode(",",$item).")";
break;
case '1':
$filter[] = "pos.optionID=".$key." AND povv.option_value LIKE '%".$item[0]."%'";
break;
case '2':
if ($item[2] == 'on') $count--;
else $filter[] = "pos.optionID=".$key." AND FLOOR(povv.option_value)>=".$item[0]." AND CEIL(povv.option_value)<=".$item[1];
break;
case '3':
$filter[] = "pos.variantID IN (".implode(',',$item).")";
break;
}
}
}
$row=db_fetch_row(db_query("SELECT count(DISTINCT pos.optionID) AS count FROM ".PRODUCTS_OPTIONS_SET_TABLE." AS pos
LEFT JOIN ".PRODUCTS_OPTIONS_VALUES_VARIANTS_TABLE." AS povv USING (variantID)
WHERE productID=".$productID. " AND (".implode(" OR ",$filter).")"));
return $row['count'] == $count;
}else{
# END ExtraFilter
6.2.2 перед завершающей функцию фигурной скобкой } вставляем
# BEGIN ExtraFilter
}
# END ExtraFilter
Должен получиться код
if (isset($_GET["extrafilter"])){
новый код функции
}else{
старый код функции
}
7. в файле category.php в функциях _getUrlToNavigate и _getUrlToSort
7.1 добавляем (там довольно очевидно куда - в блок аналогичных строк)
# BEGIN ExtraFilter
if ( isset($_GET["extrafilter"]) )
$url .= "&extrafilter=".$_GET["extrafilter"];
# END ExtraFilter
7.2 вместо
$url .= "¶m_".$key;
$url .= "=".$val["param"];
вставляем
# BEGIN ExtraFilter
#$url .= "¶m_".$key;
#$url .= "=".$val["param"];
if (is_array($val["param"])) foreach ($val["param"] as $vkey => $variant) $url .= "¶m_".$key."[".$vkey."]=".$variant;
else $url .= "¶m_".$key."=".$val["param"];
# END ExtraFilter
8. Подключаем в админке в "Управление блоками" основной фильтр (filter1.tpl.html) и ставим нужные галочки в "Характеристики товаров".
Второй фильтр (filter2.tpl.html) и третий фильтр (filter3.tpl.html) аналогично .
9. проверяем, пишем о проблемах.
Работающий пример можно посмотреть тут.
Характеристики там сгенерированы автоматически из описаний товаров, просто для демонстрации работы фильтра.
PS. Ну и, естественно, спасибо всем, кто тем или иным образом принимал и принимает участие в доделывании этого фильтра. Matit, micehide, R.Sergey и другие, кого я мог забыть или кто еще примет участие в будущем.