Utilisation fonctions php Drupal

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 à tous,

Je suis un novice de Drupal et je souhaiterai créer un formulaire en PHP / MySQL pour un projet dans le cadre de mes études.

J'utilise donc le format d'entrée "PHP code" afin d'insérer le code PHP dans une page de Drupal. Pour le formulaire, je souhaiterai afficher une liste de type et j'ai vu qu'une fonction de Drupal était présente : form_select. Mais je ne sais pas comment l'utiliser et des erreurs s'affichent lorsque je souhaite faire un include du fichier PHP contenant la fonction :
Fatal error: Call to undefined function form_select() in C:\Program Files (x86)\EasyPHP5.2.10\www\Drupal\includes\common.inc(1695) : eval()'d code on line 57

Merci d'avance pour votre aide, j'ai déjà effectué de nombreuses recherches sur internet mais je n'est pas trouvé de solution même sur la documentation de l'API (http://api.drupal.org/api/function/form_select/4.6)

Version Drupal : 6.16

Forum : 
Version de Drupal : 

Dans la fonction _form tu met les champs de ton formulaire et dans le _submit tu met le traitement de tes données

function ss_items_form(&$form_state, $id = NULL) {

$form['datedebut'] = array(
'#type' => 'textfield',
'#title' => t('Date de debut'),
'#size' => 10,
'#maxlength' => 10,
'#description' => t('La date de debut sous le format: jj/mm/aaaa.'),
'#required' => TRUE,
'#default_value' => '',
);
$form['datefin'] = array(
'#type' => 'textfield',
'#title' => t('Date de fin'),
'#size' => 10,
'#maxlength' => 10,
'#description' => t('La date de fin sous le format: jj/mm/aaaa.'),
'#required' => TRUE,
'#default_value' => '',
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Rechercher'),
);
// Return to Offres Item list page after submit
//$form['#redirect'] = 'admin/content/stat-search';

return $form;

}

/**
* @author Mohamed Behmane
* @param $form
* @param $form_state
* @return unknown_type
*/
function ss_items_form_submit($form, &$form_state)
{
$tabdeb = explode("/", $form_state['values']['datedebut']);
$tabfin = explode("/", $form_state['values']['datefin']);
$date_debut = mktime(0,0,0, $tabdeb[1], $tabdeb[0], $tabdeb[2]);
$date_fin = mktime(0,0,0, $tabfin[1], $tabfin[0]+1, $tabfin[2]);

drupal_goto('admin/content/stat-search/'.$date_debut.'/'.$date_fin);
}

Je suis désolé mais je ne parviens toujours pas à afficher de liste déroulante...
De plus lorsque j'essai de créer une liste en php, il y a une ligne sur deux qui est à vide.

voici mon code PHP

<?php
$result
= db_query("SELECT categorie_titre FROM pms_categorie");
while (
$row = db_fetch_object($result)) {
  if (
$row->categorie_titre != "") {
    echo
"<option>|" . $row->categorie_titre . "|<option/>";
  }
}
?>

Tu ne veut pas utiliser l api form de drupal?

Parce que la c est du php pure.Et si tu a une ligne sur 2 qui est vide c est que ton champ categorie_titre dans ta base il se passe un truc louche une fois sur deu .va jeter un oeil dans ta table directement sur ta bdd

Non je ne sais pas pourquoi il y a une ligne sur 2 de vide... en base de données il n'y a que deux données (catégorie 1 et catégorie 2).

En ce qui concerne ton code je n'est pas saisi le fonctionnement, d'après mes recherches sur le net je suis arrivé à un code de ce type :

<?php
$options
= array(
       
1 => 'Something',
);

$form['userList'] = array(
       
'#type' => 'select',
       
'#title' => t(''),
       
'#default_value' => NULL,
       
'#options' => $options,
       
'#description' => t(''),
);
?>

Mais cela ne fonctionne pas en fait je ne sais pas quelle fonction utiliser pour afficher le résultat de la fonction à l'écran.

Bon désolé je t ai mis le code mais je t ai pas préciser les detail en plus je l ai mal formater.En dupal voila comment tu fait.

Tu creer un module et dedans tu met ca :

<?php
/<strong>
 * @
author Mohamed Behmane
 
* @param unknown_type $form_state
 
* @param unknown_type $id
 
* @return unknown_type
 
<em>/
function
toto_items_form(&$form_state, $id = NULL) {
 
   
//ca c ets le tableau qui contien tes options
   
$options = array(
       
1 => 'Something',
       
2 => 'toto',
       
3 => 'titi'
             
);

   
//ca c est le menu deroulant du formulaire de drupal il se construit a partir de ce que tu a mis dans le tableau ci dessus
   
$form['userList'] = array(
       
'#type' => 'select',
       
'#title' => t(''),
       
'#default_value' => NULL,
       
'#options' => $options,
       
'#description' => t(''),
    );
   
   
// ca c est ton bouton submit qui envoi ton formulaire
   
$form['submit'] = array(
     
'#type' => 'submit',
     
'#value' => t('Envoyer'),
    );
   
// Return to Offres Item list page after submit
    //$form['#redirect'] = '/</em>ici tu meturl ou tu veut atterir apres avoir valider ton formulaire*/'; //pas obligatoire
   
   
return $form;
}

/</
strong>
 * @
author Mohamed Behmane
 
* @param $form
 
* @param $form_state
 
* @return unknown_type
 
*/
function
toto_items_form_submit($form, &$form_state)
{
 

 
//ici tu met le traitement que tu  veut faire quat tu envoi ton formulaire
 
  //Ta variable que tu a selectionne dans le select est dans le tableau ci dessous tu faut ton traitement comme tu vaut:

 
$form_state['values']['userList']

 
//drupal_goto('admin/content/stat-search/'.$date_debut.'/'.$date_fin);
}
?>

et ensuite maintenant que ton form existe dans ton template la ou va aparaitre ton formulaire tu met:

<?php
 
echo drupal_get_form('toto_items_form');
?>

Dit moi la ou tu coince sur mes infos

Ok merci beaucoup !!

J'ai réussi à faire fonctionner mon code grâce à ton aide mais par contre j'ai tout mis sur la même page car je n'arrive pas à séparer le code dans un fichier module à part, je ne sais pas comment faire appel aux fonctions si elles sont sur un autre fichier (j'ai essayé un include mais cela n'a pas fonctionné).

Je ne sais pas si j'ai été très clair mais en résumé je vois sa de cette façon :

-Un fichier module placé dans le répertoire sites/all/modules un formulaire pour les éléments à afficher et un autre pour l'action du bouton submit.

-La page ou l'article que je modifie en incluant le code PHP faisant appel aux différentes fonctions qui me permettrons d'afficher l'ensemble des éléments de mon formulaire.

Je bloque également pour les données à afficher dans ma liste déroulante car elles proviennent de la base de données mais je ne sais pas comment passer les données dans l'attribut '#options'. Effectivement, ce champ dois contenir un array mais ma requête SQL ne me retourne pas un tableau (j'utilise la fonction db_fetch_array).

Encore une fois merci pour ton aide, sa m'a bien fait avancer !!

Ok
Pour commencer creer toi ton propre module.C est a dire un dossier ke tu appel comme tu veu par exemple toto.dedans tu met un fichier toto.module et un dossier toto.info et tu met tes fonction dans toto.module.

Ensuite tu va sur ton interface d admin et tu va dans /admin/build/modules dans la liste de tes module puis tu active le tien.

Sache que tu a acces a toutel es methode qu il y a dans tout tes module activer y compris le tien, et ce sans rien faire du tout.tu y a acces partout dans ton site y compris tes template.

Ensuite pour ton tableau select tu le rempli aisi.

<?php
 

//tu ecris ta requette ainsi

$query ="select Ton champs....;

//puis tu fait:

while(
$result= db_fetch_object( $query ) )  {
   
$option[] = $result;
  }
// puis verifie ce que contien ton tableau en faisant print_r(
$option)
?>

Dis mois si tu rencontre un probleme.A+

Ok impeccable !!

C'est pour un projet d'école et je voulais créer un module sur Drupal mais j'y comprenais rien !! Merci maintenant je vais avancer beaucoup plus vite et le travail sera bien structuré en fichiers.

Encore une question quand même ^^ :

Je vois mal comment faire pour structurer les différents champs de mon formulaire. En effet le fichier .module que j'ai créé contient l'ensemble des champs à afficher mais ils sont un peu en vrac.

Sinon juste au cas ou si tu avais des liens vers des pages contenant des informations sur $form car je ne connais pas toutes les possibilités qu'offre Drupal (pour le moment j'ai trouvé cette page qui est plutôt pas mal mais je ne pense pas que toutes les possibilités soient démontrées : http://drupal.org/node/751826).

Merci encore pour ton aide !

Bah pour l ordre de tes champ il s afficherons dans l ordre ou tu les met.Si ce n est pas le cas tu le met l attribut : #weight=>'3'
Le 3 c est le poid a savoir ke si tu a 2 champ avec l un d entre eux qui a le poids 3 et l autre le poid 2 c est le poid 3 qui se mettra en bas.

Sinon j ai regarder ton lien il est pas mal tu a presque tout les exemple.

fieldset c est le label
textfield c est le champ texte
textearea c est air de texte
radio c ets les radio bouton
checkbox c est les case a cocher
et select c est le menu deroulant
submit c est le bouton

Il y a tout dedans.Toute facon dans un formulaire il n y a que ca je crois

Tu me dira si tu trouve pas comment faire un truc au pire

Ok sa marche.

En fait on est quand même un peu restreint sur la position des éléments du formulaire, on ne peut pas par exemple afficher 2 textfield l'un à côté de l'autre... à moins de créer 2 fonctions dans le fichier .module puis de mettre en forme la structure du formulaire dans la page, dans l'éditeur de Drupal.

non tu met un fichier style.css dans un dossier css dans ton theme et tu va dans ton page.tpl.php du theme et tu l appelle avec le link reel steelsheet.ca tu doit regarder sur le net ca marche partout pareil.Que ce soi pour drupal ou n importe.C est considerer etre du html.Et puis tu va sur le site du zero et tu apprend a faire du css.C est rapide et tu pourra donner de la couleur et de la forme a ton site.

N hesite pas si tu coince

Ok faudra que je test sa mais avant je voudrais savoir si il y a pas plus simple (genre un paramètre à modifier) car en fait le seul problème est que titre de mes textfield s'affiche au dessus du textfield et je souhaiterai qu'il s'affiche à sa gauche :

Je voudrais afficher ça :

Nom prénom : {textfield nomPrenom}

au lieu de ça :

Nom prénom :

{textfield nomPrenom}

Sinon si y a pas plus simple je vais faire avec du CSS.

EDIT :
Je viens de tester avec le CSS en fait j'ai ajouter ce code dans une fichier CSS que j'ai positionné dans mon dossier module :

inputInline input{

float: right;

}

Ensuite j'ai fait appel au fichier CSS dans le fichier .module via :

<?php
drupal_add_css
(drupal_get_path('module', 'annonces') .'/annonces.css');
$form['div_tag'] = array('#type' => 'markup', '#value' => '<div class="inputInline">');
?>

La 2nd ligne permet d'encadrer mon formulaire d'un div ayant le syle inputInline. Cependant, aucun changement à l'affichage et pourtant mon formulaire est bien encadré de la balise div et le fichier CSS est correctement importé (J'ai vérifié avec l'add ons Firebug de Firefox).

Le problème doit venir de mon code CSS mais je ne vois pas pourquoi.

Pour l attraper c est:

input.inputInline {
float: right;
}

Tu met la balise ensuite la class sinon tu peut mettre directement

.inputInline {
float: right;
}

Ou encore

input{
float: right;
}
mais la tu attrape tout les input de la page

ou encore

div .inputInline {
float: right;
}

Il y a moulte facon de faire :)

Et tu ne trouvera pas plus simple que le css pour faire ce que tu veut la

En fait c'est bon c'est ok et tu as bien raison le CSS semble être la méthode la plus simple mais également la plus propre question code.

En tout cas merci encore pour ton aide je crois que je commence à avoir toutes les cartes en main pour pouvoir programmer des modules sous Drupal. Il me reste encore l'enregistrement des données du formulaire à effectuer via le bouton submit mais sa devrait pas me poser de problème.

Désolé.. encore une petite question :

Pour les listes déroulantes au moment de l'enregistrement en base de données je dois connaitre l'identifiant de la valeur séléctionnée (Et non pas la valeur elle-même).

Est-ce-que cela est possible (sans faire une requête en base de données avec la valeur selectionnée par l'utilisateur) ?

EDIT :
Finalement c'est ok j'ai utilisé un tableau associatif :

<?php
   
while ($row = db_fetch_object($result)) {
       
$rubriques[$row->rubrique_id] = $row->rubrique_titre;
    }
?>

Désolé sa faut un bon moment que j'ai pas fait de PHP

Nouvelle question :

Comment est-ce-que je peux faire pour que ma page ne soit accessible que par certains utilisateurs enregistrés et que si ce n'est pas le cas, ils soient redirigés vers la page d'identification de Drupal ?

(Pour savoir si il est identifié je peux utiliser la variable $global sa devrai le faire je pense)

J'avais essayé mais le problème c'est que je vois pas mon module dans les droits d'accès !

Sinon je voulais savoir aussi : Est-ce-que c'est possible de mettre une liste déroulante dans un fieldset ? (Il faudrait le placer dans le champ description mais je vois pas comment c'est possible)

Non dans un fieldset tu peu pas mettre un menu deroulant.

Il te faut une entrer de type select

et pour voir ton module dans les permissions tu ajoute au debut de ton module si par exemple tu l a appeler toto:

<?php
function toto_perm()
{
  return array(
'access toto', 'administer toto');
}
?>

Il va apparaitre dans tes droit d acces

Mais je sais pas si dans ton cas ca va te servir car tu n a pas mis de hook menu.

Quel est l url de la page sur laquel tu veut ke ton formulaire apparaisse???
On va aborder un autre point qui pourra te servir par la suite?

J'ai bien ajouté le code que tu m'as donné dans mon fichier .module mais je ne vois toujours pas le module dans la gestion des droits d'accès.

Sinon pour l'adresse de la page c'est : http://127.0.0.1/Drupal/?q=node/2

Je souhaiterai savoir aussi :

C'est possible d'ajouter du texte dans mon .module, c'est-à-dire du texte non modifiable à afficher sur la page. Parce que je ne vois pas quel type est associé au champ texte dans le $form ('#type' => 'select' mais avec le type texte)

En fait j ai vu ton url et vu ke tu utilise pas la reecriture d url.Je pense que le plus simple pour toi c est que dans ta methode qui renvoi ton formilaire tu attrape la variable qui est en global qui s appelle $user .C est un tableau et dedans tu a l info si tu est connecter ou pas.Tu met if connecter alor retourn ton form else drupalgoto(la page d insciption de drupal).la methode drupal goto ets une methode qui te redirige vert l url que tu lui transmet en param.

En suite pour le texte en dure tu met dans une variable en dure genre

<?php
$montexte
='<p>montexte en dur</p>'
?>

et dans ta methode au lieu de mettre return $form tu met return $montexte.$form

et il apparaitre avant le formulaire dans une balise p.Tu n a plus qu a le styler comme tu le veut

Ok merci en fait pour le texte j'ai géré sa dans un fieldset. Sinon je retient ta méthode qui fonctionnerait tout aussi bien.

Par contre question redirection de page je veux bien un exemple si c'est possible. Notamment en ce qui concerne le passage de paramètres lors du submit. Par exemple si je veux savoir si un submit c'est bien passé et récupérer sa en paramètre dans l'URL de ma page je fais comment ?

Active le module pathauto et va dans la liste de tes contenu.seleclionne ds le menu de roulant mettre a jour les alias. Tu coche tout tes contenu et tu valide. Ensuite quand tu submit ton form tu verra tes paramètre ds ton URL.et pour les récupérer je t avai mis comment un peu plut hait dans la méthode qui se termine par submit

En fait je souhaiterai créer un bouton permettant de filtrer le résultat d'une requête, il faudrait donc que la page s'affiche à nouveau mais que la requête soit modifiée mais je ne sais pas comment passer cela en paramètre dans le submit car je ne sais pas comment appeler à nouveau ma page principale (il existe sans doute une fonction dans Drupal je pense).

Désolé de pas avoir répondu j'ai pas eu trop de temps depuis... Sinon pour l'identification c'est bon j'ai géré sa avec la variable $user.

Maintenant ce que je voudrais c'est ajouter une classe pour pouvoir utiliser mes propres objets. Sa se fait facilement sa ?

Bon ok finalement sa fonctionne avec les classes pas de problème maintenant c'est OK.

Par contre je voudrais savoir comment utiliser les fonctions de Drupal dans un script PHP qui sera executé périodiquement ?

J'ai fait des include de ce type :

<?php
include '../../../includes/database.mysql-common.inc';
include
'../../../includes/database.inc';
include
'../../../includes/database.pgsql.inc';
?>

Mais sa m'affiche ce message d'erreur :

Fatal error: Cannot redeclare db_query() (previously declared in /mnt/hgfs/www/future/includes/database.mysql-common.inc:35) in /mnt/hgfs/www/future/includes/database.pgsql.inc on line 126

Ca c est des includes dont tu peut te passer car il ouvre une connexion a la bdd et ca drupal le fait deja tout seulo.Dans drupal tu tepe ta requette et tu l execute.L ouvertude de bdd est deja faite.

En tout cas cette erreur parle du premier include donc enleve le

Si j'enlève tous les includes sa me donne :

Fatal error: Call to undefined function db_query() in /mnt/hgfs/www/future/sites/all/modules/test.php on line 25

Et si j'enlève que le 1er :

Fatal error: Call to undefined function variable_get() in /mnt/hgfs/www/future/includes/database.pgsql.inc on line 134

En fait ce que je cherche à faire c'est une recherche en base de données qui sera déclenchée périodiquement par le cron mais qui ne sera pas un module de Drupal, simplement un script PHP dans lequel je voudrais faire appel aux fonctions db_query et db_fetch_object de Drupal.

Ah ds ce cas pour faire propre tu doit ajouter un hook_menu ds ton module et sur une URL tu appelle une méthode qui exécute ta requette.tu a 2 méthode a ajouter ds ton module, tu n a pas besoin de tes classe. Récupère les requette et fait comme je t ai dit.
Si ds ton hook_menu Qui appelle une metthode tu met /toto.tu exécutera cette requette en appelant l URL /toto

Ok merci je vais voir ce que je peut faire avec les hook menu.

par contre j'ai un autre problème dans un formulaire : Je voudrais afficher un tableau comme indiqué sur ce site : http://www.akchauhan.com/create-a-sortable-table-using-theme_table-funct...

mais sa fait 2 heures que je m'arrache les cheveux sans y arriver !!

<?php
function validAnnonces() {
   
//Affichage de l'ensemble des annonces à valider
   
$head = array(
            array(
'data' => t('Coupon'), 'field' => 'coupon'),
            array(
'data' => t('Type of Discount')),
    );

   
$rows[] = array(
            array(
'data' => 'test'),
            array(
'data' => 'test'),
    );

    return
theme_table($head, $rows);
}
?>

l'erreur affichée est : Fatal error: Cannot unset string offsets in /mnt/hgfs/www/future/includes/form.inc on line 492

Merci encore

Salut,

Désolé sa faisait un moment que je t'avais pas posé de questions mais c'était plutot bon signe, mon projet d'école arrive à présent à son terme.

J'ai cependant toujours un problème depuis le début de ce projet en ce qui concerne la connexion utilisateur au site internet : Lorsque je me connecte sous IE, cela ne fonctionne pas, la page est rafraichit mais je ne suis pas connecté. En revanche, si je modifie les paramètres de confidentialité pour les passé à "basse" alors la connexion fonctionne correctement. Le problème n'apparait pas sous Firefox ou Chrome.

Je pense que cela doit être paramétrable du côté des cookies pour Drupal.