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


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

Интересует 2 вопроса.


Лучший Ответ Kess , 11 December 2013 - 22:14

1.  Я иногда использую такое:

if (JRequest::getVar('category_id') || JRequest::getVar('item_id')) {
    $zoo = App::getInstance('zoo');
    $catid = JRequest::getInt('category_id');
    $itemid = JRequest::getInt('item_id');    
    if($itemid !== 0) {
        $item = $zoo->table->item->get($itemid);
        $catid = $item->getPrimaryCategoryId();
    }
    $catobj=$zoo->table->category->get($catid);
    $catalias = $catobj->alias;
}

Этот код нужно вставить в index.php шаблона джумлы. В переменной $catalias будет алиас текущей категории или родительской категории, если мы находимся в товаре. Дальше нужно добавить новый вывод модуля в тот же index.php, как-то так:

<jdoc:include type="modules" name="<?php echo $catalias; ?>" style="html5" />

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

 

yav_200x0.png

 

Для обычных модулей на этом все закончится, с фильтром немного сложнее. При нажатии на поиск мы потеряем привязку к категории или к товару, так что нужно немного изменить модуль поиска, чтобы этого не происходило. Файл modules/mod_jbzoo_search/tmpl/default.php (а лучше использовать оверрайд шаблона, чтобы изменения не пропали после обновления JBZoo). Внизу есть несколько скрытых инпутов, нужно добавить туда еще два:

<input type="hidden" name="category_id" value="<?php echo JRequest::getInt('category_id'); ?>"/>

<input type="hidden" name="item_id" value="<?php echo JRequest::getInt('item_id'); ?>"/>

96s_200x0.png

 

С помощью этого мы притащим на страницу с результатами поиска id категории или товара, так что модуль не пропадет.

 

 

Вот и все, вроде бы ничего не забыл, попробуйте.

 

 

2. Такого не делал, пока есть только идея для варианта на основе CSS. С помощью той же $catalias из предыдущего примера можно добавить класс на body или на другой внешний контейнер:

<body class="<?php echo $catalias; ?>">

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

 

Попробую более наглядно объяснить, вот упрощенный пример вывода модуля поиска:

<div class="filter">
    <div class="video">
        поле фильтра
        поле фильтра
        поле фильтра
    </div>

    <div class="music">
        поле фильтра
        поле фильтра
        поле фильтра
    </div>

    <div class="painting">
        поле фильтра
        поле фильтра
    </div>
</div>

Вот пример css для скрытия/показа нужных полей:

.filter > div {
    display: none;
}

body.video .filter > div.video {
    display: block;
}

body.video .filter > div.music {
    display: block;
}

body.video .filter > div.painting {
    display: block;
}

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

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


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

#1 gav31337

gav31337

Отправлено 11 December 2013 - 20:35

Вопрос 1:

1. Фильтр на сайте выводится модулем. Суть вопроса - можно ли как то отображать этот модуль в определенных разделах каталога созданного JBzoo? 

(по умолчанию модули могут привязываться только к пунктам меню созданными через "менеджер меню")

 

К чему это: есть несколько разделов, допустим с музыкой и с видео. В разделе с музыкой - одни параметры для фильтрации, а в разделе с видео - другие. Поэтому в разделе музыка нужно выводить 1 фильтр а в разделе музыка другой.

 

 

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

 

 

Заранее спасибо.

 


  • 0

#2 Kess

Kess

Отправлено 11 December 2013 - 22:14   Лучший Ответ

1.  Я иногда использую такое:

if (JRequest::getVar('category_id') || JRequest::getVar('item_id')) {
    $zoo = App::getInstance('zoo');
    $catid = JRequest::getInt('category_id');
    $itemid = JRequest::getInt('item_id');    
    if($itemid !== 0) {
        $item = $zoo->table->item->get($itemid);
        $catid = $item->getPrimaryCategoryId();
    }
    $catobj=$zoo->table->category->get($catid);
    $catalias = $catobj->alias;
}

Этот код нужно вставить в index.php шаблона джумлы. В переменной $catalias будет алиас текущей категории или родительской категории, если мы находимся в товаре. Дальше нужно добавить новый вывод модуля в тот же index.php, как-то так:

<jdoc:include type="modules" name="<?php echo $catalias; ?>" style="html5" />

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

 

yav_200x0.png

 

Для обычных модулей на этом все закончится, с фильтром немного сложнее. При нажатии на поиск мы потеряем привязку к категории или к товару, так что нужно немного изменить модуль поиска, чтобы этого не происходило. Файл modules/mod_jbzoo_search/tmpl/default.php (а лучше использовать оверрайд шаблона, чтобы изменения не пропали после обновления JBZoo). Внизу есть несколько скрытых инпутов, нужно добавить туда еще два:

<input type="hidden" name="category_id" value="<?php echo JRequest::getInt('category_id'); ?>"/>

<input type="hidden" name="item_id" value="<?php echo JRequest::getInt('item_id'); ?>"/>

96s_200x0.png

 

С помощью этого мы притащим на страницу с результатами поиска id категории или товара, так что модуль не пропадет.

 

 

Вот и все, вроде бы ничего не забыл, попробуйте.

 

 

2. Такого не делал, пока есть только идея для варианта на основе CSS. С помощью той же $catalias из предыдущего примера можно добавить класс на body или на другой внешний контейнер:

<body class="<?php echo $catalias; ?>">

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

 

Попробую более наглядно объяснить, вот упрощенный пример вывода модуля поиска:

<div class="filter">
    <div class="video">
        поле фильтра
        поле фильтра
        поле фильтра
    </div>

    <div class="music">
        поле фильтра
        поле фильтра
        поле фильтра
    </div>

    <div class="painting">
        поле фильтра
        поле фильтра
    </div>
</div>

Вот пример css для скрытия/показа нужных полей:

.filter > div {
    display: none;
}

body.video .filter > div.video {
    display: block;
}

body.video .filter > div.music {
    display: block;
}

body.video .filter > div.painting {
    display: block;
}

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


  • 1

#3 gav31337

gav31337

Отправлено 11 December 2013 - 22:35

Большое спасибо за ответ.

Пока шел сюда - додумался еще до одного "бага". 

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

Если я буду делать поиск только по цене - то в выдаче я ведь получу и результаты из категории аудио. А нужно чтоб выдача была только из содержимого категории видео.


  • 0

#4 gav31337

gav31337

Отправлено 11 December 2013 - 22:41

Вырадил такой вариант еще: 

первый пункт фильтра (одного большого со всеми полями) - определяет в какой категории я хочу искать (выпадающий список: видео, музыка ...)

и выбрав один из пунктов - остаются уже которые нужны (остальные скрываются) 

ну а в админке при добавлении естественно будет присваиваться одно из значений. 

Таким образом отсечем в выдаче все ненужное. 

 

наверное это оптимальный вариант был бы. 


  • 0




Click to return to top of page in style!