Хранение товаров в каталоге Shopkeeper предоставляет ряд преимуществ, главное из которых снятие ограничения на количество товаров, а так же удобное редактирование цены в списке товаров.
Но при этом возникают и трудности с использованием стандартных дополнений. Одной из них является то, что сниппет поиска AjaxSearch ищет только в таблице ресурсов, а про таблицу каталога ничего не знает.
Поэтому чтобы искать нужные товары, можно сделать простой поиск самостоятельно.
Предполагается, что Shopkeeper у вас уже установлен и настроен, не хватает только поиска.
Для создания поиска нам потребуется создать страницу вывода результатов поиска:
[!include? &placeholder=`total`!] найдено по запросу «<b>[[convertform? &pozition=`top`]]</b>». <br /> [[catalogView? &parents=`[[include? &file=`assets/snippets/catalogView/elements/getChildParents.php` &parent=`2`]]` &dataType=`products` &tpl=`catalogRow_chunk` &descTpl=`catalogDesc_chunk` &paginate=`1` &display=`20` &where=`[[convertform? &pozition=`where`]]` ]] <br class="clear none" /> [!include? &placeholder=`pages`!]
Вызов catalogView – используется точно такой же, как и для вывода списка товаров, за исключением параметра &where=`[[convertform? &pozition=`where`]]`
На всякий случай поясню параметры, которые использованы у меня:
&parents - ID категории товаров (документ MODx). Можно несколько через запятую.
[[include? &file=`assets/snippets/catalogView/elements/getChildParents.php` &parent=`2`]]
Выводит список ID дочерних документов по родителю. Рекомендуется вызывать только кэшированным.
То есть у нас есть корневая папка с id=2, с помощью сниппета include поучаем список id дочерних ресурсов через запятую, как раз что нам нужно для параметра &parents.
&dataType - тип выводимых данных (documents|products). documents - документы MODx, products - товары из каталога Shopkeeper. По умолчанию - products.
&tpl - имя чанка для товаров. Можно использовать "@FILE:", "@CODE:". По умолчанию - @FILE:assets/snippets/catalogView/chunks/catalogRow_chunk.tpl.
&descTpl - имя чанка с шаблоном страницы подробной информации о товаре. По умолчанию - @FILE:assets/snippets/catalogView/chunks/catalogDesc_chunk.tpl.
&paginate - использовать постраничную разбивку (1|0).
&display - число товаров на странице. По умолчанию - 0 (не ограничено).
&where - SQL условие для выборки. Пример: &where=`(tvc.tmplvarid @eq '1' AND tvc.value @eq '300')` - ищет все товары со значением '300' TV с ID 1. "@eq" - это "=". sc. - поля товара (документа), tvc. - TV-параметры.
Так же не забываем убрать ненужные галочки во вкладке «Настройка страницы».
Обязательно уберите галочку «Кешируемый»
Дальше нам необходимо разместить на сайте форму поиска
<div id="search"> <form action="[~331~]" method="get"> <input id="search_input" type="text" size="20" name="searchc" onfocus="if (this.value=='Поиск') this.value='';" onblur="if (this.value==''){this.value='Поиск'}" value='Поиск' /> <input id="search_submit" type="submit" name="bt" value='' onfocus="this.blur()"/> </form> </div>
где action="[~331~]" это ссылка на страницу результатов поиска (331 нужно поменять на id своей станицы результатов поиска).
Форма будет передавать методом GET искомую фразу.
Для обработки переданной фразы и формирования значения параметра &where нам понадобиться сниппет convertform
Название сниппета: convertform
Описание: обработка искомой фразы
Код сниппета (php):
<?php $pozition = isset($pozition) ? $pozition: ''; if ((isset($_GET['searchc'])) and ($pozition=='where')) { $a = $_GET['searchc']; // проверка вводимых данных $a= $modx->db->escape($a); $a = substr($a, 0, 15); $a = str_replace(";", "", $a); $a = str_replace("'", "", $a); $a = str_replace('"', "", $a); $a = str_replace("=", "", $a); $a = str_replace("-", "", $a); $a = str_replace("″", "", $a); $a = quotemeta ($a); $a = trim($a); $a= mysql_real_escape_string($a); return "(sc.pagetitle like '%$a%' or (tvc.tmplvarid @eq '4' AND tvc.value like '%$a%'))"; } if ((isset($_GET['searchc'])) and ($pozition=='top')) { echo $_GET['searchc']; } ?>
Параметр у сниппета только один &position – он отвечает, за то что будет выведено – если равен `top`, то выведется непосредственно фраза для поиска, а если `where`, то строка с условиями поиска для параметра &where сниппета catalogView.
Дополнительные материалы:
Описание сниппета catalogView
Shopkeeper
Отдельная благодарность создателю сниппета Shopkeeper