Делаем развесистый фильтр товаров (обкатка, написание, дополнения)
#381
Отправлено 01 August 2013 - 03:33 PM
но все равно нету ползунка, и в фильтре 2 и 3 Нет элементов для фильтра
#382
Отправлено 01 August 2013 - 05:05 PM
#383
Отправлено 02 August 2013 - 10:15 AM
<script type="text/javascript"src="http://ajax.googleap.../jquery.min.js" ></script>
<script type="text/javascript" src="http://ajax.googleap...n.js"></script>
<script type='text/javascript' src='data/default/jquery.autocomplete.pack.js'></script>
<link rel="stylesheet" type="text/css" href="data/default/jquery.autocomplete.css" />
подключено как в шапке, чуть ниже живой поиск.
#384
Отправлено 02 August 2013 - 02:35 PM
создает "характеристики товаров", прописываем туда возможные значения. потом выбираем конкретный товар и в нем выбираем хар-ки.
по этим характеристикам и строиться поиск.
но почему-то когда занес в одну категории к нескольким товарам значения в главном фильтре, 2 и 3 ничего не изменилось. в итоге главный фильт выглядет как стандартный (название, цена от-до)и кнопки показать, резет это то что для цены и названия, потом по идеи должны быть хар-ки по которым выбирать,(но там нет ничего) и ниже кнопка показать
короче я тормоз ((( просто столько раз файлы кинул туда обратно что в итоге 1 пропустил
#385
Отправлено 02 August 2013 - 04:38 PM
#386
Отправлено 05 August 2013 - 09:59 AM
осталось только под себя допиливать, не стандартный шаблон и все доп хар-ки выводятся, а мне нужно чтоб "видимыми были только 1, а по остальным искалось но в пользовательской части не было видно.
http://s2.ipicture.r...05/sudvVBQW.jpg
В общем работает хорошо. Главное все пои инструкции сделать и не забывать чистить кэш
#387
Отправлено 05 August 2013 - 10:08 AM
эммм... вобщето 129 это не мой пост, и он не о том чтобы разместить на главной странице.Только если применить пост R.Sergey и поста #129 о том чтобы разместить на главной странице
#388
Отправлено 05 August 2013 - 10:16 AM
заметил еще нюанс что после фильтра админка стала подтормаживать. и при указании к товару характеристик это очень заметно.
#389
Отправлено 05 August 2013 - 10:18 AM
#390
Отправлено 05 August 2013 - 10:22 AM
#391
Отправлено 05 August 2013 - 10:28 AM
#392
Отправлено 05 August 2013 - 11:00 AM
все нашел данные хранятся в product_options_values
#393
Отправлено 05 August 2013 - 11:51 AM
Не верю. В фильтре очень немного изменений в админке:заметил еще нюанс что после фильтра админка стала подтормаживать. и при указании к товару характеристик это очень заметно.
1. два добавления в HTML (которые на скорость не влияют).
2. два добавления в PHP:
2.1 проверка наличия нужных полей путем SQL-запроса DESC (совершенно нересурсоемкий запрос) и их создание при отсутствиии
2.2 добавлено сохранение новых полей в функцию optUpdateOptions, что не увеличило число запросов ни на один, а лишь увеличило сам запрос (по запросу на характеристику, как и было). Врядли увеличение SET-ов в UPDATE с двух до восьми могло как-то заметно (на глаз) повлиять на быстродействие админки.
#394
Отправлено 05 August 2013 - 10:23 PM
1. Про то, что выпадающий селект выпадает "под" слайдер я и так знаю. Пока не нашел, как победить. Думаю, оно там просто, что-то с z-index, но надо разобраться. Слаб я пока в HTML/CSS. Если кто подскажет - буду благодарен.
2. Тип фильтра "слайдер" имеет смысл присваивать только характеристикам, у которых варианты выглядят как "1 дюйм", "123см", 1.05м" и подобным, для которых выражение "(int) вариант" выдаст именно значение варианта, а не хрен знает что . Т.е. характеристикам с вариантами "зеленое/белое/синее" присваивать тип "слайдер" бессмысленно.
-------------------------------
Решение находится в процессе написания. Если у Вас не получилось ожидаемое, то либо Вы где-то допустили ошибку, либо я. Второе тоже запросто. Не надо стесняться писать об этом, оно всем на пользу будет .
Основные свойства модуля:
- модуль заменяет штатный фильтр товаров, позволяя фильтровать не по одной характеристике из выпадающего списка,
а по любому набору характеристик. Также этот фильтр работает не только в категориях, а везде.
- убрана необходимость в каждой категории задавать набор характеристик для фильтра, теперь этот набор строится
автоматически на лету. Характеристики и min/max-цены берутся по всем товарам выбранной категории, включая вложенные
любого уровня и дополнительные категории.
Заданные в "Редактировать категорию->Расширенный поиск->Выбрать параметры" галочки и точечки ни на что не влияют.
- добавлена возможность каждой характеристике задать ее тип при показе в фильтре (произвольная строка, набор чекбоксов, движки, выпадающий список с чекбоксами),
- добавлена возможность каждой характеристике задать ее показ/непоказ в кратком и полном описании товара.
- добавлена возможность каждой характеристике задать ее показ/непоказ в фильтрах (см.ниже).
- фильтров теперь три. Первый (основной) и два дополнительных. Они совершенно равноправны, но в реальности второй и третий
нужны как дополнительные фильтры для каких-либо отдельных характеристик. Например, "Фильтр по производителю".
Для каждого фильтра показ/непоказ характеристики задается отдельно.
Установка:
1. переписываем файлы
ui.dropdownchecklist.standalone.css -> data\[шаблон]\
ui.dropdownchecklist-1.4-min.js -> data\[шаблон]\
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.php -> core\includes\
2. В head.tpl.html вписываем линки на jquery-ui и css от него. Ну и на сам jquery, если он еще не вписан
<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. в файле catalog_extra.php (если он не менялся, то можно просто переписать файл из архива поверх)
3.1 после строки
} else {
вставляем
# BEGIN ExtraFilter
$fields =array (
array ('Field' => 'filter1', 'Type' => 'tinyint(1)', 'Null' => 'YES', 'Key' => '', 'Default' => '1', 'Extra' => ''),
array ('Field' => 'filter2', 'Type' => 'tinyint(1)', 'Null' => 'YES', 'Key' => '', 'Default' => '0', 'Extra' => ''),
array ('Field' => 'filter3', 'Type' => 'tinyint(1)', 'Null' => 'YES', 'Key' => '', 'Default' => '0', 'Extra' => ''),
array ('Field' => 'filter_string', 'Type' => 'tinyint(1)', 'Null' => 'YES', 'Key' => '', 'Default' => '0', 'Extra' => ''),
array ('Field' => 'product_show', 'Type' => 'tinyint(1)', 'Null' => 'YES', 'Key' => '', 'Default' => '1', 'Extra' => ''),
array ('Field' => 'brief_show', 'Type' => 'tinyint(1)', 'Null' => 'YES', 'Key' => '', 'Default' => '1', 'Extra' => ''));
$data = mysql_query("desc ".PRODUCT_OPTIONS_TABLE);
while ($row[] = mysql_fetch_assoc($data));
foreach ($fields as $field)
{
$flag = true;
foreach ($row as $cur_row) if ($field['Field'] == $cur_row['Field']) {$flag=false; break;}
if ($flag) mysql_query("ALTER TABLE ".PRODUCT_OPTIONS_TABLE." ADD ".$field['Field']." ".$field['Type']." DEFAULT ".$field['Default']);
}
# END ExtraFilter
3.2 вместо строки
$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_string", "extra_brief", "extra_product" ) );
# 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>
<td align="left">Краткое</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_string_{$options[i].optionID}" title="Показывать характеристику как чекбоксы, строку ввода, слайдер или селект">
<option value="0"{if $options[i].filter_string==0} selected{/if}>Чекбоксы</option>
<option value="1"{if $options[i].filter_string==1} selected{/if}>Строка</option>
<option value="2"{if $options[i].filter_string==2} selected{/if}>Слайдер</option>
<option value="3"{if $options[i].filter_string==3} selected{/if}>Селект</option>
</select>
</td>
<td align="left"><input type="checkbox" class="round" name="extra_brief_{$options[i].optionID}" {if $options[i].brief_show}checked{/if} title="Показывать характеристику в кратком описании товара"></td>
<td align="left"><input type="checkbox" class="round" name="extra_product_{$options[i].optionID}" {if $options[i].product_show}checked{/if} title="Показывать характеристику в полном описании товара"></td>
{* END ExtraFilter *}
5. в файле function.php в функции ScanGetVariableWithId
вместо строки
$data[$key][$name] = $value;
вставляем
# BEGIN ExtraFilter
# $data[$key][$name] = $value;
if (is_array($value)) foreach ($value as $k => $v) $data[$key."_".$k][$name] = $v;
else $data[$key][$name] = $value;
# END ExtraFilter
6. в файле option_functions.php
6.1 в функции optGetOptions ищем строку
$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_string, ps.brief_show, ps.product_show FROM '.PRODUCT_OPTIONS_TABLE.' as ps
6.2 в функции optUpdateOptions ищем строку
"', 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_string=".(isset($val["extra_string"])?$val["extra_string"]:0).
", brief_show=".(isset($val["extra_brief"])?1:0).
", product_show=".(isset($val["extra_product"])?1:0).
" where optionID=".(int)$key);
7. в файле product_functions.php
7.1 в функции GetExtraParametrs
7.1.1 ищем строку
$sql = 'select povt.productID,pot.optionID,pot.name,povt.option_value,povt.option_type,povt.option_show_times, povt.variantID, povt.optionID
и заменяем ее на
$sql = 'select povt.productID,pot.optionID,pot.name,pot.brief_show,pot.product_show,povt.option_value,povt.option_type,povt.option_show_times, povt.variantID, povt.optionID
7.1.2 ищем строки
'name' => $_Row['name'],
'option_value' => $_Row['option_value']
и между ними вставляем строки
# BEGIN ExtraFilter
'brief_show' => $_Row['brief_show'],
'product_show' => $_Row['product_show'],
# END ExtraFilter
7.2 в функции _testExtraParametrsTemplate
7.2.1 перед строками
// get category ID
$categoryID = $template["categoryID"];
вставляем
if (isset($_GET["extrafilter"])){
$variants = array();
$string = array();
foreach( $template as $key => $item )
if((string)$key <> "categoryID" && isset($item["optionID"]))
{
$variants[(int)$item["optionID"]][] = $item['value'];
if (isset($item['filter_string']))
$string[(int)$item["optionID"]] = $item['filter_string'];
}
if (!$count = count($variants)) return true;
$filter = array();
foreach( $variants as $key => $item )
{
if (isset($string[$key]))
{
switch ($string[$key])
{
case '0':
$filter[] = "pos.optionID=".$key." AND pos.variantID IN (".implode(",",$item).")";
break;
case '1':
$filter[] = "pos.optionID=".$key." AND povv.option_value LIKE '%".$item[0]."%'";
break;
case '2':
if ($item[0] == '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.optionID=".$key." AND 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{
7.2.2 перед завершающей функцию фигурной скобкой } ставим еще одну фигурную скобку.
Должен получиться код
if (isset($_GET["extrafilter"])){
новый код функции
}else{
старый код функции
}
8. в файле category.php в функциях _getUrlToNavigate и _getUrlToSort
добавляем (там довольно очевидно куда - в блок аналогичных строк)
# BEGIN ExtraFilter
if ( isset($_GET["old_search_price_from"]) )
$url .= "&old_search_price_from=".$_GET["old_search_price_from"];
if ( isset($_GET["old_search_price_to"]) )
$url .= "&old_search_price_to=".$_GET["old_search_price_to"];
if ( isset($_GET["extrafilter"]) )
$url .= "&extrafilter=".$_GET["extrafilter"];
# END ExtraFilter
9. в файл /data/[шаблон]/style.css добавляем
/* ExtraFilter */
.splCont{display:none}
если хотим, чтобы фильтр изначально был свернут, либо
/* ExtraFilter */
.splCont{display:block}
если хотим, чтобы изначально фильтр был развернут
10. в файле product_brief.tpl.html
ищем текст
{section name=i loop=$product_info.product_extra}
и добавляем после него (где-то ниже строкой, где-то в той же строке)
{if $product_info.product_extra[i].brief_show eq 1}
далее перед соответствующим закрывающим {/section} добавляем {/if}
таких замен в файле семь
11. в файле product_detailed.tpl.html
ищем текст
{section name=i loop=$product_extra}
и добавляем после него (где-то ниже строкой, где-то в той же строке)
{if $product_extra[i].product_show eq 1}
далее перед соответствующим закрывающим {/section} добавляем {/if}
таких замен в файле семь
12. в russian.php меняем "неважно" на "не важно"
13. (не обязательно, просто для красоты) убираем из "Редактирование категории" блок "Расширенный поиск", где задаются не нужные теперь настройки фильтра категории.
открываем файл admin.php и:
13.1 ищем строку STRING_ADVANCED_SEACH_TITLE (именно так - SEACH!), чуть выше будет строка <table class="adn">
перед ней вставляем строку <!--
13.2 ищем строку ADMIN_NO_VALUES_CH, чуть ниже будет строка с data/admin/pixel.gif
после нее вставляем строку -->
Это мы закомментировали этот блок, но можно его и удалить.
14. Подключаем в админке в "Управление блоками" основной фильтр (filter1.tpl.html) и ставим нужные галочки в "Характеристики товаров".
Второй фильтр (filter2.tpl.html) и третий фильтр (filter3.tpl.html) аналогично .
15. проверяем, пишем о проблемах.
Работающий пример можно посмотреть тут, там же и скачать.
Характеристики там сгенерированы автоматически из описаний товаров, просто для демонстрации работы фильтра.
PS. Ну и, естественно, спасибо всем, кто тем или иным образом принимал и принимает участие в доделывании этого фильтра. Matit, micehide, R.Sergey и другие, кого я мог забыть или кто еще примет участие в будущем.
PPS. Самолично применил именно эту инструкцию и именно этот набор файлов к нулевому сайту, добавил туда один тестовый товар, добавил несколько характеристик с разным типом показа, а в каждой несколько вариантов. Ну и присвоил их товару. Все работает. Так что если у кого не работает, то либо пишем что-то более подробное, чем "у меня не работает", либо сразу идем в коммерческую часть сайта .
PPPPPPPPS. Ну и таки да. Смотрел вчера код в advanced_search_in_category.php - как-то криво с уровня текущих знаний. И не оптимально по коду, и ресурсоемко в части SQL-запроса. Но взять и переписать в лучшую сторону на сегодня не готов. Самому не нравится, но не готов. Раз мне не нравится, то ждите. Будет. Но когда, увы, не знаю. Вон, слайдеры были готовы уже месяца три-четыре назад, однако "самый хвостик" я дописал только позавчера.
Прикрепленные файлы
#395
Отправлено 12 August 2013 - 03:15 PM
например у меня 13000 товаров, торгуем всем, хар-к получается разных около 1000, при добавлении товара очень сложно найти нужные хар-ки
#396
Отправлено 12 August 2013 - 03:24 PM
Т.е. например в категории Пылесосы не будут отображаться Характеристики от Холодильников ну и т.д.
#397
Отправлено 12 August 2013 - 03:29 PM
Лошара. Чуть пол-библиотеки не переписал, чтобы z-index задать именно там, где надо. А надо было документацию до конца дочитать, а не только примеры использования. Там в параметрах можно задать желаемый z-index .1. Про то, что выпадающий селект выпадает "под" слайдер я и так знаю. Пока не нашел, как победить. Думаю, оно там просто, что-то с z-index, но надо разобраться. Слаб я пока в HTML/CSS. Если кто подскажет - буду благодарен.
#398
Отправлено 14 August 2013 - 09:58 AM
#399
Отправлено 14 August 2013 - 10:05 AM
подобного чего.чето искал на "этом" форуме и не нашел подобного.
#400
Отправлено 14 August 2013 - 10:16 AM