Drupal 7 动态添加一个";“现场收集”;在Drupal7中使用脚本?

Drupal 7 动态添加一个";“现场收集”;在Drupal7中使用脚本?,drupal-7,Drupal 7,我想动态添加一个“”。但我不熟悉字段API或实体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)

我想动态添加一个“”。但我不熟悉字段API或实体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\u collection\u item=entity\u create('field\u collection\u item',array('field\u name'=>'field\u article\u references');
$field\u collection\u item->setHostEntity('node',$node);
$field\u collection\u item->field\u reference\u text[$node->language]['value']='ABCD';
$field\u collection\u item->field\u reference\u link[$node->language]['value']='link val';
$field\u collection\u item->field\u reference\u order[$node->language]['value']=1;
$field_collection_item->save();

更完整的示例:

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

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

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

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


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

使用包装器,它们是您的朋友:

  // 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();

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

在那个里你们可以找到一些有用的例子,特别是检查页面

以下是基于变量的示例:

$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();
?>

谢谢这个非常有用的例子。不过我注意到,新值保存时,不管最后是否调用node_save。对此我没有任何解释。这对我来说非常有效,尽管不需要node_save(),除非我遗漏了什么?
/**
 * Function to set taxonomy term names based on term references for given entity.
 */
function MYMODULE_refresh_property_characteristics(&$entity, $save = FALSE) {
  try {
    $w_node = entity_metadata_wrapper('node', $entity);
    $collections = array();
    foreach ($w_node->field_rs_property_features->getIterator() as $delta => $term_wrapper) {
      if ($term_wrapper->parent->count() > 0) {
        $name = $term_wrapper->name->value();
        $pname = $term_wrapper->parent->get(0)->name->value();
        if (array_key_exists($pname, $collections)) {
          $collections[$pname]->field_feed_characteristics_value[] = $name;
        } else {
          // Create the collection entity, set field values and set it's "host".
          $field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_feed_characteristics'));
          $field_collection_item->setHostEntity('node', $w_node->value());
          $collections[$pname] = entity_metadata_wrapper('field_collection_item', $field_collection_item);
          $collections[$pname]->field_feed_characteristics_title = $pname;
          $collections[$pname]->field_feed_characteristics_value = array($name);
        }
      }
    }
    if ($save) {
      $w_node->save();
    }
  } catch (Exception $e) {
    drupal_set_message(t('Error setting values for field collection: @title, message: @error.',
          array('@title' => $w_node->title->value(), '@error' => $e->getMessage())), 'error');
    watchdog_exception('MYMODULE', $e);
    return FALSE;
  }
  return TRUE;
}