以编程方式为字段设置默认值


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

Answers:


17

假设您的表单更改功能实际上正在运行(您可以通过调用进行确认dsm()),则实际上还需要再访问2个级别的数组才能访问field元素:

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

在Drupal 7中,对于字段已翻译成的每种语言,都有一个数组值(以便满足具有多个/无限基数的字段),并且在每个字段下都位于数组中,用于各种不同的字段列。在大多数情况下,这将是“值”,但并非总是如此(例如,图像字段具有文件id列,alt列等)

希望能有所帮助


这是另外一个深度:)$form["field_accounts"]["und"][0]["value"]['#default_value'] = $default;
giorgio79'2

2
此答案并非对所有小部件都适用;取决于他们如何指定自己的价值。例如,对于一个entityreference字段,使用:$ form ['field_name'] ['und'] [0] ['target_id'] ['#default_value'] = $ default
Renee

@Renee非常正确;有一个更深入的解释这里
克莱夫

1
字段值始终使用@Mouneer语言,如果您没有多语言站点,LANGUAGE_NONE则应使用默认值
Clive

1
确实,我可以解释一下@Mouneer更好一些:)您会在某处的表单中找到当前的语言(我想也许$form['#entity']->language但是我必须检查一下,以便可以代替常量使用。)也会使用由$language全局变量确定的当前语言,但是总有一些API方法可以帮助解决这一问题(field_get_items甚至更好的是EntityMetadataWrapper由实体模块提供)
Clive

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;
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.