Submitted by awan on
Salut les amis,
J'ai une table "pwl_lien" dans laquelle je stock les liens proposés par les visiteurs.
Maintenant je dois créer une page pour administrateur qui doit :
1) Afficher ces liens proposés.
2) Administrateur pourra sélectionner autant de liens qu'il veut (je suppose que j'aurai un checkbox associé avec chaque lien affiché.), et cliquer sur un bouton "Publier"/"Supprimer"(une requette "update" va mettre à jour les liens sélectionnés).
Est-ce qqun à un idée comment peut-on faire ça ??
Est-ce qu'on peut le faire avec les Forms API.
Je vous remercie à l'avance les amis.
Salut, Ce que tu veux faire,
Permalien Soumis par drupalfrance le 3 Mai, 2007 - 09:48
Salut,
Ce que tu veux faire, c'est un formulaire. Il y a une partie de ton code qui va consister à afficher le formulaire grâce aux valeurs qui viennent de la base, et une autre partie qui va récupérer les valeurs soumises dans une fonction FORMID_submit() pour les enregistrer.
Donc, oui, c'est possible. Tout est expliqué dans http://api.drupal.org/api/5/file/developer/topics/forms_api.html. Si tu ne vois toujours pas comment faire, merci de poser des questions plus précises.
Merci drupalfrance, Je
Permalien Soumis par awan le 3 Mai, 2007 - 18:58
Merci drupalfrance,
Je connais le concept de Forms API. Je l'ai déjà utilisé pour créer un formulaire. Mais je n'étais pas sur que je pouvais afficher les données depuis la base (parce que mais connaissances de forms api et php sont très restreint.).
Je vais essayer de faire ça ce soir.
Mais si je crée une page, je choisi le "php code" comme Input format. Est-ce que je peux atteindre mon objective ??
En fait j'ai déjà crée une page, dans laquelle j'ai pu afficher mes données, mais je ne sais pas oú est-ce que je dois mettre ma requette "update" et comment peux-je savoir qulle est le checkbox sélectionné. Est-ce que tu peut me mettre sur une piste.
Je te remercie à l'avance.
Je te conseille de créer un
Permalien Soumis par drupalfrance le 4 Mai, 2007 - 10:28
Je te conseille de créer un module pour mettre ton code, ça sera plus facile à gérer que de tout mettre dans une page au format "PHP code".
En gros, voici les fonctions dont tu auras besoin (en pseudo-code) :
Fais bien attention d'adapter le nom des fonctions de validation et de soumission en fonction de l'id de ton formulaire. Dans mon exemple, l'id du form est "mon_form" (c'est le nom de la fonction de déclaration) mais j'aurais pu l'appeler autrement.
Je te recommande à nouveau de lire le http://api.drupal.org/api/5/file/developer/topics/forms_api.html (en anglais, certes) car tout ça y est expliqué plutôt bien.
Merci Vincent pour
Permalien Soumis par awan le 4 Mai, 2007 - 15:27
Merci Vincent pour m'aider.
J'ai essayé de créer un module, mais j'ai un problème. Je veux créer le formulaire de façon suivante.
Chcekbox adresse de site
Chcekbox adresse de site
Chcekbox adresse de site
Chcekbox adresse de site
Mais j'obtient :
Checkbox
Checkbox
Checkbox
Checkbox
adresse de site
adresse de site
adresse de site
adresse de site
J'ai le code suivant dans mon module.
<?php
/* $Id$ */
/***********************************************************************/
//this function specifies what permissions are available for this module.
function valider_weblink_perm(){
return array('access propose_weblink','create propose_weblink','administer propose_weblink');
}
/***********************************************************************/
function valider_weblink_form_submit($form_id, $form_values){
}
/***********************************************************************/
function valider_weblink_menu() {
$items = array();
$items[] = array(
'path' => 'valider_weblink',
'title' => t('Valider des liens web '),
'callback' => 'valider_weblink_all',
'access' => user_access('access onthisdate content'),
'type' => MENU_CALLBACK
);
return $items;
}
/***********************************************************************/
function valider_weblink_all() {
$page_content = '';
$page_content = frm_page();
return $page_content;
}
/***********************************************************************/
function frm_form(){
$rqt="select lien_id,lien_adresse_site from pwl_lien";
$res=mysql_query($rqt) or die (mysql_error());
echo "<table>";
while ($row=mysql_fetch_assoc($res)){
echo"<tr><td>";
$name=$row['lien_id'];
$form[$name] = array(
'#type' => 'checkbox',
'#title' => t(''),
'#default_value' => variable_get('admin', 0),
);
echo"</td>";
echo"<td>";
echo $row['lien_adresse_site'];
echo "</td></tr>";
}
return $form;
}
/***********************************************************************/
function frm_page(){
return drupal_get_form('frm_form');
}
/***********************************************************************/
Est-ce que qqun voit que ce problème vient d'ou??
Merci à l'avance.
La fonction frm_form() n'est
Permalien Soumis par drupalfrance le 4 Mai, 2007 - 15:45
La fonction frm_form() n'est pas correcte : elle affiche du HTML avec des instructions echo, et elle renvoie des champs de formulaire dans la variable $form.
La bonne pratique veut qu'on n'affiche jamais directement de html avec echo ou print. On se contente de le concaténer puis de le renvoyer via un return, et Drupal se charge du reste.
La fonction frm_form() doit donc se contenter de renvoyer $form. Si tu veux mettre du HTML dans ton formulaire, tu as deux options :
Dans les 2 cas, et au risque de me répéter lourdement, la syntaxe est expliquée dans http://api.drupal.org/api/5/file/developer/topics/forms_api.html. L'as-tu regardé ?
Merci Vincent, J'ai bien
Permalien Soumis par awan le 4 Mai, 2007 - 16:03
Merci Vincent,
J'ai bien regardé le document, mais je n'ai pas regardé la partie "Theming forms", Je vais le faire maintenant.
Merci encore.
Merci beaucoup Vincent J'ai
Permalien Soumis par awan le 4 Mai, 2007 - 21:46
Merci beaucoup Vincent
J'ai réussi à faire ce que je voulais, et c'est grâce à ton aide.
J'ai une dernière question à te poser. Dans mon formulaire j'ai un bouton qui me permet de mettre à jour les données dans la base, et dont le code est mis dans le fonction _SUBMIT().
Maintenant je voudrais avoir un autre bouton qui me permettra de supprimer les liens sélectionnés.
Comment peut je faire ce bouton ??
Oú est-ce que je dois mettre le code qui sera exécuté sur clique de ce bouton ??
Je te remercie à l'avance.
Tu peux faire ca
Permalien Soumis par tostinni le 4 Mai, 2007 - 22:15
Tu peux faire ca relativement simplement avec un callback qui va bien.
Comme je bosse sur les profiles en ce moment, je te passe un bout de code qui explique tout, simplement:
D'abord le menu afin de pouvoir creer un lien
Ensuite le callback en soit:
Et enfin la fonction pour effacer pour de bon:
Et voila, avec tout ca ca devrait marcher peinard.
Bon courage
@awan: content d'avoir pu te
Permalien Soumis par drupalfrance le 5 Mai, 2007 - 13:05
@awan: content d'avoir pu te dépanner.
@tostinni: je ne suis pas sûr que vous parliez de la même chose, awan et toi.
Awan, si j'ai bien compris, tu auras deux boutons sur ton formulaire, dont un qui te permettra d'effacer les éléments sélectionnés. Le bouton "Effacer" est en fait un bouton classique, et le code à exécuter quand il sera cliqué se trouve toujours dans la même fonction (FORMID_submit()).
L'astuce, c'est de tester le libellé du bouton qui a été cliqué dans la fonction FORMID_submit(). En effet, le libellé du bouton cliqué est automatiquement passé dans $form_values['op'].
Pour résumer, ça donne le code suivant. D'abord, dans la fonction de déclaration de formulaire, tu mets 2 boutons, par exemple :
Puis dans la fonction FORMID_submit(), tu mets un test du style :
Je n'ai pas testé ce code, il est donc sous réserve de vérification.
Je confirme, c'est
Permalien Soumis par Damien Tournoud le 6 Mai, 2007 - 11:12
Je confirme, c'est exactement cela, sauf que traditionnellement les textes sont écrits en anglais et traduits avec la fonction t(). Voir, pour une exemple parmi d'autres, la fonction aggregator_form_category_submit().
Merci les amis, J'ai
Permalien Soumis par awan le 7 Mai, 2007 - 23:37
Merci les amis,
J'ai réussi. J'ai utilisé la version proposé par drupalfrance.
Merci à tous qui ont participé dans cette discussion.