Jak upravit položky formuláře Exposed Views v Drupalu

Jednou z možností využití modulu Views v Drupalu je vytvoření uživatelského filtrování dat. Namísto toho, abyste filtr pevně nastavili, tak jej tzv. vystavíte a umožníte uživatelům webu nastavení filtru měnit. Ti si tak mohou sami vyhledávat obsah, který je zajímá. Zde je návod na mírnou úpravou takto vytvořených filtrů.

Pokud jste se s Exposed Views ještě nesetkali, pak vřele doporučuji starší článek Drupal: vyhledávací formulář pomocí Views. V návodu pro Drupal 6 tam zmiňuji postup, jak si vytvořit vlastní formulář pro filtrování dat ve Views s možností, že si jej uživatelé budou moci sami měnit. V Drupalu 7 to funguje podobným způsobem, jen se Views nastavuje v upraveném uživatelském rozhraní.

Praktické využití Exposed Filtrů ve Views můžete vidět například na adrese hostingy.maxiorel.cz ve vyhledávacím boxíku na pravé straně.

Pomocí takto vystavených filtrů můžete vytvořit ve formuláři různé rozbalovací nabídky. V diskuzi pod uvedeným článkem se objevily dotazy, jak jsem docílil toho, že místo položky <Any> v první položce rozbalovací nabídky (tedy pokud není vybrána žádná možnost), se mi zobrazuje například slovo kterýkoli nebo jakýkoli. Podívejme se tedy, jak toho postupně docílit. Upozorňuji, že návod se týká Drupalu 7 a Views 3.0 RC1. S velkou pravděpodobností by níže uvedený kód měl fungovat i v Drupalu 6.

1. Nevystačíte si s úpravou přímo ve Views?

Připomínám, že jakmile ve Views vytvoříte Exposed Filtr (vystavený filtr), můžete jej v pokročilém nastavení Views nechat zobrazovat jako samostatný blok. Ten pak můžete umístit kdekoli na webu. Po výběru možností a potvrzení je uživatel přesměrován na stránku generovanou pomocí Views, kde se mu zobrazí jen ty údaje, které vyhovují jím nastavenému filtru.

Řetězec, který se zobrazí v rozbalovacích nabídkách v případě, že není vybrána žádná možnost, nastavíte v administrační části Struktura > Views > Nastavení > Label for "Any" value. V mé verzi Views tam vidím jednak výchozí nastavení <Any> a jako druhou možnost do češtiny přeložené - nezáleží -. Věřím tomu, že spoustě z vás bude stačit tato změna nastavení.

2. Úprava řetězce v tématu vzhledu nebo v modulu

Pokud chcete na první místo rozbalovací nabídky pro nevybranou hodnotu vložit vlastní text, musíte již využít preprocess funkci pro Views. Umístit ji můžete do souboru template.php ve své šabloně vzhledu, případně do vlastního modulu. Funkci pojmenujte podle umístění jednou z variant:

function temavzhledu_preprocess_views_exposed_form(&$vars, $hook) {}

function nazevmodulu_preprocess_views_exposed_form(&$vars, $hook) {}

Drupal tuto funkci zpracuje pokaždé, když dojde k zobrazení formuláře vystavených filtrů z jakéhokoli Views. Jako první krok tedy musíte sestrojit podmínku, ve které ošetříte skutečnost, že dochází k zobrazení právě toho formuláře z View, který chcete opravit. Jak na to?

Nainstalujte si modul Devel, zapněte jej a do výše uvedené funkce vložte jediný řádek:

dsm($vars);

Funkce dsm() je součástí modulu Devel a zajistí, že v rozklikávacím zobrazení Krumo vám zobrazí obsah pole nebo objektu, který jí předáte jako parametr. V tomto případě zobrazí obsah pole $vars, které je předáváno preprocess funkci. Když si jej rozklikáte, zjistíte, že v poli $vars je další pole ['form'], v něm řetězec ['#id']. Zde je uložen jednoznačný identifikátor formuláře vystavených filtrů. Jeho hodnota vás zajímá. Pokud máte na stránce více vystavených filtrů, najděte si takto identifikátor toho správného formuláře a do preprocess funkce vložte podmínku:

if ( $vars['form']['#id'] == 'views-exposed-form-nazevview-page-1'){}

Hodnotu řetězce 'views-exposed-form-nazevview-page-1' samozřejmě upravte podle svého webu.

V rámci pole $vars['form'] najdete také pole jednotlivých komponent formuláře. Pak už stačí do výše uvedené podmínky vložit následující konstrukci:

$vars['form']['field_nazevpolicka_nid']['#options']['All'] = t('vaše vlastní hodnota k zobrazení nevybrané položky');
unset($vars['form']['field_nazevpolicka_nid']['#printed']);
$vars['widgets']['filter-field_nazevpolicka_nid']->widget = drupal_render($vars['form']['field_nazevpolicka_nid']);

Pokud jste tak už neudělali, odstraňte zápisy funkcí dsm(), vše uložte, vyprázdněte cache Drupalu a vyzkoušejte, jak se první popisek v konkrétní rozbalovací nabídce změnil.

3. Úprava tlačítka pro odeslání formuláře

Výše uvedeným způsobem můžete snadno změnit také text formulářového tlačítka pro odeslání nastaveného filtru. Do podmínky s identifikátorem formuláře stačí přidat:

$vars['form']['submit']['#value'] = t('Text tlačítka');     
unset($vars['form']['submit']['#printed']);    
$vars['button'] = drupal_render($vars['form']['submit']);

4. Kompletní ukázka

Nedovedu zde zmínit kompletní příklad preprocess funkce pro váš konkrétní formulář na konkrétním webu, ale pro ilustraci, jak může taková jednoduchá funkce vypadat... Zde je ukázka ze souboru template.php aplikovaná na formulář pro vyhledávání webhostingu na hostingy.maxiorel.cz.

{syntaxhighlighter brush:php} function maxiorel3_preprocess_views_exposed_form(&$vars, $hook) { if ( $vars['form']['#id'] == 'views-exposed-form-webhostingynew-page-1') { $vars['form']['submit']['#value'] = t('Vyhledat webhosting'); unset($vars['form']['submit']['#printed']); $vars['button'] = drupal_render($vars['form']['submit']); $vars['form']['field_hoster_nid']['#options']['All'] = t('vyberte hostera'); unset($vars['form']['field_hoster_nid']['#printed']); $vars['widgets']['filter-field_hoster_nid']->widget = drupal_render($vars['form']['field_hoster_nid']); } } {/syntaxhighlighter}

5. Možná další vylepšení

Pomocí preprocess funkce můžete formulář s vystavenými filtry ve Views upravit mnohem více. Stačí si proklikat pořádně pole $vars zobrazené pomocí funkce dsm() a podívat se, jak se skládají hodnoty políček a nastavení daného formuláře. Zjistíte, že jeho úprava je více než jednoduchá.

Tagy

Buďme ve spojení, přihlaste se k newsletteru

Odesláním formuláře souhlasíte s podmínkami zpracováním osobních údajů. 
Více informací v Ochrana osobních údajů.

Autor článku: Jan Polzer

Tvůrce webů z Brna se specializací na Drupal, WordPress a Symfony. Acquia Certified Developer & Site Builder. Autor několika knih o Drupalu.
Web Development Director v Lesensky.cz. Ve volných chvílích podnikám výlety na souši i po vodě. Více se dozvíte na polzer.cz a mém LinkedIn profilu.

Komentáře k článku

návštěvník

 

Dobry den,

je mozne vylepsit tento vyhladavaci formular tak, aby bol vyuzity ajax a ak niekto zmeni formular, zmeni sa automaticky aj vysledok? skusala som zapnut ajax = ano, ale nepomohlo to.

A tiez by ma zaujimalo, ci sa da dat do takeho formulara aj tlacitko, ktore bude hladat fulltextovo?

 

dakujem za odpovede

 

Profile picture for user Jan Polzer

Co se AJAXu týče, myslím, že by to mohlo fungovat v případě, že ten formulář není v bloku, ale přímo nad daným View.

Fulltext - ve Views v Drupalu 7 lze do filtrů přidat políčko Hledat: Hledat termíny, v Drupalu 6 to bylo podobné.

návštěvník

Dakujem Vam velmi pekne za odpoved, zbytocne som sa netrapila.

Este predsalen jedna otazka - je mozne nad vysledky hladania zobrazit informacie - napr. naslo x vysledkov pre hladany vyraz abcd? 

 

Profile picture for user Jan Polzer

To si nejsem jist. Možná by to šlo někde v šabloně pro Views, kde by měl mít dostupný celý objekt. Ale nevím, zda je v něm i počet záznamů.

Profile picture for user Jan Polzer

Tak teď jsem to shodou okolností byl nucen řešit - je to možné v šabloně View, kde máte k dispozici objekt $view a v něm jednotlivé záznamy. Stačí tedy vzít $view->total_rows a někam to vypsat. Myslím, že by to mohlo jít i v hlavičce View, v šabloně Display output určitě.

návštěvník

Dakujem za odpoved.

Ja som nakoniec nasla aj ine riesenie - do sekcie Nadpis som vlozila Global: Result summary (views 3).

V kazdom pripade dakujem za rady, pisete skvele clanky, rada Vas citam a dozvedam sa nieco nove.

Přidat komentář

Odesláním komentáře souhlasíte s podmínkami Ochrany osobních údajů

reklama
Moje kniha o CMS Drupal

 

Kniha 333 tipů a triků pro Drupal 9


Více na KnihyPolzer.cz

Poslední komentáře