creando módulo para hacerme con la API

Events happening in the community are now at Drupal community events on www.drupal.org.
r0ber's picture

Hola , gente, como un niño bueno estoy siguiedo paso a paso los ejercicios de un libro de Drupal 6 (forcontu) que explica como empezar a desarrollar módulos, pero me he quedado atascado en un punto.

Resulta que he creado un hook node_expiration_date_menu que a su vez llama a esta función node_expiration_date_admin_settings (en archivo externo) para listar todos los tipos de contenidos y poder marcar los que deseo que tengan fecha de caducidad.

Pego aquí el código mejor:

/**
* Implementation of hook_menu()
*/
function node_expiration_date_menu() {
$items['admin/settings/node_expiration_date'] = array(
'title' => 'Node Expiration Dates Settings',
'description' => 'Settings for module Node expiration date',
'page callback' => 'drupal_get_form',
'page arguments' => array('node_expiration_date_admin_settings'),
'access arguments' => array('administer site configuration'),
'type' => MENU_NORMAL_ITEM,
'file' => 'node_expiration_date.admin.inc',
);
return $items;

}

que llama a esta otra en archivo externo node_expiration_date.admin.inc

/**
* Constructor del formulario para configurar el módulo
*/
function node_expiration_date_admin_settings() {

/**
* Obtiene un vector de tipo de cotenido con la siguiente estructura
* array('page' = 'Page', 'story' => 'Story')
*/

$content_types_list=node_get_types('names');

$form['node_expiration_date_node_types'] = array(
'#type' => 'checkboxes',
'#title' => t('Add an expiration date to these content types'),
'#options' => $content_types_list,
'#defult_value' => variable_get('node_expiration_date_node_types',array('page')),
'#description' => t('The selected content types will have an expiration date.'),
);
return system_settings_form($form);
}

La cuestión es que se listan pefectamente los distintos tipos de contenido pero page no sale marcado por defecto; además de eso he revisado la tabla "variable" y allí hay una nueva tabla llamada: node_expiration_date_node_types que entiendo que los datos que guarda en el campo value es lo que se marca desde admin/settings/node_expiration_date ; pero por muchos tipos de contenidos que marque , siempre vuelven a aparecer desmarcados; y el conetido que se guarda en esta tabla (node_expiration_date_node_types) es compliado de entender:
a:4:{s:5:"story";s:5:"story";s:4:"page";s:4:"page";s:4:"blog";i:0;s:4:"book";i:0;}
el a: 4 entieno que se refiere a un array con 4 elementos (aunque hay 7 pero bueno)
es:5:"story" supongo que será "string" con 5 caracteres tipo "story" , y lo que no consigo interpretar de ningún modo es "i:0" ¿que es esto?.

Por más que busco no encuentro donde se explica esto.

Mil gracias.

Comments

develcuy's picture

@dontysk, fijate en esto:

$form['node_expiration_date_node_types'] = array(
  '#type' => 'checkboxes',
  '#title' => t('Add an expiration date to these content types'),
  '#options' => $content_types_list,
  '#defult_value' => variable_get('node_expiration_date_node_types',array('page')), // <<== AQUI
  '#description' => t('The selected content types will have an expiration date.'),
);

Donde dice: "#defult_value" debería decir: "#default_value".

La explicación es un poco larga, pero ahí vamos:

  1. En el hook_menu has definido un callback. Es decir, que cuando entras a la ruta "admin/settings/node_expiration_date", drupal llama a la función drupal_get_form y le pasa como parámetro: "node_expiration_date_admin_settings"
  2. La función drupal_get_form se encarga de renderizar formularios. Y entonces lo que necesita esa función es el nombre de otra función, y dicha función debe retornar un array.
  3. Entonces tenemos la función node_expiration_date_admin_settings, y es justamente la que has declarado en tu código, esta función esta retornando un array que es en concreto la definición de un formulario.
  4. Pero notamos un pequeño detalle: return system_settings_form($form), resulta que la función system_settings_form es un facilitador para crear formularios de configuración. Dicha función recibe la definición de un formulario y transforma cada campo en una variable de sistema en Drupal.
  5. Drupal tienen las funciones variable_get, variable_set y variable_del para gestionar la tabla "variable", esta se encarga de guardar datos de forma serializada.
  6. (off-topic) La función serialize sirve para transformar los valores de las variables de PHP en cadenas de texto, que luego pueden ser de-serializadas. Veamos unos ejemplos: serialize("texto") retorna: s:5:"texto";, serialize(3) retorna: i:3; y finalmente un array: serialize(array("a",4)) retorna: a:2:{s:1:"a";i:4;}. Si quieres entender más de la función hay una implementación relativamente fácil de entender en el código fuente de Nutria Seawolf.
  7. Los formularios en drupal tienen un callback "submit" que es llamado justamente cuando haces click en algún botón de envío del formulario. La función system_settings_form inserta un callback "submit" genérico, que procesa los datos enviados y guarda los valores correspondientes en la tabla "variable", tu solamente debes preocuparte de mantener siempre el mismo nombre de variable.
  8. Justamente vemos en variable_get('node_expiration_date_node_types', array('page')), que estas leyendo el valor de la variable de sistema "node_expiration_date_node_types", y estas además indicando que si no existe la variable, que retorne array('page'). Lo que significa que por defecto estará seleccinado el tipo de contenido "page".
  9. Además dicha función crea los botones: "Save configuration" y "Reset to defaults", que son los correspondientes a las funciones variable_set y variable_del. Puedes tener varios campos y se crean las variables de sistema correspondientes.

Una vez que tu código esté corregido podrás comprobar lo que te acabo de explicar.

--
Fernando @DevElCuy

guau explicación genial ¡¡

r0ber's picture

Gracias compañero ,no habia caído en la "a" de "value" , las demás explicaciones me aclaran muchas cosas.
Gracias y un saludo

Spanish

Group organizers

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week