Přeskočit přímo na text


Views Query Alter pro výpis definovaného obsahu v definovaném pořadí

Toto je archivovaná verze české komunitní stránky o CMS Drupal. Nejde na ni již přidávat nový obsah. Pro aktuální informace a kontakt s komunitou navštivte Drupal.cz
Kategorie: Jak na to?
Týká se verze: Drupal 7.x

Někdy potřebujeme zobrazit ve Views obsah definovaný určitým seznamem v pořadí určeném tímto seznamem. Např. z nějaké vyhledávací funkce získáme seznam produktů jako pole jejich Node ID (NIDs). Chceme, aby Views zobrazilo tyto produkty, a to přesně v pořadí definovaném tímto polem. Řešením je udělat Views, ve kterém je filtr na pole nid, kam dáme nějakou hodnotu, na které Views otestujeme. Views uložíme a tuto testovací hodnotu tam necháme, protože ji stejně přepíšeme ve funkci hook_views_qu­ery_alter(). Tato funkce také dodá do SQL query definici pořadí.

Dobré je si vypsat $view->query, protože číslo filtru (v našem příkladu je to 1) se může měnit, pokud máte ve Views více filtrů. Dobrý způsob je také hledat tu vaší testovací hodnotu, čímž určíte, který filtr a podmínku potřebujete měnit. Chce to trochu „kpr() a Devel skill“ (kdo toto nechápe, najde si raději někoho, kdo mu s tím pomůže).

Korektně vypsaný kód najdete zde: https://gist.github.com/…392cc7a7d40f#…

Pozor, následující výpis obsahuje nekorektní apostrofy způsobené formátováním.

<?php /**
* Inject Views filter and sorting.
* We need display something defined (nids) with the same sorting order.
*
* The product list view display contains dummy filter, which is overridden
* in this function.
*
* Implements hook_views_qu­ery_alter().
*
* @param $view
* @param $query
*/ function module_views_qu­ery_alter(&$vi­ew, &$query) {
if ($view->current_display == ‚your_display_na­me‘) {
// Defined nids in defined order.
// Get this array from function or contextual filter or whatever you need.
$nids_array = array(12, 10, 11, 5, 16, 1);
if ($nids_array) {
// Override dummy view filter and fill it with nids.
$view->query->where[1][‚con­ditions‘][0][‚va­lue‘] = array();
$view->query->where[1][‚con­ditions‘][0][‚o­perator‘] = ‚IN‘;
foreach ($nids_array as $nid) {
$view->query->where[1][‚con­ditions‘][0][‚va­lue‘][] = $nid;
}
// Fill in sorting query.
$nids_order = implode(‚,‘, $nids_array);
$view->query->orderby[0][‚fi­eld‘] = „FIELD(nid, $nids_order)“;
$view->query->orderby[0][‚di­rection‘] = „ASC“;
}
} }

 

Nešel by případně použít

Nešel by případně použít modul? https://www.drupal.org/…rence_filter

Bezpečnost Drupalu

Z hlediska bezpečnosti je Drupal na velmi vysoké úrovni, díky propracovanému systému hlášení, prověřování a řešení možných problémů.

Čtěte více a odebírejte bezpečnostní aktuality

Poslední komentáře

Kdo je online

Momentálně je online 1 uživatel a 4 hosté.

Online uživatelé

Support

Psychologie - poradenství