Formulaire dans un bloc


14

J'utilise drupal_get_form('event_signup_form')pour intégrer mon formulaire personnalisé dans un bloc. Le formulaire est rendu comme prévu, mais l'envoi du formulaire ne déclenche rien.

La fonction de formulaire elle-même est appelée event_signup_form($form, &$form_state)et la fonction de soumission est appelée event_signup_form_submit($form, &$form_state)mais elle n'est pas appelée.

J'utilise hook_block_view pour afficher le formulaire:

function event_block_view($delta = '') {
$blocks = array();
if ($delta ...) {
$blocks['content'] = drupal_render(drupal_get_form('event_signup_form'));
}
}

J'ai réussi à faire fonctionner cela - voici comment (talon):

function hook_block_view($delta = '') {
$blocks['content'] = drupal_render(drupal_get_form('event_signup_form'));
}

function event_signup_form() {
// Register form submit handler, same goes for validation handler
$form['#submit'][] = 'event_signup_form_submit';

return $form;
}

function event_signup_form_submit($form, &$form_state) {
// This is now triggered
}

Réponses:


15

Depuis Drupal 7, drupal_get_form () renvoie un tableau de rendu au lieu d'une chaîne, essayez donc d'utiliser:

drupal_render(drupal_get_form('event_signup_form'));

pour intégrer le formulaire dans le bloc. Pour plus d'informations, voir la section drupal_get_form () retourne un tableau de rendu au lieu d'une chaîne dans l'article Conversion des modules 6.x en 7.x

De plus, je crois que votre fonction event_signup_form($form, &$form_state)devrait être event_signup_form()(sans arguments).


Mais de l'intérieur hook_block_view ($ delta = '') api.drupal.org/api/drupal/modules--block--block.api.php/… Je retourne un tableau, je n'imprime rien.
Kristian Nissen

4
J'ai créé un outil qui crée du code bloc que vous pouvez placer dans votre module: Browse-tutorials.com/tools/drupal/create-block
ram4nd

@Kristian ok, cela fonctionne-t-il avec le code que vous avez modifié dans votre question?
Laxman13

Oui, j'ai réussi à le faire fonctionner, je vais ajouter une mise à jour à la question
Kristian Nissen

Bien que cela puisse fonctionner (en quelque sorte) pour la question modifiée, ce n'est pas la bonne façon de mettre un formulaire de travail dans un bloc. Vous voulez un tableau de rendu, pas une chaîne. Vous voulez également avoir les arguments (comme prescrit par l'API Form) pour hook_form(). Voir la réponse de Francisco Luz pour la bonne réponse.
Radical gratuit du

11

Je parie que $form['#submit'][] = 'event_signup_form_submit';c'est le coupable. Vous ne définissez cela que si vous voulez un gestionnaire de soumission supplémentaire.

Il s'agit d'un exemple de code fonctionnel.

<?php
/**
 * Implements hook_block_info().
 */
function MYMODULE_block_info() {
  $blocks = array();

  $blocks['MYBLOCK'] = array(
    'info' => t('My block'), 
    'cache' => DRUPAL_NO_CACHE,
  );
  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function MYMODULE_block_view($delta = '') {
  $block = array();

  switch ($delta) {
    case 'MYBLOCK':
      $block['subject'] = t('My block title');
      $block['content'] = drupal_get_form('MYFORM_form');
    break;
  }
  return $block;
}

/**
 * Custom form.
 */
function MYFORM_form($form, &$form_state) {
  $form['MYFIELD'] = array(
    '#type' => 'textfield',
    '#title' => t('Some Field'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit Button'),
  );

  return $form;
}

/**
 * Custom form submit function.
 */
function MYFORM_form_submit($form, &$form_state) {
  // You need the have Devel module enabled for dpm() to work.
  dpm($form_state);
}

1
Un excellent exemple!
leymannx

1
Excellent exemple. Je n'avais pas besoin de soumettre le formulaire personnalisé, mais les deux premières fonctions ont mis mon formulaire personnalisé dans un bloc, ce que je cherchais lorsque j'ai trouvé cette page. Merci.
millionleaves

Je pense que cela devrait être la réponse acceptée.
Radical gratuit du
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.