【问题标题】:Modifying a field collection programmatically missing hostEntity fields以编程方式修改字段集合缺少 hostEntity 字段
【发布时间】:2013-07-18 18:51:14
【问题描述】:

我正在尝试修改已经存在的节点中的字段集合,以便可以更改 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. 专家图像
    2. field_expert_image
    3. 图片
  • 专家姓名
    • field_expert_name
    • 文字
  • 专家头衔
    • 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(最终用户或开发人员)还是很陌生

    【问题讨论】:

      标签: drupal drupal-7 drupal-field-collection


      【解决方案1】:

      好吧,我想我已经想通了,我写了一个函数来设置字段集合值:

      // $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 的字段,则不确定是否会正确设置而不做其他事情)。

      祝你好运! 杰克

      【讨论】:

      • 感谢您的出色工作
      【解决方案2】:

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

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

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

      【讨论】:

      • 致命错误:调用未定义的方法 stdClass::save()
      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      相关资源
      最近更新 更多