Views Query Alter pro výpis definovaného obsahu v definovaném pořadí
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_query_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_query_alter().
*
* @param $view
* @param $query
*/ function module_views_query_alter(&$view, &$query) {
if ($view->current_display == ‚your_display_name‘) {
// 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][‚conditions‘][0][‚value‘] = array();
$view->query->where[1][‚conditions‘][0][‚operator‘] = ‚IN‘;
foreach ($nids_array as $nid) {
$view->query->where[1][‚conditions‘][0][‚value‘][] = $nid;
}
// Fill in sorting query.
$nids_order = implode(‚,‘, $nids_array);
$view->query->orderby[0][‚field‘] = „FIELD(nid, $nids_order)“;
$view->query->orderby[0][‚direction‘] = „ASC“;
}
} }

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