Creación de formularios

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
grone2013's picture

Saludos compañeros del grupo y de atemano gracias por la ayuda prestada.

Se como insertar con el api forms un formulario en una página en Drupal 7. Quiero saber como puedo insertar varios formularios con el api forms en drupal.

Gracias

Comments

Bloques, o página propia...

juankvillegas's picture

Se me ocurren 2 formas de hacerlo:

  1. Sería generando cada formulario en un bloque (ver hook_block_info y hook_block_view). Así puede generar tantos bloques como quiera y después los puede agregar a la página que necesite.

  2. Generar una página propia con hook_menu. Ahí usted controla todo el contenido de la página y puede agregar tantos formularios como quiera.

Varios formularios

grone2013's picture

Saludos Juan.

En la segunda opción que comentas pongo el siguiente ejemplo:

function MyModulo_menu(){

$items = array();

 $items['admin/config/people/config_event/activities/%/update'] = array(
    'title' => t('update'),
    'type' => MENU_CALLBACK,
    'page callback' => 'drupal_get_form',
    'page arguments' => array('stageUpdateOperation', 5),
    'access callback' => TRUE,
    'file' => 'events_page.admin.inc',
);

return $items;

}

La función que genera el formulario es drupal_get_form del api de Drupal y paso en en la clave 'page arguments' dos argumentos que son el identificador del formulario(stageUpdateOperation) y 5 como la posición del argumento en la url.

la función stageUpdateOperation me construye el formulario, ejemplo:

function stageUpdateOperation($form, $form_state, $value){

$form = array();

 ....................
 ....................
 ......................

 return $form;

}

Ahí es donde tengo el problema. No se como añadir varios formularios en esta función.

Gracias por la ayuda y el interés.

¿Varios formularios?

jncruces's picture

No puedes agregar varios formularios con una sola función de formulario, a menos que los crees como bloques.

Bueno miento, si podrías crear varios formularios dentro de una sola función, generando un solo array $form y creando varios input de tipo "submit" con distintos callbacks de submit y sus propias validaciones .... etc... sin embargo: ¿te vale la pena dicha complejidad? ¿No es más fácil crear una página en blanco y varios bloques cada uno con un formulario?

Edito:
Releyendo el mensaje de juankvillegas pues tiene razón, si creas un hook_menu con un item y en el callback de ese item devuelves varios formularios....

function hook_menu() {
$items = array();

$items['admin/config/people/config_event/activities/%/update'] = array(
    'title' => t('update'),
    'type' => MENU_CALLBACK,
    'page callback' => '_mymodule_page_callback',
    'page arguments' => array(5),
    'access callback' => TRUE,
    'file' => 'events_page.admin.inc',
);

return $items;
}

function _mymodule_page_callback($elem5) {
return drupal_render(drupal_get_form('myform1', $elem5)) . drupal_render(drupal_get_form('myform2', $elem5)) . drupal_render(drupal_get_form('myform3', $elem5));
}

function myform1($form, &$form_state, $elem5) {
...
}

function myform1_validate(...
function myform1_submit(...

function myform2($form, &$form_state, $elem5) {
...
}

function myform2_validate(...
function myform2_submit(...

function myform3($form, &$form_state, $elem5) {
...
}

function myform3_validate(...
function myform3_submit(...

Saludos.

Varios formularios

grone2013's picture

La idea planteada es generar varios formularios, cada función de formulario sirve como identificador y los renderizo en una page callback con ruta definida.

Gracias, lo voy a probar.

Eso es correcto...

juankvillegas's picture

Yo reescribiría la función function _mymodule_page_callback($elem5) asi:

<?php
function _mymodule_page_callback($elem5) {
 
$build['myform1'] = drupal_get_form('myform1', $elem5);
 
$build['myform2'] = drupal_get_form('myform2', $elem5);
 
$build['myform3'] = drupal_get_form('myform3', $elem5);

  return
$build;
}
?>

Pero ya es cuestión de cómo cada uno escribe su código.

De hecho si quisiera tener cada formulario dentro de un div especial para ayudar con los estilos puede hacer algo como:

<?php
function _mymodule_page_callback($elem5) {
 
$build['myform1_wrapper'] = array(
   
'#type' => 'container',
   
'#attributes' => array(
     
'class' => array(
       
'formulario1',
      ),
    ),
  );
 
$build['myform1_wrapper']['myform1'] = drupal_get_form('myform1', $elem5);

 
$build['myform2_wrapper'] = array(
   
'#type' => 'container',
   
'#attributes' => array(
     
'class' => array(
       
'formulario2',
      ),
    ),
  );
 
$build['myform2_wrapper']['myform2'] = drupal_get_form('myform2', $elem5);

 
$build['myform3_wrapper'] = array(
   
'#type' => 'container',
   
'#attributes' => array(
     
'class' => array(
       
'formulario3',
      ),
    ),
  );
 
$build['myform3_wrapper']['myform3'] = drupal_get_form('myform3', $elem5);

  return
$build;
}
?>

Lo correcto

jncruces's picture

Tienes toda la razón, esa forma es mucho más correcta que la propuesta anteriormente por mí, aunque en mi defensa he de decir que fué un borrador muyyyyy a groso modo :D

Saludos y gracias por tu grandiosa corrección.

Vamos por partes

hatuhay's picture

Primero debes generar los formularios.
Eso lo haces con tu función que retorna $form.
Luego deben renderizar los formularios.
Eso lo puedes hacer de muchas formas.
Finalmente y esa es la parte dificil, cada formulario debe tener un ID independiente.
De mi amigo Google: http://drupal.stackexchange.com/questions/6202/multiple-forms-on-single-...

Latin America

Group categories

Latin America

Group notifications

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