Программно установить значение по умолчанию для поля

10

В Drupal 6 мы могли использовать PHP для установки значений по умолчанию, но тот же код не может быть использован с Drupal 7.

Я пытаюсь сделать это до конца hook_form_alter(), но код не работает.

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
источник

Ответы:

17

Предполагая, что ваша функция изменения формы действительно запущена (что вы можете подтвердить с помощью этого вызова dsm()), на самом деле есть еще 2 уровня массива, к которым нужно перейти, чтобы добраться до элемента поля:

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

В Drupal 7 у вас есть массив значений для каждого языка, на который было переведено поле (так, чтобы можно было обрабатывать поля с множественной / неограниченной кардинальностью), и под каждым из них находится массив для различных столбцов полей. В большинстве случаев это будет «значение», но не всегда (например, поле изображения имеет столбец идентификатора файла, столбец alt и т. Д.)

надеюсь, это поможет

Клайв
источник
Это еще одна глубина :)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79
2
Этот ответ не будет работать для всех виджетов; зависит от того, как они указывают свою стоимость. Например, с полем entityreference используйте: $ form ['field_name'] ['und'] [0] ['target_id'] ['# default_value'] = $ default
Renee
@ Рене Очень верно; есть более глубокое объяснение здесь
Clive
1
Значения полей всегда имеют язык @Mouneer, если у вас нет многоязычного сайта, LANGUAGE_NONEследует использовать значение по умолчанию
Clive
1
В самом деле, я мог бы объяснить, что немного лучше @Mouneer :) Текущий язык вы найдете где-нибудь в форме (думаю, может быть, $form['#entity']->languageно мне придется проверить, чтобы его можно было использовать вместо константы. Извлечение кода будет использовать текущий язык , как определяется $languageглобальными, но есть методы API , чтобы помочь с этим в любом случае ( field_get_itemsили даже лучше , EntityMetadataWrapperвыдаваемая модулем объекта)
Клайв
0

Это правильно:

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
источник
0

Это прекрасно работает:

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
источник