Posted by Mr. NoNaMe on February 1, 2012 at 6:46pm
Hola a todos... estoy programando un módulo y no se que escribirle a hook_menu para que me haga lo siguiente, además que no se si se puede hacer... aqui les va el codigo de hook_menu().
<?php
/**
* Implements hook_menu().
*/
function efemerides_menu() {
$items['mimodulo/ver'] = array(
'title' => 'Ver mi modulo',
'page callback' => 'mimodulo_ver',
'access callback' => TRUE,
'access arguments' => array('ver mimodulo'),
'type' => MENU_NORMAL_ITEM,
'weight' => 20,
);
$items['mimodulo/importar'] = array(
'title' => 'Importar',
'page callback' => 'mimodulo_importar',
'page arguments' => array('ver'),
'access arguments' => array('ver mimodulo'),
'type' => MENU_LOCAL_TASK,
'file' => 'mimodulo.formulario.inc',
);
return $items;
}
?>el resultado que quiero es el siguiente, que el me cree una pantalla donde muestre varias acciones que se puedan hacer...
las acciones son:
-agregar manualmente
-importar
Por favor, las preguntas técnias tienen que ir al grupo Spanish,que es par eso, y si quieres a lo sumo al grupo local, spameando el resto de grupos no vas a conseguir más.
Oskar Calvo, admnistrador del grupo de Madrid.
| Attachment | Size |
|---|---|
| shot1.JPG | 22.92 KB |

Comments
Revisa esto:
Hola, espero haber entendido bien tu duda:
Suponiendo que ya definiste las funciones correspondientes: function menu_agregar() y function menu_importar()
Si lo que quieres es ver estas opciones (agregar manualmente, importar) entonces, tienes que hacer las siguientes modificaciones:
<?php
/**
* Implements hook_menu().
*/
function efemerides_menu() {
$items['mimodulo/agregar'] = array(
'title' => 'agregar manualmente',
'page callback' => 'menu_agregar',
'access callback' => TRUE,
//'access arguments' => array('ver mimodulo'),
'type' => MENU_NORMAL_ITEM,
'weight' => 20,
);
$items['mimodulo/importar'] = array(
'title' => 'Importar',
'page callback' => 'menu_importar',
'access callback' => TRUE,
//'page arguments' => array('ver'),
//'access arguments' => array('ver mimodulo'),
'type' => MENU_NORMAL_ITEM,
'file' => 'mimodulo.formulario.inc',
);
return $items;
}
?>
algo que tambien debes tener en cuenta los parámetros que se puede utilizar en el array items, cuando crear menus:
'type': Determina el tipo de elemento, según los siguientes valores:
MENU_NORMAL_ITEM. Se trata del valor por defecto. Además de la página indicada se creará un elemento de menú.
En este link, encontraras más información:
http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hoo...
espero te sea de ayuda.
Saludos
Listo
me salieron los dos enlaces en el menu, eso es casi lo que quiero, realmente lo que quiero es que el menu me quede asi
-mi modulo (este sea una página que me visualice contenido)
+--agregar (este un formulario que agregue)
+--importar (este un formulario que importe)
Si queres tener local tasks
Si queres tener local tasks tenes que definir mimodulo como MENU_NORMAL_ITEM y mimodulo/ver como MENU_DEFAULT_LOCAL_TASK y mimodulo/importar como MENU_LOCAL_TASK
--
Lucas S. Caro
Menú listo!!
ya el menu está listo, aqui esta el código...
<?phpfunction efemerides_menu() {
$items = array();
$items['efemerides'] = array(
'title' => 'Fechas',
'page callback' => 'efemerides',
'access callback' => TRUE,
'access arguments' => 'administrar efemerides',
'type' => MENU_NORMAL_ITEM,
'weight' => 19,
'file' => 'efemerides.formulario.inc',
);
$items['efemerides/listado'] = array(
'title' => 'Fechas',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 0,
);
$items['efemerides/agregar'] = array(
'title' => 'Agregar',
'page callback' => 'efemerides_agregar',
'access callback' => TRUE,
'access arguments' => 'administrar efemerides',
'type' => MENU_LOCAL_TASK,
'weight' => 1,
'file' => 'efemerides.formulario.inc',
);
$items['efemerides/importar'] = array(
'title' => 'Importar',
'page callback' => 'efemerides_importar',
'access callback' => TRUE,
'access arguments' => 'administrar efemerides',
'type' => MENU_LOCAL_TASK,
'weight' => 2,
'file' => 'efemerides.formulario.inc',
);
return $items;
}
?>
arriba en el artículo les dejo el screenshot del resultado.
Otro problema
ahora todo sale bien, lo que pasa es que los 2 formularios que tengo en ninguno de los dos el boton submit no funciona, es decir, cuando se le da clic al boton no pasa nada. aqui les dejo el codigo de los formularios
<?php//formulario agregar
function efemerides_agregar() {
$form['fecha_inicio'] = array('#type' => 'textfield',
'#title' => t('Fecha de comienzo'),
'#size' => 10,
'#description' => t('Formato de fecha <em>"dd/mm/YYYY"</em>.'),
);
$form['fecha_final'] = array('#type' => 'textfield',
'#title' => t('Fecha de culminación'),
'#size' => 10,
'#description' => t('Se puede dejar en blanco, el formato de fecha es <em>"dd/mm/YYYY"</em>.'),
);
$form['efemeride'] = array('#type' => 'textfield',
'#title' => t('Evento'),
'#size' => 60,
);
$form['submit'] = array('#type' => 'submit',
'#value' => t('Salvar'),
);
$form['clear'] = array('#type' => 'clear',
'#value' => t('Borrar'),
);
return $form;
}
?>
<?
//formulario importar
function efemerides_importar() {
$form['importar'] = array('#type' => 'fieldset',
'#title' => t('Importar efemérides'),
);
$form['importar']['formateador'] = array('#type' => 'textfield',
'#title' => t('Formateador'),
'#size' => 10,
'#description' => t('Formateador que se utiliza para separar las cadenas, ejempo: "/" ó ","'),
);
$form['importar']['file'] = array('#type' => 'file',
'#title' => t('Archivo'),
'#size' => 50,
'#description' => t('Archivo que contiene las efemérides (.fechas)'),
);
$form['importar']['submit'] = array('#type' => 'submit',
'#value' => t('Importar'),
);
return $form;
}
?>
Deberias usar como 'page
Deberias usar como 'page callback' => 'drupal_get_form' y luego en 'page arguments' => array('efemerides_agregar') por ejemplo.
entonces en la funcion devolves $form y te hace un form que funciona.
Alguna razon en especial por la cual no estas usando nodos y cck?
Si usas drupal_get_form tambien te falta la funcion efemerides_agregar_submit() que es la que haria el procesamiento del formulario.
De todas formas te aconsejo que leas algo sobre programacion para drupal como el pro drupal development (que es genial) antes de meterte a hacer estas cosas, porque es complicado agarrarlas sin una base, sobre todo sobre como funcionan los formularios, hook_menu, etc.
Si lo que queres es un listado de efemerides, te conviene hacer un content type y definir los campos (en drupal 6 con cck). Asi tenes toda la funcionalidad para crear ya hecha.
Para importar podes usar alguno de los varios modulos para importacion de nodos, que te recomiendo que investigues para ver cual se adapta más a tu necesidad.
Saludos
--
Lucas S. Caro
Pro development
Yo tengo la 3ra edicion que es de diciembre del 2010, no se si habra salido alguna nueva, de todas formas me apoyo mucho en el aunque hay cosas que salen en el que he probado y no me han trabajado, esencialmente esto de los menus, tambien tengo el module development, dime otros libros que me puedan ayudar con el tema de la programacion de los modulos para drupal... por cierto yo uso drupal 7. gracias por tu ayuda. Lo ultimo, se que con un content type y views resuelvo, pero el problema es que quiero emepzar a aprender como se programan los modulos de drupal ya que voy a tener que desarrollar otros de mayor complejidad en un futuro no muy lejano para agregarle funcionalidades personalizadas al cms acordes a mis necesidades.
saludos
En el pro development hay un
En el pro development hay un muy buen ejemplo de como crear un modulo desde cero. En el capitulo 2 te lleva de la mano y te explica todo el proceso, y el capitulo 11 te aclara el form api, que es lo que necesitas para hacer forms, validarlas y procesarlas. Basicamente es hacer funciones que se llamen como tu form_id y agregarle _validate o _submit (en tu caso efemerides_agregar_validate y efemerides_agregar_submit).
La clave que te falta es usar como callback drupal_get_form y no directamente la funcion que crea el form, como vos tenes. En mi version del libro, en la pagina 247 hay un ejemplo exactamente de eso. Se que es largo, pero te recomiendo leerlo una vez, siguiendo todos los ejemplos y despues releerlo completo para fijar ideas. Luego de eso cualquier tarea en drupal deberia ser facil.
--
Lucas S. Caro
socio dime algun correo al
socio dime algun correo al que te pueda escribir porque eso ahora me esta dando otro problemita, al parecer sencillo, pero no he dado aun con la solución
Si no te molesta, lo sigamos
Si no te molesta, lo sigamos por el grupo asi otra gente puede beneficiarse de las repuestas. Igual me llegan por mail a mi y a todos los subscriptos, asi que te conviene. Si no podes hacer click en mi nombre y usar mi form de contacto.
--
Lucas S. Caro
bueno aqui está lo último que
bueno aqui está lo último que hasta ahora me ha pasado, ya crea el menú como quiero, lo que pasa es lo siguiente, cuando pincho cualquiera de las otras pestañas (agregar o importar) en el título de la pagina lo que me sale el Home, no Fechas como yo deseo. que podrá ser eso.
crei que es asi por diseño, y
crei que es asi por diseño, y si queres cambiar el titulo, siempre podes usar drupal_set_title en el callback de tu form.
--
Lucas S. Caro
aqui va de nuevo todo el
aqui va de nuevo todo el código de hook_menu a ver si le detectas algún error y entonces yo poder aprender
<?phpfunction efemerides_menu() {
$items = array();
$items['efemerides'] = array(
'title' => 'Fechas',
'page callback' => 'efemerides',
'access callback' => TRUE,
'file' => 'efemerides.formulario.inc',
'type' => MENU_NORMAL_ITEM,
);
$items['efemerides/listado'] = array(
'title' => 'Fechas',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 0,
);
$items['efemerides/agregar'] = array(
'title' => 'Agregar',
'title callback' => t('Agregar'),
'page callback' => 'drupal_get_form',
'page arguments' => array('efemerides_agregar'),
'access callback' => TRUE,
'access arguments' => 'administrar efemerides',
'type' => MENU_LOCAL_TASK,
'weight' => 10,
'file' => 'efemerides.formulario.inc',
);
$items['efemerides/importar'] = array(
'title' => 'Importar',
'title callback' => t('Importar'),
'page callback' => 'drupal_get_form',
'page arguments' => array('efemerides_importar'),
'access callback' => TRUE,
'access arguments' => 'administrar efemerides',
'type' => MENU_LOCAL_TASK,
'weight' => 20,
'file' => 'efemerides.formulario.inc',
);
return $items;
}
?>
le agregue alguna que otra cosita, pero así está trabajando...
parece bien. si el unico
parece bien. si el unico problema es el titulo, usa drupal_set_title en efemerides_agregar y efemerides_importar...
--
Lucas S. Caro
el titulo que te menciono es
el titulo que te menciono es el de la página como tal
[titulo de la pagina]
[titulo_tab_1][titulo_tab_2][titulo_tab_3]
el titulo que te menciono es [titulo de la pagina], cuando tu pinchas fechas en el menu el entra directo al primer tab, el titulo que coge la pagina es Fechas, ahora cuando pincho el tab agregar o importar el me cambia fechas por inicio hasta que vuelva a pinchar el primer tab
creo que eso es un bug
creo que eso es un bug conocido. probaste usando drupal_set_title("Titulo del tab 2") en la funcion que genera el form del tab 2?
--
Lucas S. Caro
Listo y mas que listo, super,
Listo y mas que listo, super, ya resolvi ese problemon, gracias mano, sin ti no que me hubiera hecho, ahora puedo seguir adelante con la validación de mis formularios, de todas formas tu como se trabaja la fecha en timestamp?? es decir como se lleva la a timestamp y después como se comvierte de timestamp al formato anterior. el formato que va a tener la fecha es el siguiente d/m/Y.
Listo y mas que listo, super,
Listo y mas que listo, super, ya resolvi ese problemon, gracias mano, sin ti no que me hubiera hecho, ahora puedo seguir adelante con la validación de mis formularios, de todas formas tu como se trabaja la fecha en timestamp?? es decir como se lleva la a timestamp y después como se comvierte de timestamp al formato anterior. el formato que va a tener la fecha es el siguiente d/m/Y.
de nada. me alegro que te
de nada. me alegro que te haya servido la ayuda.
Para transformar timestamps usa las funciones de php date y strtotime
http://php.net/manual/en/function.date.php
http://www.php.net/manual/es/function.strtotime.php
--
Lucas S. Caro
ok, si yo tengo un string y
ok, si yo tengo un string y quiero saber saber si ese string cumple con este formato 00/00/0000 (es decir 2 valores, un /, 2 valores mas, otro / y despues 4 valores) como puedo implementarlo en PHP
eso me parece que ya excede
eso me parece que ya excede el objetivo de este grupo, que es ayudar con preguntas puntuales de drupal. Hay muchos sitios online donde se puede aprender a programar en php...
--
Lucas S. Caro
Hola, lucascaro, tiene mucha
Hola, lucascaro, tiene mucha razon en eso, esa pregunta es mas orientada a un grupo de PHP, pero aqui te dejo algo:
si quieres hacer una validación de una cadena puedes utilizar expresiones regulares, la funcion a utilizar en PHP, preg_match, aqui te dejo el link
http://php.net/manual/en/function.preg-match.php
y el patron basico en si, seria : /^[0-3][0-9]\/[0-1][0-2]\/[1-2][0-9][0-9][0-9]/
aqui les dejo este código a
aqui les dejo este código a ver si estedes dan con el porque me da el siguiente error.
PDOException: en archivo_importar_efemeride() (línea 122 de C:\wamp\www\final\sites\all\modules\efemerides\efemerides.formulario.inc).
<?php
function archivo_importar_efemeride($archivo) {
$fd = fopen($archivo->uri, 'rb');
if (!$fd) {
drupal_set_message('El archivo no ha podido ser importado', 'error');
return FALSE;
} else {
$insert = db_insert('efemerides')->fields(array('efemerides','fecha_inicio'));
while (!feof($fd)) {
$linea = fgets($fd,999999);
//Compruebo que el archivo no está en blanco
if ($linea != '') {
list($fecha, $efemeride) = explode("/", $linea);
$ffecha = fecha_formato_ingresar($fecha);
$values[] = array(
'efemerides' => $efemeride,
'fecha_inicio' => $ffecha,
);
} else {
return FALSE;
}
}
foreach ($values as $value) {
$insert->values($value);
}
$insert->execute();
}
}
?>
el error apunta a esta linea $insert->execute();
Por cierto debo decirle que como no se trabajar con fecha en timestamp trabajo la fecha en ingles, asi que el campo de la base de datos es de tipo DATE
corrección, el campo
corrección, el campo fecha_inicio de la tabla ahora es de tipo integer, y lo que voy a guardar en el es un número e igual me da el mismo error cada vez que la consulta se ejecuta