Новости
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);?