Přeskočit přímo na text


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 ;-)

About the author

Eva Rázgová – spoluzakladatelka společnosti Squelle Group, s.r.o: http://www.squelle.com

 

jeste se to da zjednodusit

jeste se to da zjednodusit primo urcenim preprocess funkce pro specificky field

<?php
function mytheme_preprocess_views_view_field__field_profile_phone_office_value (&$vars) {
  $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
}
?>

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ář

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.
  • You can use Texy! to format and alter entered content.
  • Povolené HTML značky: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <p> <br> <b> <i> <h2> <img> <pre> <sup> <sub> <pre class="php"> <span class="php-keyword1"> <span class="php-var"> <span class="php-num"> <img class="screenshot"> <p class="beginner"> <a class="greybox"> <h3> <h4>

Více informací o možnostech formátování

Drupal meet-up mobilni web 2011

Hledat

Přihlášení

Poslední komentáře