Comment créer une page qui permet d'afficher les données depuis la base, et changer l'état de ces données sur clique d'un bouton

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.

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, 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 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 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.

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 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 :

  • soit tu crées dans ton module une fonction de thème appelée theme_FORMID() (FORMID est à remplacer par l'id de TON formulaire).
  • soit tu utilises les attributs "#prefix" ou "#suffix" qui permettent d'afficher du HTML respectivement avant et après un champ de formulaire.

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 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 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

@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 :

<?php
if ($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.