Разберемся как сделать произвольную быструю сортировку для каталога. Примерно такую как на картинках. (Стили и вывод можно настроить самому).
Прежде всего определяемся какие сортировки будут нужны
в нашем случае:
- //Шаблон для сортировок в каталоге ======================================================================
- if ($this->app->zoo->getApplication()->id == 1) { //проверяем в каком приложении мы находимся
- // Получаем URL где находимся
- $myuri = JFactory::getURI();
- $myurl = $myuri->toString(array('path', '', 'fragment'));
- $currentorder = $_SESSION['orderkit'];
- if (!$currentorder) {$currentorder = 'price_asc';} //устанавливаем значение сортировки по умолчанию.
- //Вывод сортировки
- ?>
- <div class="orderblock">
- <span class="ordertitle">Сортировать</span>
- <span class="searchsel">
- <ul>
- <li <?php if ($currentorder == "price_asc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=price_asc" class="price asc">c начала дешевые</a></li>
- <li <?php if ($currentorder == "price_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=price_desc" class="price desc">c начала дорогие</a></li>
- <li <?php if ($currentorder == "popular_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=popular_desc" class="popular desc">c начала популярные</a></li>
- <li <?php if ($currentorder == "date_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=date_desc" class="date desc">c начала новые</a></li>
- <li <?php if ($currentorder == "date_asc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=date_asc" class="date asc">c начала старые</a></li>
- </ul>
- </span>
- </div>
- <?php
- }
- //Шаблон для сортировок в каталоге ======================================================================
У меня это 55 строчка.
сразу же после строк:
Далее правим media\zoo\applications\jbuniversal\templates\catalog\filter.php
В место где необходимо вывести сортировку вставляем этот блок:
- //Шаблон для сортировок в фильтре ======================================================================
- if ($this->app->zoo->getApplication()->id == 1) { //проверяем в каком приложении мы находимся
- // Получаем URL где находимся
- $myuri = JFactory::getURI();
- $myurl = $myuri->toString(array('path', 'query', 'fragment'));
- $currentorder = $_SESSION['orderkit'];
- if (!$currentorder) {$currentorder = 'price_asc';} //устанавливаем значение сортировки по умолчанию.
- //Вывод сортировки
- ?>
- <div class="orderblock">
- <span class="ordertitle">Сортировать</span>
- <span class="searchsel">
- <ul>
- <li <?php if ($currentorder == "price_asc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>&orderkit=price_asc" class="price asc">c начала дешевые</a></li>
- <li <?php if ($currentorder == "price_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>&orderkit=price_desc" class="price desc">c начала дорогие</a></li>
- <li <?php if ($currentorder == "popular_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>&orderkit=popular_desc" class="popular desc">c начала популярные</a></li>
- <li <?php if ($currentorder == "date_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>&orderkit=date_desc" class="date desc">c начала новые</a></li>
- <li <?php if ($currentorder == "date_asc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>&orderkit=date_asc" class="date asc">c начала старые</a></li>
- </ul>
- </span>
- </div>
- <?php
- }
- //Шаблон для сортировок в каталоге ======================================================================
У меня по условиям дизайна блок выводится над заголовком (24 строка).
заголовок:
Эти блоки отличаются друг от друга. Они не взаимозаменяемые. Основное отличие в формировании ссылок и изначального адреса ссылки.
В первом случае ?orderkit=price_asc для категории и &orderkit=price_asc для поиска.
Данные правки позволят вывести необходимые наборы сортировок в нужных нам местах с уникальными значениями ссылок.
- <div class="orderblock">
- <span class="ordertitle">Сортировать</span>
- <span class="searchsel">
- <ul>
- <li <?php if ($currentorder == "price_asc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=price_asc" class="price asc">c начала дешевые</a></li>
- <li <?php if ($currentorder == "price_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=price_desc" class="price desc">c начала дорогие</a></li>
- <li <?php if ($currentorder == "popular_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=popular_desc" class="popular desc">c начала популярные</a></li>
- <li <?php if ($currentorder == "date_desc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=date_desc" class="date desc">c начала новые</a></li>
- <li <?php if ($currentorder == "date_asc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=date_asc" class="date asc">c начала старые</a></li>
- </ul>
- </span>
- </div>
Данные блоки надо редактировать под себя перечисляя в них свои сортировки. Я делал через ul li список. Вы форматируйте как вам угодно.
Так выглядит строка:
<li <?php if ($currentorder == "price_asc") {print 'class="active"';} ?>><a href="<?php print $myurl; ?>?orderkit=price_asc" class="price asc">c начала дешевые</a></li>
Я выделил цветом ключевые переменные. В данном случае price_asc
Эта переменная будет передана в адресе при клике на соответствующий пункт сортировки c начала дешевые
Вы создаете любой набор сортировок со своими переменными. У меня:
Стили внешнего вида пока не настраиваем. Для начала запустим, чтобы все это дело заработало.
Переходим к правке файлов отвечающих за сортировку. Это:
components\com_zoo\controllers\default.php - отвечает за сортировку категории
media\zoo\applications\jbuniversal\framework\controllers\search.php - сортировка результатов поиска
components\com_zoo\controllers\default.php открываем данный файл.
ищем строку:
У меня это оказалась 228 строка. После нее вставляем следующий код:
- //Блок сортировок для каталога---------------------------------------------
- if ($this->app->zoo->getApplication()->id == 1) { //проверяем в каком приложении мы находимся
- //jbdump ($this->item_order,0); //Используйте эту строку, если у вас подключен JBdump
- //echo '<pre>';print_r ($this->item_order);echo '</pre>'; //Используйте эту строку, если у вас не подключен JBdump покажет значения выбраной сортировки
- //print 'Текущее значение сессии сортировки: '.$_SESSION['orderkit']; //Посмотреть текущее значение сессии для сортировки
- if ($_SESSION['orderkit'] == "") {$_SESSION['orderkit'] = 'price_asc';} //устанавливаем значение сортировки по умолчанию.
- //Получаем переменную для направления сортировки
- if (isset($_GET['orderkit'])) { $_SESSION['orderkit'] = $_GET['orderkit'];} //Меняем сортировку, если есть ключ в URL
- if (isset($_SESSION['orderkit'])) {
- switch ($_SESSION['orderkit']) {
- case 'price_asc':
- $this->item_order = array(
- '_jbzoo_0_field_01ab859d-e9ce-42a3-b24b-4d11422bba90___value',
- '_jbzoo_0_mode_n',
- '_jbzoo_0_order_asc'
- );
- break;
- case 'price_desc':
- $this->item_order = array(
- '_jbzoo_0_field_01ab859d-e9ce-42a3-b24b-4d11422bba90___value',
- '_jbzoo_0_mode_n',
- '_jbzoo_0_order_desc'
- );
- break;
- case 'popular_desc':
- $this->item_order = array(
- '_jbzoo_0_field_corehits',
- '_jbzoo_0_mode_n',
- '_jbzoo_0_order_desc'
- );
- break;
- case 'date_asc':
- $this->item_order = array(
- '_jbzoo_0_field_corecreated',
- '_jbzoo_0_mode_d',
- '_jbzoo_0_order_asc'
- );
- break;
- case 'date_desc':
- $this->item_order = array(
- '_jbzoo_0_field_corecreated',
- '_jbzoo_0_mode_d',
- '_jbzoo_0_order_desc'
- );
- break;
- }
- }
- }
- //jbdump ($this->item_order,0); //Используйте эту строку, если у вас подключен JBdump
- //echo '<pre>';print_r ($this->item_order);echo '</pre>'; //Используйте эту строку, если у вас не подключен JBdump покажет значения выбраной сортировки
- //Блок сортировок для каталога---------------------------------------------
Здесь видим следующие блоки:
- case 'price_asc':
- $this->item_order = array(
- '_jbzoo_0_field_01ab859d-e9ce-42a3-b24b-4d11422bba90___value',
- '_jbzoo_0_mode_n',
- '_jbzoo_0_order_asc'
- );
- break;
Именно они отвечают за обработку созданных нами переменных в шаблонах. Разберу по частям что за что отвечает.
case 'price_asc': - Определяет какую переменную будет обрабатывать данный блок. В нашем случае price_asc то есть по возрастанию цены
Следовательно нам нвдо заставить каталог сортироваться по нужному элементу цены в нужном порядке. Как его найти?
Для этого в блоке я сделал несколько строчек. Они по умолчанию закомментированы.
- //jbdump ($this->item_order,0); //Используйте эту строку, если у вас подключен JBdump
- //echo '<pre>';print_r ($this->item_order);echo '</pre>'; //Используйте эту строку, если у вас не подключен JBdump покажет значения выбраной сортировки
- //print 'Текущее значение сессии сортировки: '.$_SESSION['orderkit']; //Посмотреть текущее значение сессии для сортировки
Будем считать, что JBdump нам не доступен. Раскомментируем вторую строку убрав // перед ней
- //jbdump ($this->item_order,0); //Используйте эту строку, если у вас подключен JBdump
- echo '<pre>';print_r ($this->item_order);echo '</pre>'; //Используйте эту строку, если у вас не подключен JBdump покажет значения выбраной сортировки
- //print 'Текущее значение сессии сортировки: '.$_SESSION['orderkit']; //Посмотреть текущее значение сессии для сортировки
сохраняем все это дело
Идем в административную панель и в настройках каталога выбираем элемент соответствующий нужной нм сортировке. Если в данном случае идет речь о цене по возрастанию то ищем нужный нам элемент цены выбираем сортировку по умолчанию по нему.
Сохраняем. Обновляем страницу каталога и получаем нечто такое:
Это сортировка выбранная нами в админке. Мы видим ID элемента, тип сортировки и ее направление:
переносим значения сортировкив наш блок
Таким образом создаем все блоки обработки наших сортировок.
То есть столько блоков сколько мы создали в шаблонах столько делаем в данном месте и настраиваем их изменяя сортировки в админке для каталога для вывода необходимых нам данных для блоков.
Параллельно проверяем работоспособность соответствующих сортировок используя созданные нами ссылки в каталоге.
После настройки фильтра в категориях каталога комментируем снова строчку для вывода переменных сортировок и переходим к настройке фильтра для результатов поиска.
Открываем файл media\zoo\applications\jbuniversal\framework\controllers\search.php
находим строку:
и после нее вставляем следующий блок:
- //Блок сортировок для фильтра---------------------------------------------
- //jbdump ($order,0); //Используйте эту строку, если у вас подключен JBdump
- //echo '<pre>';print_r ($order);echo '</pre>'; //Используйте эту строку, если у вас не подключен JBdump покажет значения выбраной сортировки
- //print 'Текущее значение сессии сортировки: '.$_SESSION['orderkit']; //Посмотреть текущее значение сессии для сортировки
- if ($this->app->zoo->getApplication()->id == 1) { //проверяем в каком приложении мы находимся
- if ($_SESSION['orderkit'] == "") {$_SESSION['orderkit'] = 'price_asc';} //устанавливаем значение сортировки по умолчанию.
- //Получаем переменную для направления сортировки
- if (isset($_GET['orderkit'])) { $_SESSION['orderkit'] = $_GET['orderkit'];} //Меняем сортировку, если есть ключ в URL
- if (isset($_SESSION['orderkit'])) {
- switch ($_SESSION['orderkit']) {
- case 'price_asc':
- $order[field] = '01ab859d-e9ce-42a3-b24b-4d11422bba90___value';
- $order[mode] = 'n';
- $order[order] = 'asc';
- break;
- case 'price_desc':
- $order[field] = '01ab859d-e9ce-42a3-b24b-4d11422bba90___value';
- $order[mode] = 'n';
- $order[order] = 'desc';
- break;
- case 'popular_desc':
- $order[field] = '_jbzoo_0_field_corehits';
- $order[mode] = 'n';
- $order[order] = 'desc';
- break;
- case 'date_asc':
- $order[field] = 'corecreated';
- $order[mode] = 'd';
- $order[order] = 'asc';
- break;
- case 'date_desc':
- $order[field] = 'corecreated';
- $order[mode] = 'd';
- $order[order] = 'desc';
- break;
- }
- }
- }
Здесь блоки обработки сортировок выглядят иначе:
- case 'price_asc':
- $order[field] = '01ab859d-e9ce-42a3-b24b-4d11422bba90___value';
- $order[mode] = 'n';
- $order[order] = 'asc';
- break;
если сравнить их с уже настроенными блоками то мы увидим, что разница не так и велика.
Для поиска
:
То есть здесь просто иначе формируется массив и обрезаны префиксы для элементов.
Можно изменить уже готовые блоки.
После этого можно настроить стили для фильтра. На картинках стили представлены ниже:
- .orderblock {
- border-top: 1px solid #c7c7c7;
- float: left;
- width: 100%;
- padding: 10px 0;
- text-align:right;
- }
- .orderblock .searchsel {
- display: inline-block;
- float: right;
- margin: 0;
- padding: 5px 15px;
- border: 1px solid #c7c7c7;
- height: 35px;
- position: relative;
- overflow: hidden;
- border-radius: 20px;
- text-align:left;
- background: url("../images/drop.png") no-repeat right;
- width: 200px;
- }
- .orderblock .searchsel:hover {
- overflow: visible;
- border-radius:20px 20px 0 0;
- }
- span.searchsel ul {
- position: absolute;
- top: 33px;
- right: -1px;
- left: -1px;
- border: 1px solid #c7c7c7;
- border-top: none;
- z-index: 50;
- background: #fff;
- padding: 15px;
- border-radius: 0 0 20px 20px;
- }
- .orderblock ul li {
- list-style: none;
- padding: 5px;
- }
- .orderblock ul li:hover a {
- color: #999;
- }
- .orderblock li.active {
- position:absolute;
- top: -34px;
- }
- .orderblock li a {
- color:#000;
- }
- span.ordertitle {
- display: inline-block;
- padding: 5px 20px;
- }
- #yoo-zoo > div.category {
- margin: 0;
- padding: 0;
- }
Обратите внимание на следующие строки в коде:
Этим условием обернут весь код блоков сортировок и определяет в каком приложении выводится работает это все дело. Иначе сортировки будут выводится везде и работать например в блоге если он отдельным приложением сделан. Так же в данном месте можно поставить условие по категориям или иные условия для ограничения работы сортировок..
Сообщение отредактировал Ёшкин Кот: 12 June 2016 - 16:26