hook_form_alter中“ und”的语言键的最佳实践


30

我正在自定义模块中以某种形式进行修改。代码如下:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

但是,我认为硬编码und是不好的。在这种情况下,正确修改表单字段的正确方法应该是什么?


由于很久以前就提出了此评论,所以它可能无关紧要。我使用foreach循环的一种简单方法。如果只是LANGUAGE_NONE,则只需运行一次。从form_alter的意义上讲,它应该从技术上更改表单使用的语言。
AyeshK

Answers:


40

不幸的是,您的自我回答并不那么普遍。现场语言和节点语言不是一回事。
仅当您使用Field Translation API(例如Entity translation)时才需要使用领域语言。当您开始使用它时,某些字段会转换为可翻译的。

可翻译字段具有语言代码,这确实很有意义。但是,如果该字段不可翻译,则语言代码将始终是(以及对于所有内容类型,实体等)LANGUAGE_NONE(最好使用常量LANGUAGE_NONE而不是字符串'und')。
因此,通过您的解决方案,您可以得到当节点是俄罗斯节点而节点字段使用时的情况LANGUAGE_NONE
幸运的是,字段通过'#language'键附加到表单,该键始终包含正确的语言代码。

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

如果您无权访问附加表格,则字段语言API函数可能会很有用。


4
这是该线程中唯一的正确答案。
Bojan Zivanovic

在检索节点/内容类型的图像场路径时,也可以使用此方法。谢谢
Jayaram R

10

如果您知道实体类型和捆绑包,请使用类似以下代码的代码,该代码调用field_language()

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

它将找出正确的语言,并将在多语言站点中工作。

还可以看看field_get_items()


这是正确的API方法。
Nikit 2012年

如果尚未创建该节点怎么办?
AgA 2014年

@Nikit我不确定,因为显示语言和表单语言不同。作者更改某种形式,可以是用于创建新节点或添加现有节点的新转换的形式。
卡拉布罗2014年

@kalabro-显示语言和表单语言-在当前上下文中相同。
Nikit 2014年

4

整个und交易是Drupal 7中最烦人的事情之一,在实践中并不如设计时那样有效。

无论如何,您都可以array_keys像这样获得第一语言:

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

那应该一直工作。


感谢您的回答。我在另一个答案中粘贴了为解决此问题所做的工作。:)
Shafiul 2012年

我也可以使用$ langs访问form_state中相同字段的值吗?
AgA 2014年

这真的安全吗?您可以确定$ langs [0]始终是正确的数组项吗?
rooby 2014年


0

回复:卡拉布罗的答案

他的代码对我不起作用-我的代码有些不同

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ lang] [0]返回“ u”,但是[$ lang]的完整值为“ und”,我也不需要['value'],因为$ form ['FIELDNAME'] ['#language' ]不是数组,而是字符串。


1
“ und”的第0个字符是“ u”。您处在一个曲折的小通道迷宫中,所有的阵列。
克里斯·伯吉斯
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.