Impostare a livello di codice il valore predefinito per un campo


10

In Drupal 6, potremmo usare PHP per impostare i valori predefiniti, ma lo stesso codice non può essere usato con Drupal 7.

Sto cercando di farlo hook_form_alter(), ma il codice non funziona.

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"]['#default_value'] = $default;
      // …
      break;
  }
}

Risposte:


17

Supponendo che la tua funzione di modifica del form sia effettivamente in esecuzione (che puoi confermare con quella chiamata a dsm()), ci sono in realtà altri 2 livelli di array che devi scendere per raggiungere l'elemento field:

$form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;

In Drupal 7 hai una serie di valori per ogni lingua in cui il campo è stato tradotto (in modo che i campi con cardinalità multipla / illimitata possano essere soddisfatti), e sotto ognuno di questi è presente una matrice per le diverse colonne di campi. Nella maggior parte dei casi questo sarà "valore" ma non sempre (ad esempio un campo immagine ha una colonna ID file, una colonna alt ecc.)

spero che aiuti


È ancora una profondità :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79,

2
Questa risposta non funzionerà per tutti i widget; dipende da come specificano il loro valore. Ad esempio, con un campo entityreference, utilizzare: $ form ['field_name'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee

@Renee Molto vero; c'è una spiegazione più approfondita qui
Clive

1
I valori dei campi hanno sempre una lingua @Mouneer, se non si dispone di un sito multilingue è LANGUAGE_NONEnecessario utilizzare il valore predefinito
Clive

1
In effetti, avrei potuto spiegare che un po 'meglio @Mouneer :) Troverai la lingua corrente nel modulo da qualche parte (penso che forse, $form['#entity']->languagema dovrei controllare, in modo che possa essere usato al posto di una costante. Codice di recupero userebbe anche il linguaggio corrente come determinato dal $languageglobale, ma ci sono comunque metodi API per aiutare con quello ( field_get_itemso anche meglio EntityMetadataWrapperfornito dal modulo entità)
Clive

0

Questo corretto:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);

  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"][LANGUAGE_NONE][0]['value']['#default_value'] = $default;
      // …
      break;
  }
}

0

Funziona bene:

function my_form_alter(&$form, &$form_state, $form_id) {
  dsm($form);
  switch($form_id) {
    case 'accounts_node_form':
      $form["field_accounts"]["und"][0]['value']['#default_value']=$default;
      break;
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.