Пробуем и тестируем

Рецепты на все случаи жизни

Сортировка по цене для каталога JbZoo с несколькими типами товара

Сортировка по цене для каталога JbZoo с несколькими типами товара

Столкнулся серьезно с каталогом, в котором много типов товара, соответственно столько же элементов цены. Сразу ловим проблему, связанную с сортировкой по уже выложенному мной рецепту сортировки

А именно - при добавлении нового типа товара - топаем и правим файлы с добавлением его элемента для сортировок в категории и для сортировок в результатах поиска. Что не просто не мотивирует, а демотивирует любое расширение каталога.

Именно это привело меня к необходимости хоть как-то эту проблему решить. 

Скажу сразу - читать то, что ест ниже - не обязательно. Больно много текста, и большинство приведено только ради большей подробности. Чтобы было понятно, как это работает. Так что можно просто скачать прикрепленные файлы. Но тогда могут возникнуть вопросы. И поэтому очень рекомендую хотя бы пробежаться глазами по тексту, не вглядываясь в код особо. Иначе рискуете потеряться, почему не работает в вашем случае. 

Что у нас есть:

Файл отвечающий за сортировку в категории и лежащий тут:

components\com_zoo\controllers\default.php

Файл отвечающий за сортировку в результатах поиска и он здесь:

media\zoo\applications\jbuniversal\framework\controllers\search.php

Так же вывод самого переключателя сортировок:

media\zoo\applications\jbuniversal\templates\catalog\renderer\items\catalog.php

catalog.php - Это переопреледение вывода итемов. Его надо будет глобально для каталога или категории каталога выбрать в настройках. Я спецом сделал его отдельным шабом итемов, чтобы не затрагивать вывод по умолчанию.

catalog  - я спецом подчеркнул. Это каталог который используете вы. Я просто написал название по умолчанию. У меня другой (на принтах видно будет ниже. Имейте это ввиду)

В принципе этих трех файлов достаточно, чтобы сортировка заработала. 

Значит надо необзодимо как то сказать системе по какому элементу сортировать в какой категории в случаее с файлом:

components\com_zoo\controllers\default.php

Первым делом я подумал - как система узнает и какого типа товара брать элемент цены, если отображаем то мы категорию которая к типу не имеет вообще ни какого тонощения. В идеале в категории лежит какой то один тип товара.. который вам известен и вы выводите например как у меня какую то сантехнику.. но вот система то об этом не знает. 

Может быть это не элегантное и негибкое решение, но я решил просто ткнуть носом категорию в то, что мне нужно. Для этого был дополнен файл конфига шаблона. 

И так открывам:

media\zoo\applications\jbuniversal\templates\catalog\template.xml

Там в самом верху под <params group="category"> добавляем строчку:

<param name="order_price_cat" type="jbelementlist" default="" label="Цена для сортировки" description="Выберите элемент цены для сортировки в данной категории" types="jbpriceplain"/>

Это строка, которая введет нам преложение с выбором из всеэ типов товара всех цен, которые ест ьна сайте. Выберите тот, что будет отображаться в категории.

 price orders1

Теперь Данный элемент будет скормлен файлу:

components\com_zoo\controllers\default.php

Данный селект будет соректно обработан в нужной категории сортировкой и установлена соответствующя кука. Соответственно этим мы избавились от дальнейших правок файла. 

Посмотрим внутренности файла как и что там теперь работает:

ищем там сразу следующий блок:

//jbdump ($params->get('template.order_price_cat', none), 0);
		$order_cat = $params->get('template.order_price_cat', none);

		//Блок сортировок для каталога---------------------------------------------
		if ($this->app->zoo->getApplication()->id == 1) { //проверяем в каком приложении мы находимся

		$currentorder = (JFactory::getSession()->get('order')) ? JFactory::getSession()->get('order') : 'price_asc';
		
		$sortdirection = JFactory::getApplication()->input->getString('orderkit', '');//получаем сортироку из урл или устанавливаем значение сортировки по умолчанию.
        
        $sortdirection = ($sortdirection) ? $sortdirection : $currentorder;
		//Получаем переменную для направления сортировки 
		if ($sortdirection) {JFactory::getSession()->set('order', $sortdirection);} //Меняем сортировку, если есть ключ в URL
 
			if (JFactory::getSession()->get('order')) {
				
				switch (JFactory::getSession()->get('order')) {
					case 'price_asc':
						$this->item_order = array(
						'_jbzoo_0_field_'.$order_cat.'___value',
						'_jbzoo_0_mode_n',
						'_jbzoo_0_order_asc'
						);	
					break;
					case 'price_desc':
						$this->item_order = array(
						'_jbzoo_0_field_'.$order_cat.'___value',
						'_jbzoo_0_mode_n',
						'_jbzoo_0_order_desc'
						);		
					break;
					}
			}
			}
			
		//jbdump ($this->item_order,0); //Используйте эту строку, если у вас подключен JBdump
		//echo '<pre>';print_r ($this->item_order);echo '</pre>'; //Используйте эту строку, если у вас не подключен JBdump покажет значения выбраной сортировки						
		
		//Блок сортировок для каталога---------------------------------------------	

Видим где мы вытаскиваем из конфига элемент:

$order_cat = $params->get('template.order_price_cat', none);

 И в дальнейшем используем его для сортировки. Все просто.

Теперь по поводу сортировок в поиске. Здесь вообще малина. Модуль при происке сам отдает тип материала по которому он производит поиск. И собственно говоря что нам еще то надо? а по ходу ни чего.

Я малек поизвращался как умел и сделал нечто этакое:

//Добавление сортировок
if ($this->app->zoo->getApplication()->id == 1) { //проверяем в каком приложении мы находимся

        $typeofsearch = $this->app->zoo->getApplication()->getTypes()[$type]->config->elements;

        $priceposition = array_search('jbpriceplain', array_column($typeofsearch, 'type')); //Найдем в каком массиве содержится цена
        $priceid = array_values($typeofsearch);

        $index = 0;
        $order_cat = '';
        foreach ($typeofsearch as $key => $avalue) {
            if ($index == $priceposition) {$order_cat = $key;}
            $index++;
        }
        
        //Блок сортировок для каталога---------------------------------------------

        $currentorder = (JFactory::getSession()->get('order')) ? JFactory::getSession()->get('order') : 'price_asc';
        
        $sortdirection = JFactory::getApplication()->input->getString('orderkit', '');//полукчаем сортироку из урл или устанавливаем значение сортировки по умолчанию.
        

        if ($sortdirection) {JFactory::getSession()->set('order', $sortdirection);} //Меняем сортировку, если есть ключ в URL

        $sortdirection = ($sortdirection) ? $sortdirection : $currentorder;


        switch ($sortdirection) {
            case 'price_asc':
                $order[field] = $order_cat.'___value';
                $order[mode] = 'n';
                $order[order] = 'asc';
                break;
            case 'price_desc':
                $order[field] = $order_cat.'___value';
                $order[mode] = 'n';
                $order[order] = 'desc'; 
                break;                    
        }

}

//Добавление сортировок

 Мы отлавливаем для начала все элементы типа товара, потом находим в получившемся массиве ветку с элементов jbpriceplane и выцепляем от туда его ID. В дальнейшем скармливаем его для сортировок. 

В общем полный автомат и забываем что это такое.

Установка

Просто копируете файлы с заменами в соответствующие места и не забываем делать бекапы. Файлы шаблона - копируем в свой шаблон и правим соответственно свой template.xml. 

Обратите внимание. Все это дело работает с jbpriceplain

Так же не оставьте без внимания следующие строки:

if ($this->app->zoo->getApplication()->id == 1) { //проверяем в каком приложении мы находимся

в месте с закрывающей скобкой - это ограничивает работу скрипта по приложению с ID 1 для исключения лишних маневров. Просто имейте это ввиду и проверьте ID своего приложения.

Удачи.

  • Сортировка по цене для каталога JbZoo с несколькими типами товара
  • Сортировка по цене для каталога JbZoo с несколькими типами товара
  • Комментарии (0)

    Оставить комментарий

    Пожалуйста, войдите, чтобы комментировать.

    Статус материала

    • jomla
    • jbzoo
    • css3
    • html5
    • Java script
    • jquery
    • bootstrap
    Мы находимся в Минске
    работаем по всей РБ
    • mts+375 29 779-72-95viber
    • vel+375 44 779-72-95
    • email: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
    • skype: tirby_kat
    Индивидуальный предприниматель
    Кулак Сергей Николаевич
    УНП: 590816946
    зарегистрирован Зельвенским районным исполнительным комитетом
    от 01.06.2010
    Свяжитесь со мной