Creando revisiones con Field Collection dentro de otro Field Collection

June 18, 2021

En Drupal 7, los 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 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 (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); 
    }
  }

Yes, I liked thiscontent.