Problemas con hook_menu

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

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.

AttachmentSize
shot1.JPG22.92 KB

Comments

Revisa esto:

langelhc's picture

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

Mr. NoNaMe's picture

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

lucascaro's picture

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!!

Mr. NoNaMe's picture

ya el menu está listo, aqui esta el código...

<?php
function 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

Mr. NoNaMe's picture

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&oacute;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

lucascaro's picture

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

Mr. NoNaMe's picture

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

lucascaro's picture

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

Mr. NoNaMe's picture

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

lucascaro's picture

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

Mr. NoNaMe's picture

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

lucascaro's picture

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

Mr. NoNaMe's picture

aqui va de nuevo todo el código de hook_menu a ver si le detectas algún error y entonces yo poder aprender

<?php
function 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

lucascaro's picture

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

Mr. NoNaMe's picture

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

lucascaro's picture

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,

Mr. NoNaMe's picture

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,

Mr. NoNaMe's picture

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

lucascaro's picture

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

Mr. NoNaMe's picture

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

lucascaro's picture

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

langelhc's picture

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

Mr. NoNaMe's picture

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

Mr. NoNaMe's picture

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

Argentina

Group organizers

Group notifications

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