Drupal: vyhledávací formulář pomocí Views

Fulltextové vyhledávání v Drupalu nemusí být vždy tím nejlepším řešením. Pokud stavíte katalogový web, určitě byste jeho návštěvníkům raději nabídli možnost vyfiltrování záznamů pomocí speciálního formuláře. Takový formulář vám může vytvořit modul Views.

Standardní fulltextové vyhledávání zabudované v Drupalu vám prohledá obsah a nadpisy příspěvků a poté zobrazí seznam výsledků s možností podrobnějšího filtrování pomocí typů obsahu a kategorií. To ale vždy nemusí stačit. Představte si, že máte katalog a chcete uživatelům nabídnout vyfiltrování položek podle konkrétních položek vyplněných například v políčkách CCK.

V takovém případě už musíte použít modul Views a jeho Exposed Filtry. Něco málo jsem zmínil už před více jak rokem v článku Drupal: využití exposed filtrů pro uživatelské vyhledávání, dnes se na vytvoření vyhledávacího formuláře podíváme podrobněji.

Základem budiž políčka CCK

Když budete vytvářet web katalogového typu, s největší pravděpodobností sáhnete po modulu Content Construction Kit (CCK). Po jeho instalaci vám ve Správě obsahu > Typy obsahu přibude možnost přidávání dalších políček k vybranému typu obsahu. Kromě vyplňování nadpisu a těla článku tak budete moci přidat například doplňování nějakých čísel, mailů nebo dalších textů do samostatných políček. Hodnoty z nich pak budou zobrazeny v příspěvku a bude s nimi možné pracovat v modulu Views.

Podrobnosti k práci s CCK najdete například v knize Drupal - Podrobný průvodce tvorbou a správou webů. Drupal 7 obsahuje většinu funkcionality modulu CCK už v sobě a podrobný návod pro práci s nimi najdete v připravované knize. O jejím vydání vás budu informovat.

Připravte si Views

Drupal v základní podobě dovede do nějakého výpisu vyfiltrovat obsah podle toho, do jaké je zařazen kategorie. Pomocí modulu Views však můžete filtrovat podle mnoha dalších položek, například podle autorů nebo podle data vydání. S Views také nastavíte libovolné řazení položek ve výpisu.

Další výhodou modulu Views, je možnost rozhodnout se, zda vyfiltrovaný obsah zobrazíte klasicky ve formě nadpisů a úvodníků, nebo zda zobrazíte jen některá jeho políčka - například nadpis a některá pole přidaná modulem CCK. Pro podrobnosti vás opět odkážu do knihy, případně si můžete doinstalovat modul Advanced Help, který k Views přidá podrobnou nápovědu a dokumentaci.

Nyní již prakticky. Přejděte do Prvky webu > Views a vytvořte nové View. V boxíku Filtry klepněte na tlačítko + a přidejte filtrování podle Uzly: Vydáno, tím se vám do výběru dostanou všechny záznamy, které jsou publikovány. Poté přidejte filtr Uzly: Typ, kde následně vyberete, jaký typ obsahu chcete ve výběru zobrazit. Tím je výběr dále omezen.

V boxíku Sort Criteria přidejte řazení podle data vydání tak, aby nejnovější položky byly nahoře - Uzly: Updated date: desc, nebo Uzly: Post date: desc. Pozor, častou chybou je nastavení řazení podle Uzly: Vydáno. Tato informace ale neobsahuje datum, jenom příznak toho, zda je příspěvek publikován.

V boxíku Basic Settings nastavte Row style na Uzly. Nyní byste pod nastavením View měli vidět náhled toho, jak bude výběr vypadat. Vraťte se očima nahoru a v levé části vyberte z rozbalovací nabídky položku Stránka a klepněte na tlačítko Add display. Tím View sdělujete, že výběr chcete zobrazit ve formě stránky - vlevo ji označte a všimněte si, že přibyl boxík Page settings, do kterého zadáte adresu, na níž bude stránka s tímto výběrem dostupná.

Nyní View uložte a zkuste se podívat na stránku, jejíž adresu jste před chvílí uvedli. Měl by na ní být vidět výběr obsahu, který svým řazením a filtrem odpovídá nastavení definovanému před chvílí.

Vytvořte Exposed Filtry

Do editace View se můžete dostat buď přes plovoucí odkazy, které se vám zobrazí při najetí myší nad stránku s View, nebo pomocí Prvky webu > Views. Ve filtrech přidejte filtrování podle další položky. Nejlépe, pokud máte u daného typu obsahu nějaké políčko CCK a chcete filtrovat dle jeho obsahu. Při definici filtru tedy vyberete skupinu Obsah a v ní konkrétní políčko CCK.

Důležité je, abyste při definici tohoto nového filtru zmáčkli tlačítko Exposed. Tím se vám zpřístupní další nastavení, ve kterém můžete určit, že daný filtr je nepovinný, nebo z jakých hodnot může být vybírán. Zaktualizujte jej a v náhledu si všimněte, že nad výběrem obsahu se objevilo políčko právě přidaného Exposed filtru. Výběr obsahu dopovídá již dříve nastavenému typu a publikaci, když nyní vyberete nebo zadáte hodnotu do nového filtrovacího políčka, bude výběr dále omezen.

Opět tedy celé View uložte a podívejte se na stránku, které toto View specifikuje. Mělo by se na ní objevit políčko umožňující omezit výběr.

Vyhledávací formulář v bloku

Ne vždy je ale praktické, když se filtrování objevuje nad výpisem obsahu. Většinou je lepší, když toto filtrování dostanete do samostatného bloku, který může být zobrazen na všech stránkách webu, například někde po straně. Po nastavení filtru v něm a po potvrzení je pak uživatel přesměrován na stránku daného View, kde je mu zobrazen obsah odpovídající pevným filtrům a tomu, co nastavil v Exposed filtrech ve formuláři.

Vraťte se tedy opět do úpravy svého View, přidejte několik dalších filtrů a v boxíku Basic Settings nastavte Exposed form in block na Ano. Nastavení View uložte, přejděte do Prvky webu > Bloky a někam na stránku zapněte nový blok nabízející filtrování k tomuto View.

Ukázka praktického využití

Zde je ukázka konkrétního využití Exposed filtrů, které najdete na webu hostingy.maxiorel.cz. Tyto stránky slouží k zobrazení přehledu českých hostingů. Při definici View jsem tedy vybral zobrazení publikovaného obsahu a protože jsem chtěl filtrovat jen webhostingy, nastavil jsem příslušný typ obsahu. Ten jsem si již dříve vytvořil a přidal k němu políčka pro zadávání platformy, provozovatele a podobně.

Nastavení View a exposed filtrů

Nastavení View a exposed filtrů

K některým těmto políčkům jsem pak přidal exposed filtry a nastavil jsem jejich zobrazení do bloku. Ten můžete vidět v horní části stránky. Díky Exposed Filtrům si uživatel může vybrat cenu hostingu, hostera, platformu, podporované aplikace, databáze nebo podporované skriptování a výsledek zobrazit na samostatné stránce.

Blok s Exposed Filtry, které zadává návštěvník stránky

Blok s Exposed Filtry, které zadává návštěvník stránky

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.
Marketing 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

Jak jste prosimvás udělal změnu z <Any> (když není vybraná podmínka pro filtrování) na "kterýkoli" nebo "cokoli" .. ?

Profile picture for user Jan Polzer

Jednoduše. Níže přikládám kód, který mám umístěn v template.php. Pokud bude zájem o hlubší vysvětlení, hlaste se a udělám článek.

function maxiorel3_preprocess_views_exposed_form(&$vars, $hook) {
  if ( $vars['form']['#id'] == 'views-exposed-form-Webhostingy-page-1')
  {
    /*print '<pre>';
    print_r($vars['form']);
    print '</pre>';
    die;*/
    $vars['form']['submit']['#value'] = t('Search');    
    unset($vars['form']['submit']['#printed']);   
    $vars['button'] = drupal_render($vars['form']['submit']);
   
    //Change the <any> choice to All options
    $vars['form']['field_hoster_nid']['#options']['All'] = t('kterýkoli');
    unset($vars['form']['field_hoster_nid']['#printed']);
    $vars['widgets']['filter-field_hoster_nid']->widget = drupal_render($vars['form']['field_hoster_nid']);   

    $vars['form']['field_platforma_value_many_to_one']['#options']['All'] = t('cokoli');
    unset($vars['form']['field_platforma_value_many_to_one']['#printed']);
    $vars['widgets']['filter-field_platforma_value_many_to_one']->widget = drupal_render($vars['form']['field_platforma_value_many_to_one']);
   
    $vars['form']['field_aplikace_value_many_to_one']['#options']['All'] = t('cokoli');
    unset($vars['form']['field_aplikace_value_many_to_one']['#printed']);
    $vars['widgets']['filter-field_aplikace_value_many_to_one']->widget = drupal_render($vars['form']['field_aplikace_value_many_to_one']);
   
    $vars['form']['field_databaze_value_many_to_one']['#options']['All'] = t('jakákoli');
    unset($vars['form']['field_databaze_value_many_to_one']['#printed']);
    $vars['widgets']['filter-field_databaze_value_many_to_one']->widget = drupal_render($vars['form']['field_databaze_value_many_to_one']);
   
    $vars['form']['field_skriptovani_value_many_to_one']['#options']['All'] = t('cokoli');
    unset($vars['form']['field_skriptovani_value_many_to_one']['#printed']);
    $vars['widgets']['filter-field_skriptovani_value_many_to_one']->widget = drupal_render($vars['form']['field_skriptovani_value_many_to_one']);           
   
  }
 
  if ( $vars['form']['#id'] == 'views-exposed-form-Serverhostingy-page-1')
  {
    /*print '<pre>';
    print_r($vars['form']);
    print '</pre>';
    die;*/
    $vars['form']['submit']['#value'] = t('Search');    
    unset($vars['form']['submit']['#printed']);   
    $vars['button'] = drupal_render($vars['form']['submit']);
   
    //Change the <any> choice to All options
    $vars['form']['field_hoster_nid']['#options']['All'] = t('kterýkoli');
    unset($vars['form']['field_hoster_nid']['#printed']);
    $vars['widgets']['filter-field_hoster_nid']->widget = drupal_render($vars['form']['field_hoster_nid']);   

    $vars['form']['field_platforma_value_many_to_one']['#options']['All'] = t('cokoli');
    unset($vars['form']['field_platforma_value_many_to_one']['#printed']);
    $vars['widgets']['filter-field_platforma_value_many_to_one']->widget = drupal_render($vars['form']['field_platforma_value_many_to_one']);
   
    $vars['form']['field_typ_serveru_value_many_to_one']['#options']['All'] = t('jakýkoli');
    unset($vars['form']['field_typ_serveru_value_many_to_one']['#printed']);
    $vars['widgets']['filter-field_typ_serveru_value_many_to_one']->widget = drupal_render($vars['form']['field_typ_serveru_value_many_to_one']);           
   
  }
}

návštěvník

Dobrý den pane Polzere,

nemohl byste k tomu přidat alespoň krátký komentář - co je co v kódu, nebo obrázek Stránka z views Hostingy?

Předem děkuji

návštěvník

Používám modul content profile a chci vypsat stránku kde budou uživatelé s profilem. V nodu profil mám přidaný field pohlaví (uživatel si může vybrat z rozevíracího seznamu). Vytvořim view druh node, přidám filtr Typ obsahu=profil, další filtr field_pohlaví jenže..musim zadat hodnotu, která se má zobrazit ručně, nemůžu zaškrtnout jestli Muž nebo Žena. Když potom vytvořim exposed filtr tak do něj můžu psát, já ale chci aby se zobrazila nabídka jako to máte vy. Kde dělám chybu?

možná bych měl ještě říct že používám http://drupal.org/project/imagefield_avatar který zároveň potřebuje Hierarchical Select a Hierarchical Select Field Selector

návštěvník

Áha, když vybírám field_pohlavi ve filtrech, musim vybrat fireld_pohlavi - povolené hodnoty a tam zaškrtat možnosti k výběru. Třeba to pomůže ostatním

návštěvník

A jak zajistit, aby formulář ve výchozím stavu nezobrazoval žádné položky, nýbrž aby je zobrazil, až po zadání hodnot do filtru?

Profile picture for user Jan Polzer

Tak nastavit tam třeba takovou kombinaci, která vrátí nulový počet výsledků.

návštěvník

Zdravím, pokouším se instalovat Views přes ftp, ale v nastavení Modulů mám zatržítka u views zašedlé a píše to Ctools missing. Existuje nějaké řešení? Díky Martin

návštěvník

JJ, jsem Jouda, nějak jsem si nespojil, že Ctools jsou Chaos tool suite... Díky že se zabývate i tak trapnými dotazy.

návštěvník

Dobrý den, nastavil jsem si exposed filtry a jeden filtr je výběr pomocí checkboxů. Standardně se zobrazují položky checkboxů pod sebe, což mi moc nevyhovuje. S Drupalem začínam a potřeboval bych nasměrovat, kde je možno měnit formátování filtrů. Děkuji moc za jakoukoli radu.

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

Sledujte Maxiorla na Facebooku

Maxiorel na Facebooku

Poslední komentáře
Nové diskuze
Hosting pro Drupal a WordPress

Hledáte český webhosting vhodný nejenom pro redakční systém Drupal? Tak vyzkoušejte Webhosting C4 za 1200 Kč na rok s doménou v ceně, 20 GB prostoru a automatické navyšováním o 2 GB každý rok. Podrobnosti zde.

@maxiorel na Twitteru

Maxiorel na Twitteru