[Drupal] 用程式建立/更新/刪除 Field Collection 欄位

參考文章1:https://www.drupal.org/node/1842304
參考文章2:http://audiblecode.com/blog/programmatically-create-and-update-field-col...

主要有兩種模式:「直接賦值」 及 「entity_metadata_wrapper」

建立欄位

//讀取目標node
$my_node=node_load($nid);

//建立field_collection_item的entity
//此欄位名稱為 field_text_files
$fc = entity_create('field_collection_item', array('field_name' => 'field_fieldcollection_name'));

//將此欄位與$my_node連結起來
$fc->setHostEntity('node', $my_node);
//利用Entity API 把這個field collection item包裹起來,接著就能Entity API的函數來快速修改這個欄位了。
$fc_wrapper = entity_metadata_wrapper('field_collection_item', $fc);

//假設這個field_collection中有兩個欄位,一個是 field_data1,一個是field_data2
//接著我們要為這兩個欄位設定資料
$fc_wrapper->field_data1->set('欄位值1');
$fc_wrapper->field_data2->set('欄位值2');

/** 
*  註:如果不想用entity_metadata_wrapper的方法,則直接賦值後儲存即可
*  $fc->field_data1[LANGUAGE_NONE][0]['value']='欄位值1';
*  $fc->field_data2[LANGUAGE_NONE][0]['value']='欄位值2';
*  $fc->save();
*/

//儲存這個field_collection
$fc_wrapper->save();

//儲存node
node_save($my_node);
//若不想變更node的更新日期的話,則要用field_attach_update('node',$my_node);

更新欄位

//類似建立欄位的方式,但不需要經過entity_create()

//讀取目標node
$my_node=node_load($nid);
$node_wrapper = entity_metadata_wrapper('node', $my_node);
// 取得第一個field_collection的欄位值
$collection = $node_wrapper->field_fieldcollection_name[0]->value();
$collection_wrapper = entity_metadata_wrapper('field_collection_item', $raw_collection);
$collection_wrapper->field_data1= '欄位值1';
$collection_wrapper->field_data2= '欄位值2';
//儲存
$collection_wrapper->save();

刪除欄位

$my_node = node_load($nid);
$field_collection_item_value = $node->field_collection1[LANGUAGE_NONE][0]['value'];
entity_delete_multiple('field_collection_item', array($field_collection_item_value));