Submitted by PierreJ on
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
Normal, tu recherche dans
Permalien Soumis par emerya le 24 Avril, 2010 - 18:19
Normal, tu recherche dans l'API de Drupal 4.6...
Cf. la bonne doc ici : http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....
Merci pour ton aide mais je
Permalien Soumis par PierreJ le 24 Avril, 2010 - 18:59
Merci pour ton aide mais je n'est pas trouvé d'exemple sur le site de l'API. Quelqu'un aurait-il un exemple à me proposer svp ?
Dans la fonction _form tu met
Permalien Soumis par mbehmane le 25 Avril, 2010 - 13:24
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
Permalien Soumis par PierreJ le 29 Avril, 2010 - 22:50
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
Tu ne veut pas utiliser l api
Permalien Soumis par mbehmane le 30 Avril, 2010 - 01:40
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
Permalien Soumis par PierreJ le 30 Avril, 2010 - 19:38
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 :
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
Permalien Soumis par mbehmane le 30 Avril, 2010 - 20:29
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 :
et ensuite maintenant que ton form existe dans ton template la ou va aparaitre ton formulaire tu met:
Dit moi la ou tu coince sur mes infos
Ok merci beaucoup !! J'ai
Permalien Soumis par PierreJ le 1 Mai, 2010 - 01:33
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
Permalien Soumis par mbehmane le 1 Mai, 2010 - 03:03
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.
Dis mois si tu rencontre un probleme.A+
Ok impeccable !! C'est pour
Permalien Soumis par PierreJ le 1 Mai, 2010 - 11:18
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
Permalien Soumis par mbehmane le 1 Mai, 2010 - 11:39
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
Permalien Soumis par PierreJ le 1 Mai, 2010 - 11:46
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.
Oh que si on peut et ce sans
Permalien Soumis par mbehmane le 1 Mai, 2010 - 12:04
Oh que si on peut et ce sans php.Ca ca se fait en css tu met float left sur le premier champ de texte ou encore display_inline:block sur le dive contenant tes champ
Et on met le css dans le
Permalien Soumis par PierreJ le 1 Mai, 2010 - 12:08
Et on met le css dans le fichier .module ? Là je vois mal comment faire je dois avouer.
non tu met un fichier
Permalien Soumis par mbehmane le 1 Mai, 2010 - 12:14
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
Permalien Soumis par PierreJ le 1 Mai, 2010 - 14:45
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 :
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
Permalien Soumis par mbehmane le 1 Mai, 2010 - 15:08
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
Permalien Soumis par PierreJ le 1 Mai, 2010 - 15:13
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
Permalien Soumis par PierreJ le 1 Mai, 2010 - 15:49
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 :
Désolé sa faut un bon moment que j'ai pas fait de PHP
Ca revient vite....
Permalien Soumis par mbehmane le 1 Mai, 2010 - 16:15
Ca revient vite....
Nouvelle question : Comment
Permalien Soumis par PierreJ le 1 Mai, 2010 - 16:39
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)
Pour ca tu va dans l admin de
Permalien Soumis par mbehmane le 1 Mai, 2010 - 16:59
Pour ca tu va dans l admin de drupal droit d utilisteur et tu met le droit sur ton type de contenu que si l utilisateur est identifier.drupal fait le reste.
J'avais essayé mais le
Permalien Soumis par PierreJ le 1 Mai, 2010 - 18:27
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
Permalien Soumis par mbehmane le 1 Mai, 2010 - 19:27
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:
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
Permalien Soumis par PierreJ le 2 Mai, 2010 - 18:31
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
Permalien Soumis par mbehmane le 2 Mai, 2010 - 18:59
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
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
Permalien Soumis par PierreJ le 3 Mai, 2010 - 18:42
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
Permalien Soumis par mbehmane le 3 Mai, 2010 - 19:18
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
Permalien Soumis par PierreJ le 3 Mai, 2010 - 23:10
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).
ton formulaire te renvoie sur
Permalien Soumis par mbehmane le 4 Mai, 2010 - 11:10
ton formulaire te renvoie sur quelle page actuellement??
Désolé de pas avoir répondu
Permalien Soumis par PierreJ le 8 Mai, 2010 - 19:30
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 ?
Bah en fait je pense que tu
Permalien Soumis par mbehmane le 8 Mai, 2010 - 20:08
Bah en fait je pense que tu peut mettre en place ca dans un module meme si moi je ne l ai jamais fait.mais regarde ce que tu veut vraiment faire car si ca se trouve il y a des module qui prevoient ca.
Bon ok finalement sa
Permalien Soumis par PierreJ le 17 Mai, 2010 - 18:30
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 :
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
Permalien Soumis par mbehmane le 17 Mai, 2010 - 20:02
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
Permalien Soumis par PierreJ le 17 Mai, 2010 - 21:35
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
Permalien Soumis par mbehmane le 17 Mai, 2010 - 21:57
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
Je suis pas sur de tout avoir
Permalien Soumis par PierreJ le 18 Mai, 2010 - 09:04
Je suis pas sur de tout avoir compris. Le truc c'est que je ne fait pas un module !! C'est un fichier .php qui sera exécuté périodiquement.
Bah dans ce fichier il y a
Permalien Soumis par mbehmane le 18 Mai, 2010 - 16:15
Bah dans ce fichier il y a des requette tu les recupere et tu les met dans le module ou tu a mis ton formulaire avec un hook_menu.Ca t evitera de refaire un module.
Ok merci je vais voir ce que
Permalien Soumis par PierreJ le 18 Mai, 2010 - 21:30
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 !!
l'erreur affichée est : Fatal error: Cannot unset string offsets in /mnt/hgfs/www/future/includes/form.inc on line 492
Merci encore
Je ne sais pas trop ce que tu
Permalien Soumis par mbehmane le 25 Mai, 2010 - 19:54
Je ne sais pas trop ce que tu veut faire du coup je vois pas trop
Salut, Désolé sa faisait un
Permalien Soumis par PierreJ le 26 Juin, 2010 - 16:23
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.
sout toute les version de ie
Permalien Soumis par mbehmane le 28 Juin, 2010 - 12:37
sout toute les version de ie ca te fait ca?
Pour le moment j’ai tester
Permalien Soumis par PierreJ le 28 Juin, 2010 - 13:38
Pour le moment j'ai tester que sous IE8