En Drupal 7, los [Field collection](https://drupal.org/project/field_collection) son una entidad más, y al momento de trabajar con ellas (desde código), se complica un poco... otro poco si trabajamos con [Field collections](https://drupal.org/project/field_collection) anidados y es posible que otro tanto si usamos revisiones...
Puntos a considerar antes de empezar:
- El tipo de contenido sobre el que trabajaremos debe permitir crear revisiones.
- La dirección para ver las revisiones: instalación_drupal/node/número/revisions/list
En este post vamos a generar revisiones al momento de:
1. Crear field collection y enlazarlo a un nodo.
2. Eliminar field collection, enlazado a un nodo.
3. Crear un field collection y enlazarlo a otro field collection.
Para los ejemplos 1 y 2, tendremos un field collection llamado "field_collection_fruit" y éste contará con 2 campos llamados "field_collection_fruit_name" y "field_collection_fruit_color"
**1. Crear field collection y enlazarlo a un nodo:**
function _create_field_collection($nid){
// Cargamos el nodo
$node = node_load($nid);
// Verificamos si el campo existe
if (isset($node->field_collection_fruit)){
//Obtenemos el lenguaje del campo
$lang = field_language("node", $node, 'field_collection_fruit' );
//Revisamos cuantos items 'field collection', tiene el nodo
$total_items = count($node->field_collection_fruit[$lang]) ;
// Eliminamos la información existente antes de crear nuevos registros
// (los valores se podrán ver en las revisiones anteriores)
for ($i=0; $i < $total_items ; $i++){
unset($node->field_collection_fruit[$lang][$i]);
}
// Creamos la entidad: entity_create($entity_type, array $values)
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_collection_fruit'));
// La adjuntamos al nodo
$field_collection_item->setHostEntity('node', $node);
// Establecemos el valor de "field_collection_fruit_name"
$field_collection_item->field_collection_fruit_name[$lang][0]['value'] = 'manzana';
// Establecemos el valor de "field_collection_fruit_color".
$field_collection_item->field_collection_fruit_color[$lang][0]['value'] = 'roja';
// Guardamos el field-collection item.
$node ->revision = 1 ;
node_save($node);
}
}
**2. Eliminar field collection enlazados a un nodo:**
function _delete_field_collection($nid){
// Cargamos el nodo
$node = node_load($nid);
$total_items = 0 ;
// Verificamos si el campo existe
if (isset($node->field_collection_fruit)){
// Obtenemos el lenguaje del campo
$lang = field_language("node", $node, 'field_collection_fruit' );
// Revisamos cuantos items 'field collection' tiene el nodo
$total_items = count($node->field_collection_fruit[$lang]) ;
for ($i=0; $i < $total_items ; $i++) {
// Si solo deseamos eliminar los valores de los campos, usamos entity_delete,
// $field_collection_item_id = $node->field_collection_fruit[$lang][$i]['value'];
// entity_delete_multiple('field_collection_item', array($field_collection_item_id));
// Usamos la función unset para “destruir” los field collections
unset($node->field_collection_fruit[$lang][$i]);
node_save($node);
}
}
}
**3. Crear un field collection y enlazarlo a otro field collection:**
Para el siguiente ejemplo, vamos a crear otro [Field collection](https://drupal.org/project/field_collection) (dentro del field_collection_fruit), lo llamaremos 'field_collection_fruit_exp' y a éste le crearemos un campo tipo texto, llamado 'field_collection_fruit_country'.
function create_field_collection_inside_other($nid){
// Cargamos el nodo donde adjuntaremos el field collection
$node = node_load($nid);
// Verificamos si el campo existe
if (isset($node->field_collection_fruit)){
// Obtenemos el lenguaje del campo
$lang = field_language("node", $node, 'field_collection_fruta' );
// Revisamos cuantos items 'field collection' tiene el nodo
$total_items = count($node->field_collection_fruit[$lang]) ;
// Eliminamos la información existente antes de crear nuevos registros
// (los valores se podrán ver en las revisiones anteriores)
for ($i=0; $i < $total_items ; $i++){
unset($node->field_collection_fruit[$lang][$i]);
}
// Creamos la entidad: entity_create($entity_type, array $values)
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_collection_fruit'));
// La adjuntamos al nodo
$field_collection_item->setHostEntity('node', $node);
// Establecemos el valor de "field_collection_fruit_name"
$field_collection_item->field_collection_fruit_name[$lang][0]['value'] = 'Manzana';
// Establecemos el valor de "field_collection_fruit_color".
$field_collection_item->field_collection_fruit_color[$lang][0]['value'] = 'roja';
// Revisar si existe algún field collections anidado, sino creamos uno.
if ($field_collection_item->field_collection_fruit_exp[$lang] ){
$field_collection_item_exp = $field_collection_item->field_collection_fruit_exp[$lang][0]['value'];
// Load that field collection item
$field_collection_2 = entity_load('field_collection_item', array($field_collection_item_exp));
$field_collection_2 = $field_collection_2[$field_collection_item_exp];
}
else{
$field_collection_2 = entity_create('field_collection_item', array('field_name' => 'field_collection_fruit_exp'));
$field_collection_2->setHostEntity('field_collection_item',$field_collection_item);
}
// Colocamos el valor del campo
$field_collection_2->field_collection_fruit_country[$lang][0]['value'] = 'Panamá';
// Guardamos el nodo y establecemos la revisión
$node ->revision = 1 ;
node_save($node);
}
}