如何在不更新父节点/实体drupal 7

时间:2015-06-06 05:55:10

标签: drupal drupal-7

我需要在不更新节点实体的情况下向节点实体添加/更新字段集合。我尝试了https://www.drupal.org/node/1842304http://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个字段和字段集合,我不想在将任何字段集合添加/更新到节点时多次更新它

任何帮助将不胜感激。 感谢

1 个答案:

答案 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();
}

在{}中替换您的内容类型和字段类型,然后您的字段集合与您的主机实体相关。 感谢