通过脚本在Drupal 7中动态添加“Field Collection”?

时间:2011-06-05 09:20:33

标签: drupal-7

我想动态添加“field collection”。但我不熟悉Field API或Entity API。 Drupal中的新实体API记录很差。

这是我的代码,直到现在:

$node = node_load(1);
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_book_text'));
$field_collection_item->setHostEntity('node', $node);

// Adding fields to field_collection

$field_collection_item.save();

“Field Collection”模块使用函数“entity_form_submit_build_entity”我无法使用,因为在我的情况下没有表格。

如果您能告诉我如何添加字段,我将不胜感激?

6 个答案:

答案 0 :(得分:7)

基于我在实时项目中使用的一些代码:

// Create and save research field collection for node.
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_article_references'));
$field_collection_item->setHostEntity('node', $node);
$field_collection_item->field_reference_text[$node->language][]['value'] = 'ABCD';          
$field_collection_item->field_reference_link[$node->language][]['value'] = 'link-val';
$field_collection_item->field_reference_order[$node->language][]['value'] = 1;
$field_collection_item->save();

答案 1 :(得分:4)

使用上述代码示例的任何人都应考虑使用Entity API中的entity_metadata_wrapper函数来设置实体上的字段值,而不是使用赋值运算符。因此,上面“更完整的示例”中的代码将是:

  if ($node->field_collection[LANGUAGE_NONE][0]) {
    // update
    $fc_item = reset(entity_load('field_collection_item', array($node->field_collection[LANGUAGE_NONE][0]['value'])));
  }
  else {
    // create
    $fc_item = entity_create('field_collection_item', array('field_name' => 'field_collection'));
    $fc_item->setHostEntity('node', $node);
  }

  // Use the Entity API to "wrap" the field collection entity and make CRUD on the
  // entity easier
  $fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc_item);

  // ... set some values ...
  $fc_wrapper->field_terms->set('lars-schroeter.com');

  // save the wrapper and the node
  // Note that the "true" is required due to a bug as of this time
  $fc_wrapper->save(true);

  node_save($node);

答案 2 :(得分:1)

更完整的例子:

  if ($node->field_collection[LANGUAGE_NONE][0]) {
    // update
    $fc_item = reset(entity_load('field_collection_item', array($node->field_collection[LANGUAGE_NONE][0]['value'])));
  }
  else {
    // create
    $fc_item = entity_create('field_collection_item', array('field_name' => 'field_collection'));
    $fc_item->setHostEntity('node', $node);
  }

  // ... set some values ...
  $fc_item->field_terms[LANGUAGE_NONE][0]['value'] = 'lars-schroeter.com';

  // save node and field-collection
  $node->field_collection[LANGUAGE_NONE][0] = array('entity' => $fc_item);
  node_save($node);

答案 3 :(得分:0)

使用entity_metadata_wrapper时,不需要调用node_save($ node)。它将确保只保存实体的数据和对主机的引用,而不会触发任何node_save,这是一个很好的性能提升。

但是,如果您有任何使用此字段集合的node_save触发操作(例如,在编辑节点时发送电子邮件的规则),您仍然需要node_save()。

答案 4 :(得分:0)

使用包装,他们是你的朋友:

  // Create an Entity
  $e = entity_create('node', array('type' => 'CONTENT_TYPE'));
  // Specify the author.
  $e->uid = 1;
  // Create a Entity Wrapper of that new Entity
  $entity = entity_metadata_wrapper('node',$e);

  // Specify the title
  $entity->title = 'Test node';

  // Add field data... SO MUCH BETTER!
  $entity->field_FIELD_NAME->set(1111);
  // Save the node.
  $entity->save();

答案 5 :(得分:0)

您可以在Drupal.org上找到Entity API Tutorial中记录的实体API。

在那里你可以找到一些有用的例子,特别是检查Entity metadata wrappers页面。

以下是基于变量的示例:

$node = node_load(1);
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_book_text')); // field_book_text is field collection
$field_collection_item->setHostEntity('node', $node);
$cwrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);
// Adding fields to field_collection
$cwrapper->field_foo_text->set("value");
$cwrapper->field_foo_multitext->set(array("value1", "value2"));
$cwrapper.save();

以下是使用上述文档页面中的字段集合的另一个示例:

<?php
    // Populate the fields.
    $ewrapper = entity_metadata_wrapper('node', $node);
    $ewrapper->field_lead_contact_name->set($contact_name);
    $ewrapper->field_lead_contact_phone->set($contact_phone);
    $ewrapper->field_lead_contact_email->set($contact_email);  

    // Create the collection entity and set it's "host".
    $collection = entity_create('field_collection_item', array('field_name' => 'field_facilities_requested'));
    $collection->setHostEntity('node', $node);  

    // Now define the collection parameters.
    $cwrapper = entity_metadata_wrapper('field_collection_item', $collection);
    $cwrapper->field_facility->set(intval($offset));
    $cwrapper->save();  

    // Save.
    $ewrapper->save();
?>

这是我的更高级示例,对于给定实体,它从field_rs_property_features加载分类术语引用,然后对于具有父术语的每个辅助术语,将其术语名称及其父术语名称添加到{{1通过将它们分组到标题(父)和值(子)中。如果不看代码,可能更难解释。所以这就是:

field_feed_characteristics_value