我可以使用以下代码检索附加到我的内容类型的字段集合的字段:
foreach ($entity->field_collection[LANGUAGE_NONE] as $line) {..}
或者来自实体包装器。
但我肯定无法用计算字段中计算的值更新集合字段,就像我通常对其他CCK字段所做的那样,比如:
$entity->field_regular[LANGUAGE_NONE][0]['value'] = $value ;
然后它被正常保存,就像我"手动"编辑了field_regular一样。
对于集合,这将不起作用(什么都看不见):
$entity->field_collection[LANGUAGE_NONE][$key]['field_coll_field0'][LANGUAGE_NONE][0]['value'] = $value ;
// entity wrapper way
$coll = entity_load('field_collection_item', array($line['entity']->item_id));
$wcoll = entity_metadata_wrapper('field_collection_item', $coll[$key);
$wcoll->field_coll_field0->set($value) ;
任何save()方法都会给我一个空白页(无限cgi循环):
entity_save('field_collection_item',$coll);
wcoll->save();
要以编程方式保存集合字段,我应该知道什么?谢谢,Jerome
请查看实体元数据包装文档页面,并提供如何更新字段集合的简单示例,例如:
<?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();
?>
所以你可能需要做如下操作:
try {
// Entity wrapper way.
$coll = entity_load('field_collection_item', array($line['entity']->item_id));
$wcoll = entity_metadata_wrapper('field_collection_item', $coll);
$wcoll->field_coll_field0 = $value;
$wcoll->save();
} catch (Exception $e) {
drupal_set_message(t('Error message: @error.',
array('@error' => $e->getMessage())), 'error');
watchdog_exception('MYMODULE', $e);
}
添加try/catch
可以防止出现空白页面。但是,如果您仍然有问题,请检查看门狗日志或PHP日志文件中的任何错误。