Creando revisiones con Field Collection dentro de otro Field Collection

June 18, 2021

Tags: IT Staff ES 2024
Share

Table of contents

Quick Access

drupal

 

En Drupal 7, los Field Collection son entidades independientes que pueden complicar el trabajo desde código, especialmente cuando se trata de Field Collections anidados o revisiones. A continuación, exploraremos cómo crear, eliminar y anidar Field Collections en nodos, teniendo en cuenta algunas consideraciones importantes.

 

Consideraciones iniciales

  1. Revisiones del contenido: Asegúrate de que el tipo de contenido sobre el que trabajarás permita crear revisiones.
  2. Ruta de las revisiones: Las revisiones pueden consultarse en la dirección:

    instalación_drupal/node/número/revisions/list 

 

Este artículo detalla cómo generar revisiones al realizar las siguientes acciones:

  1. Crear un Field Collection y enlazarlo a un nodo.
  2. Eliminar un Field Collection enlazado a un nodo.
  3. Crear un Field Collection y enlazarlo a otro Field Collection (anidado).

 

1. Crear un Field Collection y enlazarlo a un nodo

En este ejemplo, trabajaremos con un Field Collection llamado field_collection_fruit, que contiene los campos field_collection_fruit_name y field_collection_fruit_color. El siguiente código explica cómo añadirlo 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 idioma del campo    $lang = field_language("node", $node, 'field_collection_fruit');        // Eliminamos los ítems existentes para evitar duplicados    $total_items = count($node->field_collection_fruit[$lang]);    for ($i = 0; $i < $total_items; $i++) {      unset($node->field_collection_fruit[$lang][$i]);    }        // Creamos la entidad    $field_collection_item = entity_create('field_collection_item', ['field_name' => 'field_collection_fruit']);    $field_collection_item->setHostEntity('node', $node);        // Asignamos valores a los campos del Field Collection    $field_collection_item->field_collection_fruit_name[$lang][0]['value'] = 'manzana';    $field_collection_item->field_collection_fruit_color[$lang][0]['value'] = 'roja';        // Guardamos el nodo y generamos una revisión    $node->revision = 1;    node_save($node);  } } 

 

2. Eliminar Field Collections enlazados a un nodo

Para eliminar los Field Collections de un nodo, se puede usar la función unset() o, si es necesario, la función entity_delete(). El siguiente código muestra cómo hacerlo:

 
function _delete_field_collection($nid) {  // Cargamos el nodo  $node = node_load($nid);    // Verificamos si el campo existe  if (isset($node->field_collection_fruit)) {    $lang = field_language("node", $node, 'field_collection_fruit');    $total_items = count($node->field_collection_fruit[$lang]);        // Eliminamos cada ítem    for ($i = 0; $i < $total_items; $i++) {      unset($node->field_collection_fruit[$lang][$i]);      node_save($node);    }  } } 

 

3. Crear un Field Collection y enlazarlo a otro Field Collection (anidado)

En este caso, crearemos un Field Collection dentro de otro Field Collection. Supongamos que el field_collection_fruit contiene otro Field Collection llamado field_collection_fruit_exp, que a su vez tiene un campo llamado field_collection_fruit_country. El código es el siguiente:

 
function create_field_collection_inside_other($nid) {  // Cargamos el nodo  $node = node_load($nid);    // Verificamos si el campo existe  if (isset($node->field_collection_fruit)) {    $lang = field_language("node", $node, 'field_collection_fruit');        // Eliminamos los ítems existentes    $total_items = count($node->field_collection_fruit[$lang]);    for ($i = 0; $i < $total_items; $i++) {      unset($node->field_collection_fruit[$lang][$i]);    }        // Creamos el Field Collection principal    $field_collection_item = entity_create('field_collection_item', ['field_name' => 'field_collection_fruit']);    $field_collection_item->setHostEntity('node', $node);    $field_collection_item->field_collection_fruit_name[$lang][0]['value'] = 'manzana';    $field_collection_item->field_collection_fruit_color[$lang][0]['value'] = 'roja';        // Creamos el Field Collection anidado    if (isset($field_collection_item->field_collection_fruit_exp[$lang])) {      $field_collection_item_exp = $field_collection_item->field_collection_fruit_exp[$lang][0]['value'];      $field_collection_2 = entity_load('field_collection_item', [$field_collection_item_exp]);      $field_collection_2 = $field_collection_2[$field_collection_item_exp];    } else {      $field_collection_2 = entity_create('field_collection_item', ['field_name' => 'field_collection_fruit_exp']);      $field_collection_2->setHostEntity('field_collection_item', $field_collection_item);    }        // Asignamos valores al campo del Field Collection anidado    $field_collection_2->field_collection_fruit_country[$lang][0]['value'] = 'Panamá';        // Guardamos el nodo y generamos una revisión    $node->revision = 1;    node_save($node);  } } 

 

Conclusión

Trabajar con Field Collections en Drupal 7 requiere un manejo cuidadoso de las entidades y sus revisiones. Este artículo detalla los pasos básicos para:

  • Crear y enlazar Field Collections a nodos.
  • Eliminar Field Collections asociados.
  • Crear Field Collections anidados.

 

Con estas técnicas, puedes aprovechar al máximo esta funcionalidad para organizar y estructurar contenido complejo en tus proyectos de Drupal.

 

Te recomendamos este video