Posted by oskar_calvo on July 12, 2012 at 11:14am
Buenas la cosa.
Tengo el módulo migrar, que tiene un hook menu (migrar) que me lleva a una página que explica los pasos de la migración.
Tengo otro módulo llamado categorias, que tiene un hook menu (migrar/categorias), que me lleva a un form.
Por algún motivo el formulario de migrar/categorias no se ejecuta validate y/o submit, en cuanto le cambio la ruta del hook menu a otra (por ejemplo categorias) se ejecuta todo correctamente..
No se si me he explicado correctamente, y no se porque %$·%·"$% ocurre esto.
module a
<?php
/<strong>
* Implementation hook_menu
*/
function profesnet_menu() {
$items = array();
$items['profesnet'] = array(
'title' => 'Profesnet migration',
'page callback' => '_profesnet_start_migration',
'access callback' => 'user_access',
'access arguments' => array('migrate_profesnet'),
'type' => MENU_NORMAL_ITEM,
'file' => 'profesnet.module', // don't forget to add the file and path
'file path' => drupal_get_path('profesnet', 'profesnet.module'),
//'menu' => 'profestnet-migration',
'weight' => 0,
);
return $items;
}
/</strong>
* Function start migration
* description: una página con la explicación y los enlaces para lanzar los diferentes procesos de migracion
*/
function _profesnet_start_migration() {
$output = t('Esta es la página de reparto de cartas');
$limit = 10;
db_set_active('dbo');
$options['target'] = 'dbo';
$contar = db_select('categoria','c',$options)
->fields('c',array('ID_CATEGORIA'))
//->range($range,$limit)
->execute();
$cantidad = $contar->rowCount();
$output .= '<p>Cantidad ' . $cantidad . '<p>';
db_set_active('default');
$iteracion = round($cantidad/$limit,0,PHP_ROUND_HALF_UP);
//dpm($iteracion);
for($i = 0; $i < $limit; $i++) {
$rango = ($iteracion * $i) + $i;
//dpm($rango);
db_set_active('dbo');
$result = db_select('categoria','c')
->fields('c',array('ID_CATEGORIA','NOMBRE','ID_PADRE'))
->orderBy('c.ID_CATEGORIA','ASC')
->range($rango,$iteracion)
->execute();
db_set_active('default');
$a = 0;
// dpm($result);
foreach ($result as $row){
// dpm($i . ' ' . $a);
$a++;
}
}
//db_set_active('default'); // We need to call the main (drupal) db back
return $output;
}
?>segundo código
<?php
/<strong>
* Implements hook_menu
*/
function categorias_menu() {
$items = array();
$items['profesnet/categorias'] = array(
'title' => 'Migrate categories',
'page callback' => 'drupal_get_form',
'page arguments' => array('_categorias_migrate_elements'),
'access callback' => TRUE, //'user_access',
//'access arguments' => array('migrate_categories'),
'type' => MENU_LOCAL_TASK,
'file' => 'categorias.module',
'file path' => drupal_get_path('categorias', 'categorias.module'),
//'menu_name' => 'profestnet-migration',
'weight' => 1,
);
return $items;
}
/</strong>
*
*/
function _categorias_migrate_elements($form, &$form_state = array()) {
$form = array();
$form['texto'] = array(
'#type' => 'markup',
'#markup' => '<p>Este es el texto de aviso para el proceso del formulario</p>',
);
$form['opcion'] = array(
'#type' => 'radios',
'#title' => t('Vas ha migrar las categorias.'),
'#options' => array(0 => 'Migrar hijos'),
'#default_value' => 0,
'#required' => TRUE,
);
$form['boton'] = array(
'#type' => 'submit',
'#value' => 'Go'
);
return $form;
}
/**
*
*/
function _categorias_migrate_elements_submit($form, $form_state) {
// no se ejecuta este dpm.
dpm($form_state);
}
?>
Comments
¿Conflicto?
Si decalras un hook menu en la ruta ejemplo todas las subrutas responderán con el callback que definas.
Es decir, que ejemplo/foo, ejemplo/foo/bar y ejemplo/bar responderían todas con el callback que hayas definido para ejemplo.
Sin embargo, si has definido ejemplo y ejemplo/foo, entonces debería al acceder a ejemplo/foo debería responder el callback correcto. Esto funciona correctamente AL MENOS cuando se definen ambos callbacks en el mismo módulo. Quizá tu problema sea que lo has definido en diferentes módulos y eso afecta. Prueba a meter ambos en el mismo módulo, aunque solo sea para hacer la prueba.
Otra cosas que puedes hacer es usar menu_get_item con las dos rutas a ver si ves algo interesante.
Tunic. Pues debe ser, porque
Tunic.
Pues debe ser, porque lo que he hecho ha sido moverlo todo a tabs, y dentro de admin, y la cosa ni gruñe, ni da problemas.
Será algo a tener en cuenta y mirar para el futuro y evitar disgustos y horas mirando porque algo no funciona.
Oskar