[Resolu]créer un module pour afficher un formulaire dans un bloc et appeler la page résultat dans le content

Catégories:

Bonjour,

Je souhaite faire un formulaire de recherche qui permettrait d’afficher les tailles en stock des produits ubercart.

Malgré avoir installé les modules complémentaires à views pour ubercart, j’arrive à faire mes views mais les résultats obtenus sont faux à cause des stocks des attributs.

PAr exemple si je recherche tous les articles de taille 38 de type ‘produit’ dont le stock est actif et la quantité en stock >=1.
Il me retourne également les articles qui ne sont pas en stock mais existe en 38.

J’ai donc réussi à trouver la requête pour afficher mes résultats correctement mais je ne sais pas trop comment faire pour :

  • Créer un bloc grâce à un module
  • pour le formulaire je devrais me débrouiller
  • créer une page de résultat qui sera appelée lors de la validation du formulaire.

Si vous pouviez me guider dans les principales étapes ça serait super gentil.

D’avance merci

#

Pour le module va voir du côté du hook_block (tu trouveras un exemple dans l’API en ligne je pense)

pour la page de résultats il faudrait passer par un hook menu.

Pour ce qui est du formulaire l’idéal serait de passer par L’API des formulaires mais tout ça ça fait un peu beaucoup d’un seul coup si tu n’as pas déjà exploré ces hooks :-/

#

j’ai réussi à créer un bloc avec un titre et un contenu texte.
Par contre je me posais une question pour l’intégration du form.

Si je fais quelque chose comme ceci est-ce que ça fonctionnerait ?

function mon_module_menu() {
  $items['mon_module'] = array(
    'page callback' => 'mon_module_hello',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
 
  return $items;
}

function mon_module_hello() {
  return t('Hello!');
}

function mon_module_nameform(){
//mes champs de form ..
return $form;
}

function mon_module_block(...){
   switch ($op){
  //...
  case 'view':

//appel de mon form
$block['content']=drupal_get_form('taille_stock_nameform');

return $block;
}}

Merci de votre aide

#

j’ai réussi à afficher le formulaire dans mon bloc et à appeler ma page de résultats par contre je ne sais pas comment récupérer les variables passées dans mon formulaire qui est dans le bloc.

J’ai bien essayé

function taille_stock_submit($form, &$form_state){
  drupal_set_message($form_state['values']['rech_taille']);
  $form_state['redirect'] = 'taille_stock'; // on redirige l'utilisateur sur la page de notre choix !
}

mais ça ne marche pas.

Sachant que mon formulaire est construit ainsi :

function taille_stock_nameform(){
   
   $options=array(38 =>'38', 40=>'40', 42=>'42', 44 =>'44', 46=>'46', 48=>'48');
   
   $form['rech_taille']=array(
      '#type' => 'select',
        '#options' => $options,
       '#multiple' => FALSE,
     );
$form['submit']=array(
       '#type' => 'submit',
        '#value' => t('Search'),
        );
return $form;
}

Comment puis-je faire ?

Merci de votre aide.

#

Mets ton véritable code pour qu’on puisse voir d’ou vient le souci ;-)
si ta fonction pour le formulaire s’appelle «taille_stock_nameform» alors Drupal va chercher automatiquement une fonction de soumission «taille_stock_nameform_submit». Dans cette fonction tu peux accéder à tes valeurs de formulaire en faisant
$form_state[‘values’][‘rech_taille’] comme tu l’as fait.

toi tu as marqué juste «taille_stock_submit» donc le probleme peut venir de là

Avec la redirection tu peux passer dans l’url les paramètres dont tu as besoin sur ta page de résultats pour faire des tes calculs et afficher les bons résultats

#

ci-dessous le code de mon module

Question doit on mettre $form[‘#action’] pour la page de redirection ou utiliser
le hook submit

Problème j’arrive à récupérer la valeur en $_GET mais pas en $_POST (bien évidemment en changeant la méthode de soumission.

<?php
//creation de la page de resultats
function taille_stock_menu() {
 
$items['taille_stock'] = array(
   
'page callback' => 'taille_stock_hello',
   
'access callback' => TRUE,
   
'type' => MENU_CALLBACK,
  );
 
  return
$items;
}

//creation du contenu de la page de resultats
function taille_stock_hello($taille='vide') {
 
  
//recuperation de la taille transmise au form
 
$taille=$form_state['values']['rech_taille'];
 
        
return
t('Taille : @taille', array('@taille' => $taille));
 
 
}

//creation des champs de formulaire
function taille_stock_nameform(){
$form['#method']='post';
  
$form['#action']='taille_stock';
  
  
$options=array();
 
  
//Requete ds la base de donnees pour selectionner les tailles à afficher pour la femme
$req1="SELECT distinct name FROM uc_attribute_options, node n WHERE aid =3 ORDER BY uc_attribute_options.weight ASC";
   
$result1=db_query(db_rewrite_sql($req1));
  while(
$data1=db_fetch_object($result1)){
      
$options[$data1->name]=$data1->name;
}
 
  
$form['rech_taille']=array(
     
'#type' => 'select',
       
'#options' => $options,
      
'#multiple' => FALSE,
     );
$form['submit']=array(
      
'#type' => 'submit',
       
'#value' => t('Search'),
        );
return
$form;
}

/<em>function taille_stock_submit($form, &$form_state){
 
drupal_set_message($form_state['values']['rech_taille']);
 
$form_state['redirect'] = 'taille_stock'; // on redirige l'utilisateur sur la page de resultats
}</em>/

//creation du block
function taille_stock_block($op='list', $delta=0, $edit=array()){
switch (
$op){
      case
'list': //si on est dans la liste des modules il s'affiche
        
$blocks[0]['info']=t('Search per ladysize');
          
$blocks[0]['cache']=BLOCK_NO_CACHE;
          return
$blocks;
           
       case
'configure': //configuration du bloc
        //si necessaire on rajoute des champs dans le form
    
;
      case
'view': //si l'on voit le bloc
    
      
$block['subject']=t('Search per size');
       
$block['content']=drupal_get_form('taille_stock_nameform');
       
      
drupal_get_form('taille_stock_nameform');
       
      
//qd tout le parametrage est termine on affiche le bloc
       
return $block;
    
   }

}

?>

#

Hello
La redirection se gère normalement plutôt avec $form_state[‘redirect’] (je suis plus sur de la synxtaxe) mais tu peux également la faire avec $form[‘#redirect’] = xxxxx quand tu déclares ton formulaire, ou même, plus barbare, utiliser drupal_goto dans ta fonction submit. Je ne me sers jamais de $form[‘#action’], je ne sais pas pourquoi…

Pour les données, les formulaires ne gèrent que les $_POST et pas les $_GET, tu n’as pas besoin de préciser la methode dans ton formulaire.

Les variables $_POST ne sont récupérables dans ton formulaire QUE dans la fonction _submit de ton formulaire ou dans sa fonction validation (_validate) ; donc il est normal que tu n’y ait pas accès dans la fonction qui génére ta page.
Dans ton cas je récupérais les variables POST avec $form_state[‘values’] puis je composerai une query string que tu ajoutes à ta redirection du genre ‘taille_stock ?&taille=56’

Autre astuce possible : si tu crée un item de menu ‘taille_stock’ (ce que tu as fait), si dans l’url tu marques taille_stock/56, le «56» est envoyé automatiquement à ton callback de menu «taille_stock_hello» comme étant le premier argument de ta fonction. ($taille dans on cas) ; ce qui t’évite de composer des query string avec des & et des ? tout ça tout ça

edit : j’ai un trou de mémoire sur ce point, je ne sais plus si il faut passer par la propriété de menu «page arguments» pour transmettre les arguments supplémentaires de l’url ou bien si le dispatchage des arguments supplémentaires est automatique… :-/

#

ok merci, je suis sur le livre drupal pro development 2nd edition, c’est là que j’ai vu le $form[‘#action’]

Pour le $_POST c’est plus clair, je ne savais pas l’on pouvait uniquement le retourner dans le formulaire.

J’ai donc essayé

<?php
function taille_stock_submit($form, &$form_state){
 
$taille=$form_state['values']['rech_taille'];
 
$form_state['redirect'] = 'taille_stock/'.$taille; // on redirige l'utilisateur sur la page de resultats
}
?>

mais je ne récupère aucune valeur pour $taille, ni avec $_POST...

/////////////////EDIT
J’avais oublié le nameform
function taille_stock_nameform_submit($form, &$form_state){

c’est bon ça fonctionne…

#

merci j’ai réussi je n’ai plus qu’à peaufiner mon affichage.

Mille merci.

#

De rien :-)
En faisant ce module tu manipules les rouages les plus importants de Drupal, ça ouvre beaucoup de portes de maitriser cela ;-)

Syndiquer le contenu