Hoy os voy a explicar cómo crear nuevos Content Types complejos. ¿Para qué sirve esto? Imagina que quieres hacer “fichas” de usuarios, que contengan, por ejemplo:
- Fotografía de perfil
- URL de su página web
- Texto
- Galería de fotos asociada
Queremos llegar a algo parecido a:
Imagina, además, que la galería se actualiza muy a menudo, pero no el resto de campos. O que quieres dar al usuario la opción de modificar las fotos de su galería, pero no el resto de campos. O quieres que un usuario tenga la opción de tener varias galerías, y ya tienes un Content Type galería que te gustaría seguir usando. O muchísimos otros casos donde queremos gestionar por separado unos datos del nodo de otros.
Una opción muy interesante para solventar este problema es crear Content Types complejos (con datos propios al nodo y “punteros” que “apuntan” a nodos de otro tipo).
Módulos necesarios
Para realizar los pasos que vienen a continuación es necesario tener instalados los siguientes módulos en Drupal. El orden en que los pongo es el orden en que los instalé yo (si no tienes ni idea, aqui puedes ver cómo instalar un módulo drupal):
- CCK: Para poder crear Custom Content Types
- FileField, ImageAPI, ImageField e ImageCache.
- NodeReferenceURL: módulo para crear referencias entre nodos.
- Gallery Assist: un módulo que implementa galerías de fotos. He instalado Gallery Assist, Gallery Assist ImageCache, Gallery Assist Lightboxes. En este sitio web se explica con un screencast cómo instalar todo esto.
Una vez instalados todos los módulos deberemos activarlos (/admin/build/modules).
Proceso de configuración
Ya tenemos instalados, activados y en funcionamiento nuestros módulos. Ahora hay que crear el nuevo Content Type (/admin/content/types/). En mi caso, hay dos tipos de nodos que intervienen:
1) Nodo “ficha”, que contendrá como propios los campos: url, cuerpo, foto y como puntero (node reference) la galería de fotos en cuestión.
2) Nodo tipo “gallery” (contiene la galería de fotos en sí misma). Este Content Type se crea de forma automática al instalar Gallery Assist.
A la hora de crear el nodo “ficha”, los Custom Fields quedan asi (click para ampliar la imagen):
En Manage Fields vemos el campo url (Type: text, Name: field_url), el campo foto (Type: File, Name: field_foto) y el campo galleria_fotos (Type: Node reference, Name: field_noderefgalleryassist).
Cuando creé este último campo, tuve que elegir el widget usado durante la creación del nodo. Hay varias opciones para este campo. Yo marco ‘select list’. A continuación una pequeña explicación (en inglés) sobre qué diferencias hay entre cada opción:
Select list
if you don’t have too many nodes to choose from, this can be a great choice; the user can see all of her choices at once and make a decision on which node to reference;
Check boxes/radio buttons
if you need to refer to multiple nodes at once, checkboxes can help; and/or if the list of possibilities is even smaller than needed for a select list (5 to 9 at most), then radio buttons may be your choice;
Autocomplete
this widget works very similar to a freetagging taxonomy selector or the Authored by: field at the bottom of a node form; you start typing, and Drupal will display a list of node titles that match the text you entered; you often only need to type a few letters to find exactly what you need, however, this requires the user to have some idea of what she is looking for; you also have the option to choose whether to search inside the node’s titles, or only at the beginning;
También deberé seleccionar el “tipo de contenidos que pueden ser referenciados” (Content types that can be referenced) y elijo “gallery”. El menú que nos permite realizar esta selección es similar a:
En Display Fields del tipo de nodo “ficha” (admin/content/node-type/ficha/display), prestemos especial atención al Field galleria_fotos, en especial al parámetro Full node, que debe tener seleccionado Teaser. Esto hace que nuestra galería G1 se muestre completa en la “Ficha” F1 con la que guarda relación. Más información sobre esto en el manual de theming complex data drupal.
Creando nodos de ejemplo de tipo “ficha” y “gallery”
A continuación vamos a crear un nuevo nodo “Ficha” con una “gallery” asociada. Para ello primero creo la “gallery”, subo las fotos y guardo el nodo. Después creo una nueva “Ficha”, relleno los campos y selecciono de la lista de opciones la galería que deso enlazar a esta “ficha”.
Dándole estilo
Si habéis seguido los consejos hasta este punto, y no teneis customizada la plantilla de mostrar nodos, veréis algo asi:
Sí, sale, pero no como queremos. Por ello voy a crear dos plantillas personalizadas (custom templates) para mostrar los contenidos como yo deseo, una para la “ficha” y otra para la “gallery”.
* Plantilla para la galería: en /themes/garland/node-gallery_assist.tpl.php con el siguiente contenido:
1 2 3 4 5 6 | <?php // $Id: node.tpl.php,v 1.5 2007/10/11 09:51:29 goba Exp $ ?> <div class="content clear-block"> <?php print $content ?> </div> |
* Plantilla para la ficha: en /themes/garland/node-ficha.tpl.php con el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?php // $Id: node-ficha.tpl.php,v 1.0 2010/07/05 08:39:36 miguelm Exp $ ?> <?php if ($page == 0) { ?><h2 class="title"><a href="<?php print $node_url?>"><?php print $title?></a></h2><?php }; ?> <div id="maincontainer" style="margin-left: 50px;"> <br /> <!-- para poner algo en la zona superior <div id="topsection"> <div class="innertube"><h1>CSS Liquid Layout #2.1- (Fixed-Fluid)</h1></div> </div>--> <div id="contentwrapper" style="float: left; width: 100%;"> <div id="contentcolumn" style="margin-left: 200px; > <div class="innertube" style="margin:10px"> <?php /* para mostrar el cuerpo del nodo */ echo $node->content['body']['#value']; ?> </div> </div> </div> <div id="leftcolumn" style="float: left; width: 200px; margin-left: -100%; font-size:"> <div class="innertube"> <?php /* para mostrar la imagen del campo field_foto */echo theme('imagefield_image', $node->field_foto[0], "", "", array('width' => '200'), $getsize = FALSE); ?> <br /> <?php /* para mostrar la URL */ echo l(t('Visita la web de '.$title), $node->field_url[0]['safe'], array('class' => 'active'));?> </div> </div> </div> <?php echo $node->field_noderefgalleryassist[0]['view']; ?> |
Ahora, si recargamos el nodo de la Ficha, veremos que queda como nosotros queríamos:
Espero que os haya sido útil