Success story z Drupal hospody: theming polí ve view a seskupení mnohonásobných hodnot
Když potřebujete přetížit výstup pole ve view ($output v souboru views-view-field.tpl.php), v nápovědě najdete, že potřebná data vytáhnete takto:
$data = $row->{$field->field_alias};
To sice funguje, ale jen do chvíle, kdy je v poli hodnot více a vy nastavíte ve view „seskupit mnohonásobné hodnoty“. (Jestliže vypisujete pole s více hodnotami, potřebujete seskupení skoro vždy, jinak view vytvoří samostatný řádek pro každou hodnotu). V tom okamžiku zjistíte, že proměnná $data má hodnotu, která s vypisovaným polem moc nesouvisí (třeba číslo uzlu nebo revize) a dpm($row) toto pole vůbec nevypíše. Hrůza. V dokumentaci jsem to nenašla, na Googlu taky ne (až teď, když už vím řešení, to už se hezky hledá :-)).
Na tomto místě chci moc poděkovat Martinovi Hrabovčínovi, který kde se vzal tu se vzal na poslední Drupal hospodě v Praze (ano, měli jsme mezinárodní účast :-)) a ušetřil mi přinejmenším pár bezesných nocí. Takže řešení:
V případě seskupení mnohonásobných hodnot musíte data získat jako:
$data = $field->field_values[$row->{$field->field_alias}];
… a pak už to jede jako po másle. Dostanete pole, jehož hodnoty si vypíšete přes foreach(), provedete s nimi, co je třeba, a vygenerujete vlastní $output.
Příklad: ve view vypisuju tabulku, kde jsou telefonní čísla (a v každém poli jich může být několik, například každý může mít více pracovních telefonů). Telefony jsou zadané přes CCK (+ modul Phone). Ve view mám zadáno u tel. čísel „Group multiple values“. V tabulce je málo místa, proto chci čísla zkrátit o 5 prvních znaků předčíslí včetně mezery, což je u všech stejné – ‚+420 ‘.
Funkce v template.php vypadá takhle:
function phptemplate_preprocess_views_view_field (&$vars) {
if ($field->field == 'field_profile_phone_office_value') { // pracuju s kokrétním polem, ID pole zjistím ve view - Theme: information
$data = $field->field_values[$row->{$field->field_alias}]; //vytáhnu data
$output_array = array(); // z toho, co si za chvíli vyberu, budu následně tvořit vlastní pole
$separator = '<br />'; // jednotlivé hodnoty budu chít ve výstupu oddělit, nadefinuju si oddělovač
foreach($data as $item) { //projdu pole s daty
$profile_phone_office = $item['value']; //tady si vyberu, co chci vypsat, pokud nevím, použiju dpm($data);
if(!empty($profile_phone_office)) { // prevence proti výpisu prázdných řádek, což by se jinak stalo
$profile_phone_office_short = substr($profile_phone_office, 5); // moje úprava, v tomto případě zkrácení o 5 znaků od začátku
$output_array[] = $profile_phone_office_short; //vytaženou hodnotu přiřadím do svého pole
}
}
$vars['output'] = implode($separator, $output_array); // z pole vytvořím output - řetězec, se zvoleným oddělovačem
}
}
Díky ještě jednou Martinovi za pomoc… a choďte do (Drupal) hospod, šetří to čas a nervy ;-)

jeste se to da zjednodusit
jeste se to da zjednodusit primo urcenim preprocess funkce pro specificky field
a prosim nepouzivat engine prefix phptemplate_ v prikladech :)
Ok díky :-)
Ok díky :-)
Super článek
Díky za něj :-).
Poslat nový komentář