Перейти к содержимому


Делаем развесистый фильтр товаров (обкатка, написание, дополнения)


  • Вы не можете ответить в тему
Сообщений в теме: 469

#121 natashashukina

    Пользователь

  • Пользователи
  • PipPip
  • 22 сообщений
Репутация: 0
Начинающий

Отправлено 23 April 2012 - 07:55 AM

Скажите а как сделать чтобы при выборе нескольких значений если результат выводится пустой т.е. ничего не найдено выводило сообщение что товар не найден ?
  • 0

#122 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 23 April 2012 - 11:23 AM

Скажите а как сделать чтобы при выборе нескольких значений если результат выводится пустой т.е. ничего не найдено выводило сообщение что товар не найден ?

Заменить штатно выводимую фразу "нет товаров" на желаемую "товар не найден" в russian.php
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#123 natashashukina

    Пользователь

  • Пользователи
  • PipPip
  • 22 сообщений
Репутация: 0
Начинающий

Отправлено 23 April 2012 - 12:08 PM

Скажите а как сделать чтобы при выборе нескольких значений если результат выводится пустой т.е. ничего не найдено выводило сообщение что товар не найден ?

Заменить штатно выводимую фразу "нет товаров" на желаемую "товар не найден" в russian.php

У меня штатно не выводится т.к. изменен файл category.html в стандарте было если нету сортировки товара то выводится нет товара это не очень удобно, вопрос можно ли сделать как нибудь это в самом фильтре ?
  • 0

#124 gsm-group

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 101 сообщений
Репутация: 6
Начинающий

Отправлено 28 April 2012 - 07:43 PM

Поставил, протестировал. Мне нравиться.
Статистика ошибок говорит следующее

WARNING: Invalid argument supplied for foreach()
Line: 107
File: /var/www/xxxxxxxxxxx/data/www/xxxxxxxxxx.ru/core/includes/advanced_search_in_category.php
Link: /roga-i-kopita/
Date: 28.04.12 - 21:07:04
Dump:
array(2) {
  ["cat_alias"]=>
  string(17) "roga-i-kopita/"
  ["categoryID"]=>
  int(532)
}
array(0) {
}

Мой участок кода в advanced_search_in_category.php
от 89 строки до 132 строки:
while($row=db_fetch_assoc($data))
	    {
	    if ($oID <> $row['optionID'])
		    {
		    $oID = $row['optionID'];
		    $p_counter += 1;
		    $params[] = array('optionID' => $row['optionID'],
							  'name' => $row['name'],
							  'controlIsTextField' => 0,
							  'set' => "checked");
		    }
	    $count = db_fetch_assoc(db_query(
		    'SELECT COUNT(*) AS count
		    FROM '.PRODUCTS_OPTIONS_SET_TABLE.' pos
		    LEFT JOIN '.PRODUCTS_TABLE.' p USING (productID)
		    LEFT JOIN '.CATEGORIY_PRODUCT_TABLE.' cp USING (productID)
		    WHERE p.enabled=1 AND (p.categoryID IN ('.$catIDs.') OR cp.categoryID IN ('.$catIDs.')) AND variantID='.$row['variantID'].$showNullStock));
	    $set = "";
	    foreach ($getData as $key => $item)
		    if ((int)$key == (int)$row['optionID'] && $item['param'] == $row['variantID'])
			    {
			    $set = "checked";
			    $params[$p_counter]['set'] = "";
			    }
	    $params[$p_counter]['variants'][] = array('variantID' => $row['variantID'],
												  'value' => $row['option_value'],
												  'count' => $count['count'],
												  'set' => $set);
	    }[/font][/color]
[color=#282828][font=helvetica, arial, sans-serif]    if ( isset($_GET["search_name"]) ) $smarty->assign( "search_name", $_GET["search_name"]);[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]if (!isset($_GET["search_price_from"]) && !isset($_GET["search_price_to"])) {
    $data = db_query(
	    'SELECT MIN(p.price) as min, MAX(p.price) as max
	    FROM '.PRODUCTS_TABLE.' p
	    LEFT JOIN '.CATEGORIY_PRODUCT_TABLE.' cp USING (productID)
	    WHERE p.enabled=1 AND (p.categoryID IN ('.$catIDs.') OR cp.categoryID IN ('.$catIDs.'))'.$showNullStock);
    if ($row = db_fetch_assoc($data)) {
	    $max_price = $row['max'];
	    $min_price = $row['min'];}
    else {
	    $min_price = 0;
	    $max_price = 0;}[/font][/color]
[color=#282828][font=helvetica, arial, sans-serif]

Конкретно 107 строка:
foreach ($getData as $key => $item)

Что это в коде взялось?! Откукда?! При вставке сюда на форум появилось

[color=#282828] if ( isset($_GET["search_name"]) ) $smarty->assign( "search_name", $_GET["search_name"]);[/color]

[color=#282828][font=helvetica, arial, sans-serif]if (!isset($_GET["search_price_from"]) && !isset($_GET["search_price_to"])) {
  • 0

#125 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 29 April 2012 - 01:59 AM

Что это в коде взялось?! Откукда?! При вставке сюда на форум появилось

Копируете откудато где этот код выделен цветом. А тут в коде цвет не поддерживается вот и выдало
  • 0

#126 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 29 April 2012 - 03:35 PM

WARNING: Invalid argument supplied for foreach() Line: 107 File: /var/www/xxxxxxxxxxx/data/www/xxxxxxxxxx.ru/core/includes/advanced_search_in_category.php Link: /roga-i-kopita/ Date: 28.04.12 - 21:07:04 Dump: array(2) { ["cat_alias"]=> string(17) "roga-i-kopita/" ["categoryID"]=> int(532) }


1. Там в foreach() используется массив $getData = ScanGetVariableWithId( array("param"));
По крайней мере, должен использоваться :).

function ScanGetVariableWithId($varnames)
{
$data = array();
foreach ($varnames as $name)
{
foreach ($_GET as $key => $value)
{
if (strstr($key, $name."_"))
{
$key = str_replace($name."_", "", $key);
$data[$key][$name] = $value;
}
}
}
return $data;
}

Т.е. никаких элементов массива с ключем ['cat_alias'] и строчным значением эта функция отдавать не должна.

2. В шапке лежит не последняя версия. Наверное, я таки выложу (на буднях) в шапку последнюю, а то каждый раз приходится спрашивать, сделано ли исправление, которое описано где-то на четвертой и пятой странице. Правда, то исправление к этой ошибке никаким боком, насколько я понимаю. Но все равно лучше плясать от полной последней версии.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#127 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 30 April 2012 - 07:49 PM

В шапке лежит не последняя версия

Теперь последняя.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#128 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 04 May 2012 - 06:46 PM

7. (не обязательно, просто для красоты) убираем из "Редактирование категории" блок "Расширенный поиск", где задаются не нужные теперь настройки фильтра категории.
открываем файл admin.php и:

7.1 ищем строку STRING_ADVANCED_SEACH_TITLE (именно так - SEACH!), чуть выше будет строка <table class="adn">
перед ней вставляем строку <!--

7.2 ищем строку ADMIN_NO_VALUES_CH, чуть ниже будет строка с data/admin/pixel.gif
после нее вставляем строку -->

Это мы закомментировали этот блок, но можно его и удалить.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#129 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 05 May 2012 - 06:04 PM

И галку я бы добавлял не в категориях, а в "Характеристиках" т.е. там где они добавляются.


Добавляем в админке к "дополнительным характеристикам" галочку "показывать эту характеристику в фильтре"


1. добавляем поле filter_show в таблицу дополнительных характеристик.

Я это делаю в консоли MySQL командой
ALTER TABLE xxxx_product_options ADD filter_show BOOL DEFAULT 1;
(где xxxx - префикс таблиц), но можно это сделать и в phpadmin,
тут уж как кому привычнее.

2. в файле catalog_extra.tpl.html

перед строкой

<td align="left" width="100%" >{$smarty.const.ADMIN_CUSTOM_OPTION_TITLE}</td>

вставляем строку

<td align="left">Filter</td>

а перед строкой

<td align="left"><input type=text class="textp" name="extra_option_{$options[i][0]}" value="{$options[i][1]}" size="46"></td>

строку

<td align="left"><input type="checkbox" class="round" name="extra_filter_{$options[i].optionID}" {if $options[i].filter_show}checked{/if} title="Filter this characteristic"></td>


3. в файле option_functions.php:

в функции 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.filter_show FROM '.PRODUCT_OPTIONS_TABLE.' as ps


в функции optUpdateOptions

меняем строку

"', sort_order=".(int)$val["extra_sort"]." where optionID=".(int)$key);

на

"', sort_order=".(int)$val["extra_sort"].", filter_show=".(isset($val["extra_filter"])?1:0)." where optionID=".(int)$key);



4. в файле catalog_extra.php:

меняем строку

$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort" ) );

на

$updateOptions = ScanPostVariableWithId( array( "extra_option", "extra_sort", "extra_filter" ) );


5. в файле advanced_search_in_category.php

меняем строку

WHERE p.enabled=1 AND (p.categoryID IN ('.$catIDs.') OR cp.categoryID IN ('.$catIDs.'))'.$showNullStock.'

на

WHERE po.filter_show=1 AND p.enabled=1 AND (p.categoryID IN ('.$catIDs.') OR cp.categoryID IN ('.$catIDs.'))'.$showNullStock.'

Прикрепленные файлы


  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#130 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 10 May 2012 - 09:27 PM

Аминь. Я доделал еще один чек-бокс в админке - выбор, как показывать характеристику в фильтре, "чекбоксами" или "произвольной строкой".
У меня работает, ошибок пока не вылезло, но мне эта фишка не нужна, поэтому особо и не искал. В общем, ставьте, ищите, сообщайте.
В шапке уже исправленная версия.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#131 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 01 June 2012 - 01:23 PM

Хватит разводить тут флуд ни о чем.
Есть файлы
Есть инструкция

Устанавливали люди вообще далекие от программирования и все удачно работало.

Включайте мозги и хватит лениться.
7 страниц темы бла бла бла
  • 0

#132 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 June 2012 - 02:20 PM

Обновление.
Новые фишки:
1. в админке в "Характеристики товаров" добавил к характеристикам чекбоксы "Показывать в кратком описании товара" и "Показывать в полном описании товара". Если галка не стоит, то характеристика не показывается. Иногда это удобно.
2. Там же: чтобы фильтров (блоков) можно было сделать больше одного чекбокс "показывать характеристику в фильтре" заменен на три аналогичных чекбокса - по одному на фильтр. Например, можно характеристику "Производитель" вынести горизонтально (блок фильтра сверху), а остальные оставить в стандартном блоке фильтра, который обычно слева. См. пример на тестовом сайте.

админка теперь выглядит так:
Изображение
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#133 R.Sergey

    Администратор

  • Администраторы
  • 2810 сообщений
Репутация: 332
Мастер

Отправлено 19 June 2012 - 02:24 PM

абалдеть.
  • 0

#134 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 June 2012 - 02:39 PM

абалдеть.

Да просто подумалось, что городить отдельный модуль "Фильтр по производителю" как-то излишне.
Фильтр-2 ведь можно не блоком оформлять, а в шаблон вставить.
А само ядро уже есть, ничего писать не надо.
  • 1
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#135 yura

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 82 сообщений
Репутация: 0
Начинающий

Отправлено 19 June 2012 - 06:03 PM

Здорово!!!
Вот еще бы "Новинки" в фильтр добавить ;)
  • 0

#136 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 19 June 2012 - 06:11 PM

Вот еще бы "Новинки" в фильтр добавить

"Новинки" - это что, это где и куда это добавить в фильтр? :)

Подозреваю, что решение можно "свести к предыдущей задаче".
Т.е. завести характеристику "Новинка" :).
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#137 yura

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 82 сообщений
Репутация: 0
Начинающий

Отправлено 20 June 2012 - 06:38 PM

"Новинки" - добавить в фильтр радиобаттон или чек-бокс, чтобы можно было в выбранной категории выбрать новинки.

Характеристику "Новинка" как вариант, наверное, можно задать. Но как-то надо ее регулярно и автоматически обновлять по дате добавления товара.
  • 0

#138 badisoft

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 5075 сообщений
Репутация: 786
Мастер

Отправлено 20 June 2012 - 07:04 PM

"Новинки" - добавить в фильтр радиобаттон или чек-бокс, чтобы можно было в выбранной категории выбрать новинки. Характеристику "Новинка" как вариант, наверное, можно задать. Но как-то надо ее регулярно и автоматически обновлять по дате добавления товара.

В принципе, что в фильтр добавлять отдельный чекбокс "Новинки" со своей логикой обработки, что вводить характеристику "Новинки" (оставляя единую логику работы фильтра) и следить за правильностью присутствия-отсутствия - оба варианта кривые. Но в первом случае кривизну придется встраивать в довольно аккуратную и красивую логику работы фильтра, а во втором кривизна будет совершенно отдельным модулем (файлом, функцией) "обновление характеристики "Новинки"", периодически запускаемой вручную, а проще и правильнее раз в сутки cron-ом. Вариант с выносом кривизны в отдельный модуль мне нравится намного больше, да и писать при таком раскладе куда меньше. Подозреваю, что весь модуль можно уложить в одну строку SQL-запроса, которая будет добавлять/убирать у товара хар-ку "Новинка" в зависимости от даты заведения товара :). Т.е. даже PHP не понадобится, только командная строка.

PS. Кстати, вопрос знатокам! Понятно, что на своем сервере, где я царь и бог запустить что угодно хроном никакой проблемы не составляет. А как решается необходимость периодического выполнения в час Х какого-либо PHP-кода у хостеров? Я пока не сталкивался с этой стороной сайтописания.
  • 0
http://cpu.badisoft.ru (тестовый сайт), http://badisoft.ru (модули)

#139 yura

    Продвинутый пользователь

  • Assistent vsupport.club
  • PipPipPip
  • 82 сообщений
Репутация: 0
Начинающий

Отправлено 20 June 2012 - 07:30 PM

Теперь мне вариант с характеристикой "Новинка" все больше нравится :)
У этой же характеристики можно еще значения сделать "Акция", "Распродажа" и т.д.

Осталось только придумать SQL-запрос и с cron-ом разобраться :(
  • 0

#140 eugene_wb

    Продвинутый пользователь

  • Модераторы
  • 827 сообщений
Репутация: 167
Мастер

Отправлено 20 June 2012 - 09:31 PM

А как решается необходимость периодического выполнения в час Х какого-либо PHP-кода у хостеров?

1)все так же через тот же крон у хостера, у них в панели можно создавать задачи
2)fetch/wget со своего сервака по крону (грубо говоря запускаеш скрипт от себя)
3)cronjobs.ru и подобные сервисы
  • 0
Изображение Изображение Изображение