martes, 15 de diciembre de 2009

Editar la presentación del formulario de crear y editar contenidos en Drupal

Primero agradecer a muchos blog en internet donde encontré partes de la solución a mi problema, sobre todo me fué muy util http://morthylla.blogspot.com/2008/10/personalizar-o-cambiar-un-formulario.html y por supuesto el sitio de Drupal, especialmente en http://drupal.org/node/101092#comment-874839.

¿Cómo personalizar un formulario de edición y creación de tipos de contenidos?, es algo que muchas veces nos hace falta, sobre todo por cuestiones de estética. Una forma sencilla de hacerlo es mediante el uso de css, con esto se pueden ocultar algunos elementos usando el display:none, o poner la etiqueta del componete en frente del mismo y no sobre, cambiar colores y algunas otras cositas. Por eso lo primero que debe hacer es valorar hasta donde llega el cambio que se desea para resolverlo lo mas simple posible.

Puede ser que lo que se quiera hacer sea mas complicado, implique por ejemplo una validación, un cambio de posición de elementos del formulario, que se vean de una forma u otra según el usuario, que tomen tal o mas cual valor por defecto y muchas otras cosas que se pueden mencionar.

Bueno, en resumen, valore lo que puede hacer con css y lo que puede hacer con CCK antes de entrar a esto. Ya vió que no alcanza, entonces:

1- Agregar en el fichero template.php del tema en uso (si no está usando ningún fichero template.php en su tema, le recomiendo que vaya a otro tema, garlan por ejemplo, lo copie y lo pegue en el suyo) las siguientes funciones:


function NOMBREDELTEMA_theme(){
return array(
'tipodecontenido_node_form' => array(
'arguments' => array('form' => NULL),
'template' => 'tipodecontenido-node-form',
),
);
}

// En esta primera función se define dentro del tema cual es el fichero que va a formatear la vista de crear y editar el tipo de contenido "tipodecontenido".


function NOMBREDELTEMA_preprocess_tipodecontenido_node_form(&$vars) {
$vars['variable1'] = drupal_render($vars['form']['title']);
$vars['variable2'] = drupal_render($vars['form']['field_ingredients']);
$vars['variable3'] = drupal_render($vars['form']['field_directions']);
$vars['variable4'] = drupal_render($vars['form']['taxonomy']);
$vars['variable5'] = drupal_render($vars['form']);
}
?>

// es esta función se asigna a variable1, variable2,.............. los valores de los distintos campos y elementos del tipo de contenido "tipodecontenido"

Ahora en el fichero tipodecontenido-node-form.tpl.php puedo manejar las variables variable1, variable2,.....


print $variable1;
print $variable2;
print $variable3;
print $variable4;
print $varaible5;


como podrá apreciar aquí puede hacer cualquier cosa, simplemente cuenta con los campos y elementos para usarlos como desee.

Un consejo, asigne un $vars['variable6']=$vars y luego en el tpl.php imprima print_r($variable6) y ahí podrá ver a cuantas cosas puede acceder.

viernes, 11 de diciembre de 2009

Quitar el título a un tipo de contenido en Drupal 6.x

A veces el campo título nos resulta engorroso, sobre todo cuando vamos a tener un sitio para gestión de datos, donde hay muchas relaciones y donde no es un sitio de noticias propiamente.

El campo título es obligatorio dentro del core de drupal, lo primero para hacer que el título no sea obligatorio es modificar el módulo node (node.module). Ir al módulo node y buscar la función:

function node_content_form($node, $form_state) {
$type = node_get_types('type', $node);
$form = array();

if ($type->has_title) {
$form['title'] = array(
'#type' => 'textfield',
'#title' => check_plain($type->title_label),
'#required' => TRUE,
'#default_value' => $node->title,
'#maxlength' => 255,
'#weight' => -5,
);
}

if ($type->has_body) {
$form['body_field'] = node_body_field($node, $type->body_label, $type->min_word_count);
}

return $form;
}

aquí lo único que debe hacer es cambiar el valor TRUE de la propiedad #required por FALSE. Con esto resolvemos que en los nodos no sea requerido el campo título.

Hasta aquí todo sencillo, ahora, cuando necesito crear un nuevo tipo de contenido lo primero es que tendré que definir las etiquetas para el campo Title y Body, en el caso de Body si dejamos el textbox en blanco, pues se elimina ese campo del formulario, pero como eliminar el campo título, no podemos borrar la etiqueta Title y ya, pues es requerido ese valor. Una opción es tomar nuestro primer campo del nuevo tipo de contenido y usarlo como título, pero esto nos trae algunos inconvenientes, que son salvables, pero para el que desee quitarse el título, aquí va.

Haremos algo similar a lo anterior, lo que ahora en el fichero content_type.inc, que se encuentra dentro de la carpeta del módulo node. En este fichero buscar la función node_type_form, el fragmento de códico:

$form['submission']['title_label'] = array(
'#title' => t('Title field label'),
'#type' => 'textfield',
'#default_value' => $type->title_label,
'#required' => TRUE,
);

y al igual que en el caso anterior, cambiar el valor de #require de TRUE a FALSE. Con esto ya podrémos crear nuevos tipos de contenidos sin el campo título.

El problema existe si su sitio va a contar con muchos contenidos relacionados y hará uso de los campos tipo node_reference, puesto que estos lo que muestran para referenciar es el campo title (aunque se referencia por el campo nid), luego como el título está en blanco en la base de datos, el listbox no mostrará nada.

Una forma para resolver esto es incluir el módulo View y el módulo node refrence view. Luego:

1-Hacer una vista que seleccione el campo deseado del node tipo que deseo para hacer la referencia ( Ej: seleccionar el campo nombre del tipo de contenido persona ).

2- Al crear con el CCK el campo tipo node_reference en la configuración, en la sección Advanced - Nodes that can be referenced (View), en View used to select the nodes: escoger la vista creada.

Con esto queda resuelto que lo que me muestre a la hora de crear el contenido no sea la lista de títulos de los nodos tipos "X", sino el resultado de la vista.

El problema que persiste es el de la presentación. Eso se resuelve creando un fichero en el tema con el nombre node-content-dato.tpl.php donde "dato" es el nombre del tipo de contenido en cuestión. O manejando la presentación con módulo content template (comtemplate).

Con todo esto se resuelve el problema, temporalmente.

MEJORES OPCIONES

1- Usar el módulo node reference explorer, que necesita del módulo jquery_UI, que a su vez necesita de la extención jquery_ui 1.6, pero que no se puede descargar de google code por ser cubanos.

2- Esperar a que me de por implementar un módulo que haga esto (eso puede demorar meses, hasta que esté de ánimo y aprenda cosas que no se, mejor se lo piden a la comunidad de drupal que es más áctiva).