0

我正在尝试修改已经存在的节点中的字段集合,以便可以更改 3 数组中第一个元素上的图像。问题是,当我执行 entity_load 或 entity_load_single 时未设置 hostEntity 信息,所以当我做一个:

$field_collection_item->save(true); // with or without the true
// OR
$fc_wrapper->save(true); // with or without the true

我收到以下错误:

Exception: Unable to save a field collection item without a valid reference to a host entity. in FieldCollectionItemEntity->save()

当我 print_r 字段集合实体时,hostEntity:protected 字段确实是空的。我的字段集合设置如下:

  • field_home_experts
    1. 专家图像 <--- 只想更改此数据并将其余数据保留在下面
      • field_expert_image
      • 图片
    2. 专家姓名
      • field_expert_name
      • 文本
    3. 专家头衔
      • field_expert_title
      • 文本

这是我试图用来修改现有节点字段集合的代码:

$node = getNode(1352); // Get the node I want to modify

// There can be up to 3 experts, and I want to modify the image of the first expert
$updateItem = $node->field_home_experts[LANGUAGE_NONE][0];

if ($updateItem) { // Updating
    // Grab the field collection that currently exists in the 0 spot
    $fc_item = reset(entity_load('field_collection_item', array($updateItem)));

    // Wrap the field collection entity in the field API wrapper
    $fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);

    // Set the new image in place of the current
    $fc_wrapper->field_expert_image->set((array)file_load(4316));

    // Save the field collection
    $fc_wrapper->save(true);

    // Save the node with the new field collection (not sure this is needed)
    node_save($node);
}       

任何帮助将不胜感激,我对整个 Drupal 还是很陌生(最终用户或开发人员)

4

2 回答 2

6

好吧,所以我想我已经弄清楚了,我编写了一个函数来设置字段集合值:

// $node: (obj) node object returned from node_load()
// $collection: (string) can be found in drupal admin interface: 
//              structure > field collections > field name
// $fields: (array) see usage below
// $index: (int) the index to the element you wish to edit           

function updateFieldCollection($node, $collection, $fields = Array(), $index = 0) {
    if ($node && $collection && !empty($fields)) {
        // Get the field collection ID
        $eid = $node->{$collection}[LANGUAGE_NONE][$index]['value'];

        // Load the field collection with the ID from above
        $entity = entity_load_single('field_collection_item', array($eid));

        // Wrap the loaded field collection which makes setting/getting much easier
        $node_wrapper = entity_metadata_wrapper('field_collection_item', $entity);

        // Loop through our fields and set the values
        foreach ($fields as $field => $data) {
            $node_wrapper->{$field}->set($data);
        }

        // Once we have added all the values we wish to change then we need to 
        // save. This will modify the node and does not require node_save() so
        // at this point be sure it is all correct as this will save directly
        // to a published node 
        $node_wrapper->save(true);
    }
}

用法:

// id of the node you wish to modify
$node = node_load(123); 

// Call our function with the node to modify, the field collection machine name
// and an array setup as collection_field_name => value_you_want_to_set
// collection_field_name can be found in the admin interface:
// structure > field collections > manage fields
updateFieldCollection(
    $node,
    'field_home_experts',
    array (
        'field_expert_image' => (array)file_load(582), // Loads up an existing image
        'field_expert_name' => 'Some Guy',
        'field_expert_title' => 'Some Title',
    )
);

希望这对其他人有所帮助,因为我花了一整天的时间试图让它工作(希望我不会永远在 Drupal7 中成为菜鸟)。将格式化文本正确设置为 set() 可能存在问题,但我不确定此时是什么,所以请记住这一点(例如,如果您有一个格式为 filters_html 的字段,则不确定是否会正确设置而不做其他事情)。

祝你好运!杰克

于 2013-07-19T18:30:27.457 回答
0

使用上述功能后,我仍然收到问题中提到的错误。这对我有用:

function updateFieldCollection($node, $collection, $fields = Array(), $index = 0) {
  $eid = $node->{$collection}[LANGUAGE_NONE][$index]['value'];
  $fc_item = entity_load('field_collection_item', array($eid));
  foreach ($fields as $field => $data) {
    $fc_item[$eid]->{$field}[LANGUAGE_NONE][0]['value'] = $data;
  }
  $fc_item[$eid]->save(TRUE);
}

我希望这对某人有所帮助,因为我花了很长时间才完成这项工作。

于 2013-10-07T12:47:08.987 回答