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


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;
  }
}

Ответы:


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;
  }
}

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;
  }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.