Computed Field

Verze pro tiskVerze pro tisk
vypočítané pole je naplněno hodnotou, definovanou PHP kódem, "švýcarský nůž"
obsah, pole
užitečný
Drupal 7: 
stabil.
Drupal 10/11: 
vývoj.
Návod: 

při vytváření nového pole typu Computed je třeba nastavit dostatečnou velikost!
Data Length=255
Pokud se očekává řazení podle tohoto pole ve views, je NUTNÉ použít číselný typ!

v části Computed Code
je potřeba vložit vypočítanou hodnotu do proměnné
$entity_field[0]['value'] =...

RŮZNÉ:
$typobsahu = $entity->type;
$nazevnode = $entity->title;
 

hodnota z textového nebo číselného pole:
$hodnotavpoli = $entity->field_mojepole['und'][0]['value'];

hodnota z pole typu odkaz:
$hodnotavpoli = $entity->field_mojepole['und'][0]['url'];

hodnota z pole typu seznam:
$hodnotavdatabazi = $entity->field_mojepole['und'][0]['value'];

$field = field_info_field('field_mojepole');
$hodnotapekna = $field['settings']['allowed_values'][$hodnotavdatabazi ];
viz https://www.drupal.org/node/2307109

hodnota z taxonomy_term:
$idkategorie = $entity->field_mojepole['und'][0]['tid'];   
$term = taxonomy_term_load($idkategorie);
$nazevkategorie = $term->name;
$polekategorie = $term->field_pole['und'][0]['value'];

hodnota z node_reference:
$idnode = $entity->field_mojepole['und'][0]['target_id'];  
$mujnode = node_load($idnode);
$nazevnode = $mujnode->title;
$polenode = $mujnode->field_pole['und'][0]['value'];
$polemail = $mujnode->field_pole_email['und'][0]['email'];

hodnota ze souboru (url souboru):
$idsouboru = $entity->field_image['und'][0]['fid'];
$file = file_load($idsouboru);
$urisouboru = $file->uri;
$urlsouboru = file_create_url($urisouboru);
$entity_field[0]['value'] = $urlsouboru;

hodnota políčka z vícehodnotového node_reference, pokud chceme hodnotu políčka z posledního nodereference:
(např.: ve třídě voláme příjmení posledního z třídních učitelů)
$idnode=0; $policko=""; $p=0;                                 // p je počitadlo odkazů na nodereference
$pole_vsech_noderef= $entity->field_nodereference['und'];     // pole všech odkazů na nodereference
while (array_key_exists($p, $pole_vsech_noderef)) {   
        $idnode= $pole_vsech_noderef[$p]['target_id'];
        $mujnode = node_load($idnode);
        $policko = $mujnode->field_pole['und'][0]['value'];
        $p++;  
}

hodnota políčka z vícehodnotového paragraphs, pokud chceme hodnotu políčka z posledního paragraph:
(např.: číslo dveří posledního umístění)

$cislo=0; $kdevsudetobylo = array(); $idprg = array();
$idmistnosti = 0; $idm = 0; $p=0;
$dat0 = strtotime("now"); $dat1 = 0; $poslednidat = 0;

if (isset($entity->field_umisteni['und'])) {
$kdevsudetobylo = $entity->field_umisteni['und'];

while (array_key_exists($p, $kdevsudetobylo)) {
    $idprg = $entity->field_umisteni['und'][$p];
    $vsechnaumisteni = entity_load('paragraphs_item', $idprg);
    foreach ( $vsechnaumisteni as $jednoumisteni ) {
        $dat = $jednoumisteni->field_datum[LANGUAGE_NONE][0]['value'];
        $dat1 = strtotime($dat);
        if($dat1 > $poslednidat) {
            $poslednidat = $dat1;
            $idm = $jednoumisteni->field_misto_kde['und'][0]['target_id'];
        }
    }
    $p++;
}}
$idmistnosti = $idm + 0;

if ($idmistnosti) {
  $tamtoje = node_load($idmistnosti);
  $cislo= $tamtoje->field_mistnost_dvere['und'][0]['value'];
}
$entity_field[0]['value'] = $cislo;

 

 

hodnota z pole datum:
$hodnotavpoli = $entity->field_datum[LANGUAGE_NONE][0]['value'];
$hodnotavpoliend = $entity->field_datum[LANGUAGE_NONE][0]['value2'];
$ciselnahodnota = strtotime($hodnotavpoli);
$zobrazitdatum = date("j. n. Y",$ciselnahodnota);
$entity_field[0]['value'] = $zobrazitdatum;

 

 

v části Display Code
ponechat defaultní hodnotu:
$display_output = $entity_field_item['value'];

---------------------
Pokud se vypočítává pole načítané do node title (Auto Nodetitle), uzel je potřeba uložit dvakrát,
po každé změně je potřeba uzel uložit zase dvakrát

---------------------
 

----- PHP -----

vybrat první písmenko z řetězce:
$prvni = mb_substr($celyretezec,0,1);
(pokud se použije funkce substr, neporadí si s českými znaky)

 

switch ($ppp) {
    case 0:      break;
    default:
}

 if ($aaa) {
        $cc=0;
      }
else {
          $cc=0;
}

 

foreach ($node->field_products as $product) {

/** @var Entity (i.e. Node, Paragraph, Term) $referenced_product **/
$referenced_product = $product->entity;

// Use now the entity to get the values you need.
$field_value = $referenced_product->field_name->value;
}

---

$promenna1 = "foo";
$promenna2 = "bar";
echo $$promenna1; // vypise obsah promenne $foo
echo $$promenna2; // vypise obsah promenne $bar
echo ${$promenna1.$promenna2}; // vypise obsah promenne $foobar

---

při testování, zda hodnota již v databázi je, použij ISSET

namísto:

$hodnotavdb = $entity->field_xxx['und'][0]['value'];
if ($hodnotavdb) {...

použij raději:

$hodnotavdb = isset($entity->field_xxx['und'][0]['value']) ? $entity->field_xxx['und'][0]['value'] : 0;
if ($hodnotavdb) {...

jinak možná vyhlásí chybu:

Warning: Undefined array key 0 ve funkci eval() (řádek: 2 v souboru ...xxx/sites/all/modules/computed_field/computed_field.module(468) : eval()'d code).