Новости

Як темізіровать висновок exposed filters в Drupal - Demetr

Views є дуже потужним модулем, який розширює базові можливості Drupal Views є дуже потужним модулем, який розширює базові можливості Drupal. Будь-який список нод можна вивести в будь-якому вигляді, якщо є невеликі пізнання в php.

У мене з'явилася задача темізіровать висновок exposed filters таким чином, щоб спочатку показувалися кілька полів, потім посилання «розширений пошук» - при натисканні показувати інші поля для фільтрації.

Логіка дій зрозуміла:

  • спочатку виводимо перші поля
  • посилання «розширений пошук».
  • При натисканні на посилання показуємо додаткові фільтри через JQuery

Отже, у нас є уявлення, еxposed filters винесені в блок, починаємо роботу.

Подання має назву automarket. Шаблон для виведення - views-view-table- automarket -page.tpl

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

Колонка стає дуже довгою, і більшості користувачів можуть не знадобитися додаткові налаштування фільтрації, до того ж два поля Ціна від і Ціна до можна вмістити в один рядок.

Для перекриття стандартного відображення фільтрів, в папці з нашою темою створюємо папку views, всі шаблони уявлень необхідно зберігати в ній.

Тепер створюємо файл php за наступною схемою:

views-exposed-form- automarket -page.tpl.php

Жирним я виділив ім'я потрібного уявлення. Відкриваємо цей файл і пишемо наступне:

<Label for = "& lt;? Php print $ widgets [ 'filter-field_myfield'] - & gt; id;? & Gt;" > <! -? Php print $ widgets [ 'filter-field_myfield'] ---> label; ? & Gt; </ Label> <! -? Php print $ widgets [ 'filter-field_myfield'] ---> widget; ? & Gt;

<Label for = "& lt;? Php print $ widgets [ 'filter-field_myfield'] - & gt; id;? & Gt;"> <! -? Php print $ widgets [ 'filter-field_myfield'] ---> label ; ? & Gt; </ Label> <! -? Php print $ widgets [ 'filter-field_myfield'] ---> widget; ? & Gt;

$ Widgets [ 'filter-field_myfield'] -> id - id нашого фільтра
$ Widgets [ 'filter-field_myfield'] -> label - заголовок
$ Widgets [ 'filter-field_myfield'] -> widget - і сам фільтр

Назва полів можна дізнатися в редагуванні уявлення. Головне не забути ставити «filter-» перед кожним з них.

Тепер можна виводити фільтри в будь-якому місці, послідовності, обернути в потрібні блоки.

Тепер можна виводити фільтри в будь-якому місці, послідовності, обернути в потрібні блоки

Додаткові фільтри я обернув в блок:

доп.фільтр 1 доп.фільтр 2 доп.фільтр 3 ...

<! - В самому кінці нашого файлу не забуваємо вставити кнопку для фільтрації -> <! -? Php print $ button; ? ->

<! - В самому кінці нашого файлу не забуваємо вставити кнопку для фільтрації -> <! -? Php print $ button; ? ->

У потрібному місці вставляємо посилання для відкриття / приховування доп.фільтров:

<A id = "openaddfilter" href = "#"> Розширений пошук </ a>

<a id="openaddfilter" href="#"> Розширений пошук </a>

Створюємо js-файл, який підключаємо до нашої теми і пишемо в ньому:

$ (Document). ready (function () {$ ( 'a # openaddfilter') .click (function () {if ($ ( 'div # addoptions') .css ( 'display') == 'none') {$ ( 'div # addoptions ') .show ();} else {$ (' div # addoptions ') .hide ();} return false;});});

$ (Document) .ready (function () {$ ( 'a # openaddfilter'). Click (function () {if ($ ( 'div # addoptions'). Css ( 'display') == 'none') { $ ( 'div # addoptions'). show ();} else {$ ( 'div # addoptions'). hide ();} return false;});});

Скрипт можна доповнити, щоб він зберігав, за вибором користувача, стан фільтра. Для цього необхідно підключити плагін jquery.cookie, докладніше в цієї статті .

Доповнення (25.07.2013)

Для Drupal7, як було відмічено в коментарях, спосіб трохи відрізняється. Щоб дізнатися id виведених фільтрів в нашому перевизначення файлі пишемо:

<? Php print_r ($ widgets); ?>

<? Php print_r ($ widgets);?>

Виводиться список. Наприклад у мене поле з select виводиться

<? Php print $ widgets [ 'filter-price'] -> widget; ?>

<? Php print $ widgets [ 'filter-price'] -> widget; ?>

Йдемо далі до js. Не всім зрозуміло, як воно працює. Для коректної роботи скрипта не важлива версія Drupal. Скрипт отримує команду: при кліці по посиланню з id «pushme» перевірити показаний чи блок з id «showme»; якщо не показаний - показати, показаний - приховати. Усе. Тут є невелика заминка. Потрібно довантажити понад свіжу версію JQuery і щоб не було конфлікту версій, використовувати noconflict.

довантажувати jquery

<Script async src = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"> </ script>

<Script async src = "// ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"> </ script>

І тепер верхній шматок js зміниться на:

var $ jq = jQuery. noConflict (); $ Jq (document). ready (function () {$ jq ( 'a # openaddfilter') .click (function () {if ($ ( 'div # addoptions') .css ( 'display') == 'none') {$ jq ( ' div # addoptions ') .show ();} else {$ jq (' div # addoptions ') .hide ();}});});

var $ jq = jQuery.noConflict (); $ Jq (document) .ready (function () {$ jq ( 'a # openaddfilter'). Click (function () {if ($ ( 'div # addoptions'). Css ( 'display') == 'none' ) {$ jq ( 'div # addoptions'). show ();} else {$ jq ( 'div # addoptions'). hide ();}});});

Доповнення (31.07.2013)
завдяки Максиму знайшлося рішення, як запустити цей js без noconflict. Стаття на Хабре .

<Script type = "text / javascript"> (function ($) {$ (function () {$ ( 'a # openaddfilter') .click (function () {if ($ ( 'div # addoptions') .css ( 'display') == 'none') {$ ( 'div # addoptions') .show ();} else {$ ( 'div # addoptions') .hide ();}});});}) ( jQuery); </ Script>

<Script type = "text / javascript"> (function ($) {$ (function () {$ ( 'a # openaddfilter'). Click (function () {if ($ ( 'div # addoptions'). Css ( 'display') == 'none') {$ ( 'div # addoptions'). show ();} else {$ ( 'div # addoptions'). hide ();}});});}) ( jQuery); </ Script>

Php print $ widgets [ 'filter-field_myfield'] - & gt; id;?
Php print $ widgets [ 'filter-field_myfield'] ---> label; ?
Php print $ widgets [ 'filter-field_myfield'] ---> widget; ?
Php print $ widgets [ 'filter-field_myfield'] - & gt; id;?
Php print $ widgets [ 'filter-field_myfield'] ---> label ; ?
Php print $ widgets [ 'filter-field_myfield'] ---> widget; ?
Php print $ button; ?
Php print $ button; ?
Php print_r ($ widgets); ?
Php print_r ($ widgets);?

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: