création d'un module de recherche avec formulaire

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour, après des heures de recherche je me décide à poster sur ce forum. J'essaie de créer un module avec un formulaire qui, une fois remplis donne lieu à une requête sur une base.
Mais là où je pèche c'est que je voudrais que le résultat de cette requête soit affiché dans un tableau sous le formulaire (sur la même page).

En résumé le problème se limite à saisir un champ, puis retourner la valeur saisie sur la même page, j'ai du rater quelque chose d'essentiel...

Version de Drupal : 

Je pensais à quelque chose du genre :

<?php
function recherche_contact_menu(){
   
 
$items = array();
 
$items['recherche-contact'] = array(
   
'title' => 'Rechercher un contact',
   
'page callback' => 'recherche_contact',
   
'access arguments' => array('access content'),
   
'type' => MENU_CALLBACK,
    );
  return
$items;
}

function
recherche_contact(){
   
$output.= drupal_get_form('formulaire');
   
$output.= traitement();
    return
$output;
}

function
formulaire()
{
   
$form = array();

   
$form['nom'] = array(
       
'#type' => 'textfield',
       
'#title' => t('Nom'),
       
'#required' => true,
    );

   
$form['submit'] = array(
       
'#type' => 'submit',
       
'#value' => t('OK'),
    );
   
    return
$form;
}

function
traitement() {
   
$requete = "select * from ext_contact where nom like '%".variable_get($var,'')."%'";

   
$rep = db_query($requete);

   
$affichage .= "<TABLE BORDER='2'
            <CAPTION> resultat de la recherche "
.$tuple->count."</CAPTION>
            <TR>
                <TH> Nom </TH>
                <TH> Prenom </TH>
                <TH> Institution </TH>
                <TH> Fonction </TH>
            </TR>"
;

    while(
$tuple = db_fetch_object($rep)){
       
$affichage .= "
            <TR>
                <TD>"
.$tuple->nom."</TD>
                <TD>"
.$tuple->prenom."</TD>
                <TD>"
.$tuple->institution."</TD>
                <TD>"
.$tuple->fonction."</TD>
            </TR>"
;
    }

  
$affichage .= "</TABLE>";

   return
$affichage;
}

function
formulaire_submit($form, &$form_state)
{
   
$form_state['redirect'] = 'recherche-contact';
   
variable_set($var,$form_state['values']['nom']);
}
?>

La requête est en réalité plus complexe ainsi que l'affichage mais l'idée est là.

Je n'arrive pas à y croire. Une question de développement. Hourrrrra !!!! Merci, Aelig, merci !!!

Concernant ta question, le workflow de ton formulaire est pas optimal :

  • Tu appelles la fonction traitement() dans le menu callback qui affiche la page (recherche_contact), c'est un peu bizarre de l'appeler à ce moment-là.

  • Dans ta fonction traitement(), tu mélanges une requête SQL et du HTML, ce qui n'est pas idéal non plus.

Voici comment tu pourrais faire :

  • Appelle la fonction traitement() depuis formulaire_submit(). traitement() devrait renvoyer des données non formatées, pas du HTML. Stocke les données récupérées dans $form_state['storage'] :

    <?php
    function formulaire_submit($form, &$form_state)
    {
       
    $form_state['redirect'] = 'recherche-contact';
       
    $donnees_non_formatees = traitement();
       
    $form_state['storage']['mes-donnees'] = $donnees_non_formatees;
    }
    ?>
  • Modifie la signature de ta fonction formulaire() de sorte qu'elle accepte un argument passé par référence -- $form_state -- et qu'elle génère un tableau dans un champ de type markup si $form_state['storage']['mes-donnees'] est définie :
    <?php
    function formulaire(&$form_state = NULL)
    {
       
    // ICI, tes champs de formulaire.

        // A l'endroit où tu veux afficher le tableau, tu mets :
       
    if (isset($form_state['storage']['mes-donnees']))
        {
           
    // ICI, tu boucles sur tes données et tu génères ton tableau :
           
    $affichage = '<table>...</table>';
           
    // Quand ton tableau est prêt, tu l'insères dans le formulaire
            // grâce à un champ de type markup.
            // Note que ce champ peut être placé n'importe où dans
            // le formulaire, selon l'endroit où ton tableau doit apparaître.
           
    $form['montableau'] = array(
               
    '#type' => 'markup',
               
    '#value' => $affichage
           
    );
        }

        return
    $form;
    ?>

Ça répond à ta question ?

ta requête fonctionne?

Car normalement la syntaxe n'est pas celle-ci, tu dois passer ta variable après mais pas dans ton sql

pour

$requete = "select * from {ext_contact} where nom like '%".variable_get($var,'')."%'";
$rep = db_query($requete);

je ferais plutôt ça

$mavariable=variable_get($var,'');
$requete = "select * from ext_contact where nom like '%s'";
$rep = db_query($sql, $mavariable);

Ma requête fonctionnait mais d'après ce que j'ai lu c'est plus sécurisé (et plus lisible) comme tu fais.

J'ai essayé de bidouiller avec variable_set parce que je trouvais rien d'autre ^^'

Edit : Il reste une zone d'ombre pour moi, comment faire pour accéder aux valeurs de $form_state dans traitement ?

Edit 2 : En fait j'ai trouvé tout seul pour le passage de parametre, merci encore à vous deux.

Bonjour,

Je tente d'effectuer a peu près la même opération.

Je ne comprend pas bien ce que contient la fonction traitement() dans votre cas. Et à quoi elle sert exactement ?

Pour ma part, je souhaiterais afficher des résultats en provenance d'une base de données suite aux entrées du formulaire.

Voici mon code :

function iew_autotextfields(&$form_state = NULL) {
[elements de form]
//----------SUMBIT--------------- //  
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Recherche'),
  );
 
if (isset($form_state['storage']['data'])) {
  $affichage = "affiche";
 
    $form['content'] = array(
      '#type' => 'markup',
      '#value' => $affichage,
    );
  }
  return $form;

}
function iew_autotextfields_submit($form, &$form_state) {
  if (!empty($form_state['iew_submission'])) {
    return;
  }
  // Continue le processus de traitement
  $form_state['redirect'] = 'iew/autotextfields/result';
  $donnees =  iew_result_traitement($form_state);
  $form_state['storage']['data'] = $donnees;
}

Pour l'instant il m'affiche "affiche" comme demandé.. mais je ne peux pas faire de requête dans la partie du "if (isset($form_state['storage']['data']))" ni dans ma fonction de traitement. Que vient faire la fonction "iew_result_traitement()") et où faire une requête pour retirer les informations de la DB ?

Je vous remercie d'avance pour votre réponse.