如何使用hook_node_presave更改字段的值


9

基本上,我想将名字和姓氏放到$ node-> field_par_contact_name中

但这给了我警告。(见下文)

function partnership_node_presave($ node){
  if($ node-> type =='伙伴关系'){
    $ first_name = $ node-> field_par_contact_first_name ['und'] [0] ['name'];
    $ surname = $ node-> field_par_contact_surname ['und'] [0] ['name'];

    // https://drupal.org/project/field_hidden
    //隐藏变量
    $ node-> field_par_contact_name ['und'] [0] ['value'] = $ first_name。''。$ surname;

    //保存后警告:array_flip():只能翻转STRING和INTEGER值!在DrupalDefaultEntityController-> load()中(... / drupal-7.23 / includes / entity.inc的第173行
  }
}

已更新,请参见图片: 在此处输入图片说明


您是否以编程方式提交表格?我的意思是您在使用hook_form_alter吗?然后在您的代码中某处添加drupal_form_submit?
严酷的

Answers:


6

对于初学者,您可能对要保存的字段值使用了错误的数组键;此处的“名称”应为“值”。

$node->field_par_contact_name['und'][0]['value'];

其次,您实际上是在“名称”和“姓氏”字段中使用“分类术语参考”字段。关于引用字段的重要一点是,您不能总是假定引用的实体已完全加载并且在对象中可用。默认情况下,加载节点对象时,该字段仅如下所示:

$node->field_par_contact_first_name (Array)
  'und' (Array)
    0 (Array)
      'tid' => 284

确实只有“ tid”键。“名称”是所引用术语的属性,通常不会自动提供。(随后的代码实际上可以加载引用的术语,并使其在$ node对象中可用,但是如果是这样,这只是偶然。)

如果您的“名字”和“姓氏”字段是文本字段而不是引用,那么您将可以轻松得多。然后,这些值将直接属于节点本身,而不是被引用的单独的分类法术语。

但是,如果您不喜欢使用分类术语引用,则应在代码中指出要加载的术语,然后从$ term-> name属性本身获取所需的值。


参见上图。没有“价值”
kenpeter

嗯,您使用的是“分类术语参考”字段的名字和姓氏,而不是我假设的文本字段。那很奇怪 :)更新了答案。
Les Lim

你是对的。
kenpeter
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.