Programowo ustaw wartość domyślną dla pola

10

W Drupal 6 możemy użyć PHP do ustawienia wartości domyślnych, ale ten sam kod nie może być użyty w Drupal 7.

Próbuję to zrobić hook_form_alter(), ale kod nie działa.

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;
  }
}
giorgio79
źródło

Odpowiedzi:

17

Zakładając, że twoja funkcja zmiany formularza faktycznie działa (co możesz potwierdzić za pomocą tego wywołania dsm()), istnieją jeszcze 2 poziomy tablicy, do których musisz przejść, aby dostać się do elementu pola:

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

W Drupal 7 masz tablicę wartości dla każdego języka, na który zostało przetłumaczone pole (tak, że pola o wielu / nieograniczonej liczności mogą być pokrywane), a pod każdym z nich znajduje się w tablicy dla różnych różnych kolumn pól. W większości przypadków będzie to „wartość”, ale nie zawsze (na przykład pole obrazu ma kolumnę identyfikatora pliku, kolumnę alt itp.)

Mam nadzieję, że to pomaga

Clive
źródło
Jest jeszcze jedna głębokość :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79
2
Ta odpowiedź nie będzie działać dla wszystkich widżetów; zależy od tego, jak określają swoją wartość. Na przykład w polu referencji encji użyj: $ form ['nazwa_pola'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee
@Renee Very true; jest bardziej szczegółowe wyjaśnienie tutaj
Clive
1
Wartości pól zawsze mają język @Mouneer, jeśli nie masz strony wielojęzycznej, LANGUAGE_NONEnależy użyć wartości domyślnej
Clive
1
Rzeczywiście, mogłem wyjaśnić, że nieco lepiej @Mouneer :) Gdzieś znajdziesz obecny język w formularzu (myślę, że może, $form['#entity']->languageale musiałbym to sprawdzić, aby można go było użyć zamiast stałej. użyłby również obecnego języka określonego przez $languageglobalny, ale i tak istnieją metody API ( field_get_itemslub nawet lepsze EntityMetadataWrapperdostarczone przez moduł encji)
Clive
0

To poprawne:

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;
  }
}
keopx
źródło
0

Działa to dobrze:

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;
  }
}
keopx
źródło