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


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

Через фильтр выбрать подкатегорию


Лучший Ответ Cheren-dow , 13 March 2015 - 11:31

Antonio, попробуйте сделать следующее. Делал на поленке, возможно подойдет это решение.

Откройте файл:

сайт\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>
        </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>

Далее откройте файл:

сайт\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()
    {
        $values = $this->_getValues();

        return $this->app->jbhtml->select(
            $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'));

        } elseif ($modeParam == 'child_off_category') {
            $parentCategoryId = (int)$this->_params->get('jbzoo_parent_category_id', 0);
            $parentCategory   = $this->app->table->category->get($parentCategoryId);

            if ($parentCategory) {

                $children = $parentCategory->getChildren();

                if ($children) {
                    foreach ($children as $child) {
                        $result[] = $child;
                    }
                }

            }

        } 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);
    }

}

Теперь в настройках фильтра появилось 2 доп. параметра.

9jlh_200x0.png

В настройках выбираете новый шаблон и указываете id родительской категории. В фильтре должны отображаться только дочерние категории указанной категории.

Перейти к сообщению


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

#1 Antonio

Antonio

Отправлено 13 March 2015 - 10:41

Добрый день.

 

Подскажите пожалуйста, как решить следующую задачу:

- есть 1 каталог, в котором есть разные категории с подкатегориями. Как с помочью фильтра вывести возможность выбора только подкатегории одной категории (чтоб лишние категории\подкатегории не отображались в фильтре)?

 

На рисунке подробно все показано.

 

Спасибо.

Прикрепленные изображения

  • 1.JPG

Сообщение отредактировал Antonio: 13 March 2015 - 10:41

  • 0

#2 Cheren-dow

Cheren-dow

Отправлено 13 March 2015 - 11:31   Лучший Ответ

Antonio, попробуйте сделать следующее. Делал на поленке, возможно подойдет это решение.

Откройте файл:

сайт\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>
        </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>

Далее откройте файл:

сайт\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()
    {
        $values = $this->_getValues();

        return $this->app->jbhtml->select(
            $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'));

        } elseif ($modeParam == 'child_off_category') {
            $parentCategoryId = (int)$this->_params->get('jbzoo_parent_category_id', 0);
            $parentCategory   = $this->app->table->category->get($parentCategoryId);

            if ($parentCategory) {

                $children = $parentCategory->getChildren();

                if ($children) {
                    foreach ($children as $child) {
                        $result[] = $child;
                    }
                }

            }

        } 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);
    }

}

Теперь в настройках фильтра появилось 2 доп. параметра.

9jlh_200x0.png

В настройках выбираете новый шаблон и указываете id родительской категории. В фильтре должны отображаться только дочерние категории указанной категории.


  • 1
Изображение
 

#3 Antonio

Antonio

Отправлено 13 March 2015 - 12:03

Зачетное у Вас коленко) Работает) Спасибо!

Скажите, а есть у Вас возможность в v220 внести эти изменения, чтоб обновление с 2.1.5 прошло нормально (после выхода 220ая)? Ну и добавить зависимость от языка :) Мне и так норм, хоть интерфейс и англ, но все ведь должно быть тип топ) Да и фича нужная, другим пригодится.


Сообщение отредактировал Antonio: 13 March 2015 - 12:07

  • 0

#4 Cheren-dow

Cheren-dow

Отправлено 13 March 2015 - 12:29

Antonio, не помешал бы такой шаблон в коробке, напишу Денису - возможно добавит.


  • 3
Изображение
 




Click to return to top of page in style!