Drupal 7 动态添加一个";“现场收集”;在Drupal7中使用脚本?
我想动态添加一个“”。但我不熟悉字段API或实体API。Drupal中新的实体API的文档非常缺乏 这是我的代码,直到现在: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)
$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;
}