我需要在不更新节点实体的情况下向节点实体添加/更新字段集合。我尝试了https://www.drupal.org/node/1842304和http://alexrayu.com/blog/saveupdate-field-collection-without-nodesave中列出的两种方式,但它们似乎都没有按我想要的方式工作。
我尝试如下:
$node = node_load($nid);
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_college_rating_data'));
$field_collection_item->setHostEntity('node', $node);
$field_collection_item->field_text1['und'][0]['tid'] = $form_state['input']['field_text1']['und'];
$field_collection_item->field_text2['und'][0]['value'] = $form_state['input']['field_text2']['und'];
$field_collection_item->save();
它添加了一个字段集合,但它更新了节点。
我还尝试更改字段集合表单提交并使用自定义提交处理程序,如下所示:
function own_custom_field_collection_submit($form,$form_state) {
$field_collection_item = field_collection_item_form_submit_build_field_collection($form, $form_state);
$field_collection_item->save(TRUE);
drupal_set_message(t('The changes have been saved.'));
$form_state['redirect'] = $field_collection_item->path();
}
我已从核心字段集合模块复制此代码,以在保存功能中将默认参数更改为“TRUE”。它添加了字段集合,但未与父节点关联。
我需要单独保存字段集合,因为我的节点实体表单非常大,有50到60个字段和字段集合,我不想在将任何字段集合添加/更新到节点时多次更新它
任何帮助将不胜感激。 感谢
答案 0 :(得分:3)
您必须通过以下代码以实用方式将字段集合与主机实体相关联。
$field_collection_item = field_collection_item_form_submit_build_field_collection($form, $form_state);
$field_collection_item->save(TRUE);
$host_entity = $field_collection_item->hostEntity();
$lang = 'und';
if (isset($host_entity->nid) && isset($host_entity->vid) && isset($lang) && isset($field_collection_item->item_id) && isset($field_collection_item->revision_id)) {
$query = db_select('field_data_field_text1', 'fd');
$query->addExpression('max(fd.delta)', 'total_row');
$query->condition('fd.entity_id', $host_entity->nid);
$max_delta = $query->execute()->fetchField();
if (isset($max_delta)) {
$max_delta = $max_delta + 1;
} else {
$max_delta = 0;
}
db_insert('field_data_{field_collection}')->fields(array(
'entity_type' => 'node',
'bundle' => '{node_type}',
'entity_id' => $host_entity->nid,
'revision_id' => $host_entity->vid,
'language' => $lang,
'delta' => $max_delta,
'field_text' => $field_collection_item->item_id,
'field_text_revision_id' => $field_collection_item->revision_id
))
->execute();
}
在{}中替换您的内容类型和字段类型,然后您的字段集合与您的主机实体相关。 感谢