Code field a Display suit-ban

zpolgar képe

Drupal commerce-ben készítek egy shop-ot és a következő problémába futottam.

Egy termék megjelenítésénél a képre szeretnék tenni egy feliratot, ami jelen esetben a hozzá kapcsolt kifejezéstől függ, egy bizonyos taxoonomia term esetében kell, hogy ez megjelenjen. (láttam már 2 ilyen webshop-ot, amit szintén commerce-ben készítettek)

A termék megjelenítését Display suit-al végzem és abban vettem fel egy mezőt, amiben azt terveztem, hogy megvizsgálja, hogy a term azonosító a keresett vagy sem és ebben az esetben elhelyez egy class-t az oldal html kimenetében, amit a css-ben - már megformálok.

Viszont ebben a code field típusú mezőben a code-nál elvérzek. Nem igazán tudom, hogy hogyan nyerjem ki az infót.
Ha tud valaki segíteni?

Melyik modulhoz, modulokhoz kapcsolódik a téma?: 
Drupal verzió: 
aruna képe

szó hogy van a node (itt termék) teljes nézete, és a node-hoz tartozik taxonomy term-et tartalmazó field is.

Ha pl. ilyen az url: /node/2
akkor kb. így kéred le kódból a node-hoz tartozó taxonomy term-eket:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  $node = node_load(arg(1));
  // Get terms field content, if field ids and names of 'field_tags'
  $results = field_view_field('node', $node, 'field_tags', array('default'));
  $class_term_ids = "";
  foreach ($results as $key => $result) {
    if (is_numeric($key)) {
      $class_term_ids .= " " . $result['#options']['entity']->tid  ;
    }
  }
  // Print image in a <div> with classes.
  print '<div class="' . $class_term_ids . '">';
  // Replace token to print field.
  print token_replace('[node:field_image]');
  print '</div>';
}

A code field alatt látod a használható token-eket.

Nem próbáltam a kódot, csak fejből írtam, néhány webes link alapján összerakva, de a logika talán jó.

A fenti kód elméletileg egy div-et rak az image field-ed köré a taxonomy term id-kel a a div class-ába.

0
0
Sk8erPeter képe

Inkább az $entity objectet kéne felhasználni a célra, ami a Display Suite code fieldjében elérhető, ha a megfelelő DS-almodulok be vannak kapcsolva.
Most sajnos nincs időm konkrét példát írni.

0
0
szantog képe

php filter, views_php és társai egyértelműen felejtős, és a ds code field sem erre van kitalálva, hanem arra, hogy tetszőleges html-be ide-oda bepakolj egy-egy adatot, nem pedig arra, hogy komplett alkalmazás logikát építs bele. Az ilyen textaraeba hányt php kódoknak egy vége lehet, előbb-utóbb jön egy olyan frissítés, ami rosszabb esetben kinyírja az oldalt, de minimum elcsesz valamit, és iszonyat mennyiségű agysejt árán fogod megtalálni, hogy melyik textfieldben van a hiba.

Ha már php kódot írsz, semmi akadálya nincs, hogy azt a megfelelő hookban tedd meg.
Pl egy preprocess_node a sminkben:

  1. if ($field = field_get_items('node', $vars['node'], 'field_voc_category')) {
  2. $term = taxonomy_term_load($field[0]['tid']);
  3. $vars['classes_array'][] = drupal_html_class(check_plain($term->name));
  4. }

sample

_process nodeban közvetlenül a ds templatebe lehet injektálni akár ds régiót célozva.

3
0

----
Rájöttem, miért kérdezek olyan ritkán a drupal.hu-n. Amíg szedem össze az infokat a kérdéshez, mindig rájövök a megoldásra.

Sk8erPeter képe

"_process nodeban közvetlenül a ds templatebe lehet injektálni akár ds régiót célozva."
Erre tudsz esetleg rövid szemléltető példát mutatni?
Kösz!

2
0
zpolgar képe

Köszi a sok infót, én is arra gyanakodtam, hogy nem a legjobb a ds-ben mindezt megoldani, de nem találtam rá más viszonylag egyszerű megoldást, a hook-okban meg nem igazán vagyok még otthon.
De úgy érzem itt az idő, hogy belevessem magam.

0
0
zpolgar képe

Most jutottam el oda, mivel más megoldást nem találtam, hogy komolyabban foglalkozzam ezzel.
Az nem világos, hogy pontosan hová irjam ezt a kódrészletet.
Melyik template file-ba, kell beletennem?
Gyorsan tanulok, de még mindent nem értek a drupal-ban teljesen.

Előre is köszönöm

0
0
aruna képe

van valószínűleg egy
template.php
nevű fájl

Ebben tudsz drupal hook-okat létrehozni

/**
 * Ide írd le mit csinál a függvény.
 */
function YOURTHEMENAME_preprocess_node(&$vars) {
  if ($field = field_get_items('node', $vars['node'], 'field_voc_category')) {
    $term = taxonomy_term_load($field[0]['tid']);
    $vars['classes_array'][] = drupal_html_class(check_plain($term->name));
  }
}

A fenti kódot így rakd be, csak a saját theme-d azonosítóját rakd be a függvénynévbe.

0
0
zpolgar képe

Köszönöm, megpróbáltam, de nem törénik semmi látszólag, nem találok a keletkezett html kódban erre vonatkozó bármit is.

0
0
aruna képe

ez a taxonomy field azonosítója: "field_voc_category"
Nálad is ez az azonosító?

Amúgy logikailag jónak tűnik a fenti kód. Nézz bele az objektumokba is, pl. így:

$field = field_get_items('node', $vars['node'], 'field_voc_category');
dpm($field);
if ($field) {
    $term = taxonomy_term_load($field[0]['tid']);
    dpm($term);
    $vars['classes_array'][] = drupal_html_class(check_plain($term->name));
    dpm($vars['classes_array']);
  }

A devel modult engedélyezd, ha a dpm() függvényt használod.

0
0