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


Фотография
- - - - -

Фильтр в каталоге зависимость от категории чекбокс, радио.

фильтр чекбокс радио каталог

  • Закрытая тема Тема закрыта
Сообщений в теме: 5

#1 grickov84

grickov84

Отправлено 28 October 2015 - 12:14

Задача вывести фильтр в каталоге как тут http://www.detmir.ru...gry_i_igrushki/

 

Структура:

 

Игры и игрушки

 - Для мальчиков

 - - товар 1

 - - товар 2

 - Для девочек

 - - товар 1

 - - товар 2

 - Для малышей

 - - товар 1

 - - товар 2

 - и т.д.

Товары имеют разные категории к примеру категория - "LEGO" имеет товар "Конструктор-123" он же находится в категориях - "Для мальчиков" и "Конструкторы". Также и с остальными товарами.

 

Часть задачи выполненно.

 

Осталось понять как сделать в одном фильтре:

 

1. Выбор "Пола" чекбоксами, нужно чтобы эти параметры отображались в главной категории и выводили общее количество товаров с этим параметром из всех дочерних категорий, а при переходе в дочернюю категорию выводилось то количество товаров, которое в ней, а не общее. Кривое решение нашел, указать товару главную категорию. Тогда на главной они будут отображаться, но косяк в том, что отображаются и товары чего совсем не надо. Еще хуже в моем случае отключить в фильтре зависимость от категории.

Начинаю склонятся к хаку.

 

2. Выбор категорий в фильтре чекбоксами, то есть к примеру захожу в категорию - "Игрушки для девочек" в фильтре появляются родительские категории "Куклы","Принцесса София", "Свинка Пепа", "и т. д.". Их же можно выбрать чекбоксами и вывести товары по указанным в них параметрам. Подумываю про теги, но столько параметров громоздить на 28000 товаров ( ? менеджеры с ума сходить будут...).

 

У кого голова посвежее гляньте и натолкните на мысль. Чувствую где то хожу рядом, но видать запарился.


  • 0

#2 grickov84

grickov84

Отправлено 29 October 2015 - 04:50

Реализовал категорий в фильтре чекбоксами так. Подсмотрел у  Cheren-dow

 

Открываем файл

сайт\media\zoo\applications\jbuniversal\config\mod_jbzoo_search\itemcategory.xml

И заменяем все содержимое на это

<?xml version="1.0" encoding="utf-8"?>
<!--    JBZoo App is universal Joomla CCK, application for YooTheme Zoo component    @package     jbzoo    @version     2.x Pro    @author      JBZoo App http://jbzoo.com    @copyright   Copyright (C) JBZoo.com,  All rights reserved.    @license     http://jbzoo.com/license-pro.php JBZoo Licence    @coder       Denis Smetannikov <denis@jbzoo.com>-->
<element>
    <params group="render">
        <param name="jbzoo_filter_render"
               type="list"
               label="JBZOO_ELEMENT_TEMPLATE"
               description="JBZOO_ELEMENT_TEMPLATE_DESC"
               default="_auto_"
                >
            <option value="_auto_">JBZOO_ELEMENT_TEMPLATE_AUTO</option>
            <option value="category">JBZOO_ELEMENT_TEMPLATE_CATEGORIES</option>
            <option value="category-chosen">JBZOO_ELEMENT_TEMPLATE_CATEGORIES_CHOSEN</option>
            <option value="category-hidden">JBZOO_ELEMENT_TEMPLATE_CATEGORY_HIDDEN</option>
            <option value="hidden">JBZOO_ELEMENT_TEMPLATE_HIDDEN</option>
            <option value="checkbox">CheckBox</option>
        </param>
        <param name="jbzoo_filter_default"
               type="text"
               default=""
               label="JBZOO_FILTER_DEFAULT"
               description="JBZOO_FILTER_DEFAULT_DESC"
                />
        <param name="jbzoo_category_mode"
               type="list"
               default="tree"
               label="JBZOO_FILTER_CATEGORY_MODE"
               description="JBZOO_FILTER_CATEGORY_MODE_DESC">
            <option value="none">JBZOO_FILTER_NONE</option>
            <option value="tree">JBZOO_FILTER_TREE</option>
            <option value="parent">JBZOO_FILTER_ONLY_PARENT</option>
            <option value="child">JBZOO_FILTER_ONLY_CHILD</option>
            <option value="child_off_category">Дочерние категории указанной категории</option>
        </param>
        <param name="jbzoo_filter_multiple"
               type="jbbool"
               default="0"
               label="JBZOO_FILTER_MULTIPLE"
               description="JBZOO_FILTER_MULTIPLE_DESC"/>
        <param name="jbzoo_filter_count"
               type="jbbool"
               default="1"
               label="JBZOO_FILTER_COUNT"
               description="JBZOO_FILTER_COUNT_DESC"/>
        <param name="jbzoo_filter_placeholder"
               type="text"
               default=""
               label="JBZOO_FILTER_PLACEHOLDER"
               description="JBZOO_FILTER_PLACEHOLDER_DESC"
                />
        <param name="@spacer"
               type="jbspacer"
               default="Дочерние категории указанной категории"/>
 
        <param name="jbzoo_parent_category_id"
               type="text"
               default=""
               label="Id родительской категории"
               description=""/>
    </params>
</element>

В следующем файле добавил

сайт.ru/media/zoo/applications/jbuniversal/framework/render/filter/element.category.php

<?php
/**
 * JBZoo App is universal Joomla CCK, application for YooTheme Zoo component
 *
 * @package     jbzoo
 * @version     2.x Pro
 * @author      JBZoo App http://jbzoo.com
 * @copyright   Copyright (C) JBZoo.com,  All rights reserved.
 * @license     http://jbzoo.com/license-pro.php JBZoo Licence
 * @coder       Denis Smetannikov <denis@jbzoo.com>
 */

// no direct access
defined('_JEXEC') or die('Restricted access');


/**
 * Class JBFilterElementCategory
 */
class JBFilterElementCategory extends JBFilterElement
{
    /**
     * Render HTML
     * @return string
     */
    function html()
    {
	$this->_isMultiple = true;
        $values = $this->_getValues();

        return $this->app->jbhtml->select(
            $this->_createOptionsList($values),
            $this->_getName(),
            $this->_attrs,
            $this->_value,
            $this->_getId()
        );
	return $this->app->jbhtml->checkbox(
            $this->_createOptionsList($values),
            $this->_getName(''),
            $this->_attrs,
            $this->_value,
            $this->_getId()
        );
    }

    /**
     * Get categories list
     * @return array
     */
    private function _getCategoriesList()
    {
        $applicationId = (int)$this->_params->get('item_application_id', 0);
        $application   = $this->app->table->application->get($applicationId);
        $modeParam     = $this->_params->get('jbzoo_category_mode', 'tree');

        $allCategories = array();
        if ($application) {
            $allCategories = $application->getCategories(true);
        }

        $result = array();

        if (empty($allCategories)) {
            return $result;
        }

        if ($modeParam == 'parent') {
            // only parents
            foreach ($allCategories as $category) {
                if (!$category->parent) {
                    $result[] = $category;
                }
            }

        } elseif ($modeParam == 'child') {
            // only childs
            foreach ($allCategories as $category) {
                if ($category->parent) {
                    $result[] = $category;
                }
            }

        } elseif ($modeParam == 'tree') {
            // tree view
            $result = $this->app->tree->buildList(0, $this->app->tree->build($allCategories, 'Category'));

        } else {
            $result = $allCategories;
        }

        return $result;
    }

    /**
     * Get categories list values
     * @param null $type
     * @return array
     */
    protected function _getValues($type = null)
    {
        $catList   = $this->_getCategoriesList();
        $catValues = $this->_getDbValues();

        $categoriesList = array();
        foreach ($catList as $category) {

            $found = false;
            foreach ($catValues as $catValue) {

                if ($catValue['value'] == $category->name) {
                    $category->countItems = $catValue['count'];
                    $categoriesList[]     = $category;
                    $found                = true;
                    break;
                }

            }

            if (!$found) {
                $category->countItems = 0;
                $categoriesList[]     = $category;
            }
        }

        $modeParam = $this->_params->get('jbzoo_category_mode', 'tree');

        $options = array();
        foreach ($categoriesList as $category) {

            if ($modeParam == 'tree') {
                $options[] = array(
                    'value' => $category->id,
                    'text'  => '&nbsp;&nbsp;&nbsp;' . $category->treename,
                    'count' => $this->_isCountShow ? $category->countItems : null,
                );
            } else {
                $options[] = array(
                    'value' => $category->id,
                    'text'  => $category->name,
                    'count' => $this->_isCountShow ? $category->countItems : null,
                );
            }
        }

        return $options;
    }

    /**
     * @param $value
     * @return mixed
     */
    protected function _getElementValue($value)
    {
        if ($this->_isValueEmpty($value)) {
            $value = $this->app->jbrequest->getSystem('category');
        }

        return parent::_getElementValue($value);
    }

}

Получаем дополнительный шаблон с Чек-бокс.

 

checkbox.png

 

Все вроде как хорошо но фильтрует не правильно.


Сообщение отредактировал grickov84: 29 October 2015 - 21:29

  • 0

#3 grickov84

grickov84

Отправлено 29 October 2015 - 22:17

Уважаемый Денис и его команда, помогите с решением вопроса.

Понимаю что Ваши силы направлены в 3-ю версию, самому хочется быстрее посмотреть что за компонент такой, но хотелось бы заставить чудо фильтр работать как надо.

 

Проблема в следующем:

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

 

Пункт 1. Выбор "Пола" чекбоксами тоже не решен

 

http://shoptobaby.ru/kidstoys


Сообщение отредактировал grickov84: 29 October 2015 - 23:27

  • 0

#4 SmetDenis

SmetDenis

Отправлено 30 October 2015 - 08:15

Все вроде как хорошо но фильтрует не правильно.


Скорее всего дело в том что фильтр принимает для переменной _itemcategory набор ID а у вас чекбоксы отправляют название категорий. Хотел проверить, но на странице http://shoptobaby.ru/kidstoysне нашел фильтра по категориями. Видимо отключен.

Чтобы понять, почему ничего не найдено наверняка, нужно смотреть SQL запросы и базу данных.
Возможно дело во множественных полях или диапазонах. По всех материалах поля заполнены, в частности, которые используются для диапазонов?
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.


#5 grickov84

grickov84

Отправлено 30 October 2015 - 15:26

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

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

Позже скину доступы в лс
  • 0

#6 SmetDenis

SmetDenis

Отправлено 02 November 2015 - 10:51

Спасибо. Посмотрел ваш сайт и как он работает.

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

В вашем случае можно сделать исключение тут
/media/zoo/applications/jbuniversal/framework/render/filter/element.php
            $categoryId = $this->app->jbrequest->getSystem('category');            
            if ($categoryId > 0 && $categoryId != 14) { // любая категория кроме 14-й
                $elements['_itemcategory'] = $categoryId;
            }
llh4_200x0.png

Можно сделать более сложные условие используя другие переменные, например $this->_identifier
  • 0
JBZoo v4.0 и новый чудный мир Open Source GPL
Отключайте проверку лицензий как можно скорее!



— Есть два типа людей: Кто еще не делает бекапы и кто уже делает бекапы.






Темы с аналогичным тегами фильтр, чекбокс, радио, каталог

Click to return to top of page in style!