Soumis par awan le
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.
Forum :
Salut, Ce que tu veux faire,
Permalien Soumis par drupalfrance le 3 Mai, 2007 - 10: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.
Vincent
Merci drupalfrance, Je
Permalien Soumis par awan le 3 Mai, 2007 - 19: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 - 11: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) :
<?php/<strong>
* Fonction qui déclare les champs du formulaire
* L'id du formulaire sera "mon_form" car la fonction s'appelle ainsi.
</strong>/
function mon_form() {
$form['champ1'] = array(...);
$form['champ2'] = array(...);
// Ici, tu peux faire du SQL pour récupérer des valeurs en base
$res = db_query("SELECT * FROM table");
// Les résultats du SQL servent à générer de nouveaux champs
while ($o = db_fetch_object($res)) {
$form[$o->name] = array(...);
}
return $form
}
/<
strong>* Fonction qui affiche le formulaire
</strong>/
function ma_page() {
return drupal_get_form('mon_form');
}
/<
strong>* Fonction de validation du formulaire
* Te permet de tester que les valeurs soumises sont OK
* et éventuellement d'afficher un msg d'erreur.
</strong>/
function mon_form_validate($form_id, $form_values) {
if ($form_values['name'] == '') {
form_set_error('name', 'Le nom est obligatoire');
}
}
/<
strong>* Fonction de soumission.
* Appelée UNIQUEMENT si la validation est OK.
* Autrement dit, c'est ici que tu enregistres les résultats.
</strong>/
function mon_form_submit($form_id, $form_values) {
db_query("INSERT INTO table...");
}
?>
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.
Vincent
Merci Vincent pour
Permalien Soumis par awan le 4 Mai, 2007 - 16: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 - 16: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é ?
Vincent
Merci Vincent, J'ai bien
Permalien Soumis par awan le 4 Mai, 2007 - 17: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 - 22: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 - 23: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
<?php//...
$items[] = array('path' => 'admin/user/profile/delete',
'title' => t('Delete field'),
'callback' => 'drupal_get_form',
'callback arguments' => array('profile_field_delete'),
'type' => MENU_CALLBACK);
//...
?>
Ensuite le callback en soit:
<?php/**
* Menu callback; deletes a field from all user profiles.
*/
function profile_field_delete($fid) {
$field = db_fetch_object(db_query("SELECT title FROM {profile_fields} WHERE fid = %d", $fid));
if (!$field) {
drupal_not_found();
return;
}
$form['fid'] = array('#type' => 'value', '#value' => $fid);
$form['title'] = array('#type' => 'value', '#value' => $field->title);
return
confirm_form($form,t('Are you sure you want to delete the field %field?', array('%field' => $field->title)), 'admin/user/profile',
t('This action cannot be undone. If users have entered values into this field in their profile, these entries will also be deleted. If you want to keep the user-entered data, instead of deleting the field you may wish to <a href="@edit-field">edit this field</a> and change it to a hidden profile field so that it may only be accessed by administrators.', array('@edit-field' => url('admin/user/profile/edit/'. $fid))),
t('Delete'), t('Cancel'));
}
?>
Et enfin la fonction pour effacer pour de bon:
<?php/**
* Process a field delete form submission.
*/
function profile_field_delete_submit($form_id, $form_values) {
db_query('DELETE FROM {profile_fields} WHERE fid = %d', $form_values['fid']);
db_query('DELETE FROM {profile_values} WHERE fid = %d', $form_values['fid']);
cache_clear_all();
drupal_set_message(t('The field %field has been deleted.', array('%field' => $form_values['title'])));watchdog('profile', t('Profile field %field deleted.', array('%field' => $form_values['title'])), WATCHDOG_NOTICE, l(t('view'), 'admin/user/profile'));
return
'admin/user/profile';}
?>
Et voila, avec tout ca ca devrait marcher peinard.
Bon courage
Expert Drupal, co-fondateur Propal
Propal, l'agence web experte Drupal
@awan: content d'avoir pu te
Permalien Soumis par drupalfrance le 5 Mai, 2007 - 14: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 :
<?php$form['submit'] = array('#type' => 'submit', '#value' => 'Enregistrer');
$form['delete'] = array('#type' => 'button', '#value' => 'Effacer');
?>
Puis dans la fonction FORMID_submit(), tu mets un test du style :
<?phpif ($form_values['op'] == 'Effacer') {
// Traitements en cas d'effacement
}
elseif ($form_values['op'] == 'Enregistrer') {
// Traitements en cas d'enregistrement
}
?>
Je n'ai pas testé ce code, il est donc sous réserve de vérification.
Vincent
Je confirme, c'est
Permalien Soumis par Damien Tournoud le 6 Mai, 2007 - 12: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 8 Mai, 2007 - 00:37
Merci les amis,
J'ai réussi. J'ai utilisé la version proposé par drupalfrance.
Merci à tous qui ont participé dans cette discussion.