[Résolu] hook_form_alter enregistrement de contenu lors de l'édition

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,
je suis entrain de d'implémenter un formulaire sur certain type de contenu lors de l'édition.

j'ai donc fait ceci pour mon formulaire 'pataglou";
J'ai besoin de plusieurs FieldSet pour grouper les informations.

<?php
 
$form
['pataglou'] = array(
   
'#type' => 'fieldset',
   
'#title' => t('Personnaliser cet objet'),
  );

$form['pataglou']['e_h'] = array(
   
'#type' => 'fieldset',
   
'#title' => t('Le Heros'),
    
'#collapsible'=>true,

   );

$form['pataglou']['e_h']['t_peau'] = array(
   
'#type' => 'select',
   
'#title' => t('type de peau de l\'enfant'),
   
'#options' =>$t_peau,
   
'#multiple' => true,
    );
?>

Une fois ce morceau de code activé j'ai bien un fieldset contenant un fieldset contenant ma selectList avec mes valeurs de base contenues dans la variable $t_peau.

Maintenant, lorsque je sauve cet article puis que je le réédite je souhaite que les valeurs précédemment sélectionnées dans la selectList le soient par défault lors de la réédition.
Je ne trouve pas la syntaxe appropriée pour récupérer ces valeurs.

Auriez vous des conseils ?

Quelqu'un peut-il m'expliquer ou les informations sont enregistrées dans drupal ?
Merci d'avance et bonne journée.

Forum : 
Version de Drupal : 

Oui j'ai bien tenté.

Deux manières même :

<?php
  
'#default_value'=>variable_get('pataglou', array('')),


  
et

  
'#default_value'=>variable_get('pataglou_'.$form['#node']->type, array('')),
?>

Mais ça ne renvoie rien.

Je ne pense pas.
La variable t_peau contient un array destiné à l'affichage de ma selectList.
Je cherche à récupérer les valeurs de cette liste sélectionnées dans mon noeud.

Exemple :
t_peau contient "un","deux" et "trois"

A l'affichage ma selectList contiendra donc 3 entrées "un", "deux" et "trois".

Je sélectionne "deux" et "trois" dans ma liste et j'enregistre.

Lorsque je vais rééditer mon article il faut donc que "deux" et "trois" soit sélectionnées par défaut.
Ce sont ces données que je cherche à récupérer.

Désolé, je suis passé à côté de ta réposne…

En effet il vaudrait mieux s'attaquer à

<?php
  
'#default_value'=>variable_get('t_peau', array('')),
 
?>

Mais ça n'affiche rien non plus. J'ai tenté bien d'autres choses genre :

<?php
  
'#default_value'=>$form['pataglou']['e_h']['t_peau'],
 
?>
<?php
  
'#default_value'=>variable_get('t_peau_'.$form['#node']->nid, array('')),
 
?>

On dirait que je n'ai pas les compétences nécessaires pour t'aider.

Cela dit, y'a toujours la méthode "on y va à la tronçonneuse", qui se matérialiserait ici par un bon gros var_dump de $conf qui semble être la variable globale utilisée par variable_get(). On sait jamais ;-)

Salut,

On comprend pas bien où tu les mets ces champs : sur un formulaire de noeud ou dans un formulaire d'admin ?

Seuls les champs ajoutés aux formulaires d'admin sont enregistrés automatiquement dans la table variables (en gros). Installe le module devel, active le bloc 'development' et clique sur le lien 'variable editor' dans ce bloc, ça te permettra de voir la liste de toutes les variables et leur valeur, et de voir si la tienne y est.

Si tu as ajouté ces champs dans un formulaire de noeud, c'est ta responsabilité de créer une table et le SQL qui va bien pour les enregistrer (le hook_nodeapi() te permet de savoir quand le noeud est sauvegardé, et donc quand exécuter ton SQL).

Ils sont placés dans un formulaire de noeud uniquement lors de la création ou l'édition.

Je viens d'installer Devel et ma variable n'est pas dedans.
Je vais donc faire appel à un enregistrement dans une table.

Je pensais que lors de la création d'un formulaire avec form_alter les variables étaient automatiquement enregistrées.
Comme dans cet exemple :
http://planete.drupalfr.org/node/1006

Merci pour ta réponse.

L'exemple auquel tu fais référence parle "d'étendre le formulaire de configuration d'un type de contenu", autrement dit de rajouter des champs dans un formulaire d'admin. Dans ce cas, comme dit plus haut, les nouveaux champs sont enregistrés automatiquement.

Mais si on parle d'un formulaire de noeud (à l'adresse node/add/XXX), l'enregistrement des nouveaux champs ne se fait pas automatiquement.

arf, je bloque sur autre chose maintenant…

si j'ai un champs de type checkboxes dans mon formulaire avec 3 possibilités:
un
deux
trois

comment stocker dans ma base de données un array des valeurs sélectionnées.
du genre array('deux','trois') :
a:2:{i:1;s:1:"deux";i:2;s:1:"trois";}}

et non un array conventionnel renvoyé par $form_state['values']['macheckboxes'] de type :
a:2:{i:1;s:1:"1";i:2;s:1:"2";}}
qui ne stock que les valeur 1 ou 0 des chekboxes cochées ?

Tu as plusieurs possibilités :

1) Soit tu enregistres le array au format sérialisé (a:2:{i:1;s:1:»deux»;i:2;s:1:»trois»;}}) et tu le désérialises au moment de le charger, histoire de le reconvertir en tableau PHP (cherche dans la doc PHP les commandes pour sérialiser / désérialiser).

Dans ta table, tu n'auras donc qu'un seul enregistrement, quel que soit le nombre de valeurs dans l'
array :

NID     | VALEURS
----------------------
18      | (a:2:{i:1;s:1:»deux»;i:2;s:1:»trois»;}})

2) Soit tu enregistres autant de lignes qu'il y a de valeurs dans ton array. Ta table ressemblerait alors à ça :

NID     | VALEUR
----------------------
18      | deux
18      | trois

La deuxième solution est un peu plus compliquée à mettre en oeuvre, mais plus élégante.

PS. Sérialiser, ça veut dire convertir une variable en chaîne de caractère. Désérialiser, c'est le processus inverse.

ok, j'ai compris, moi je sérialize et desialize dans une seule ligne en une seule ligne (la manière la moins élégante).

Toutefois la commande $form_state[‘values’][‘macheckboxes’] me fait cet array :
a:3:{i:0;i:0;i:1;i:1;i:2;i:0;}
Cet array ne contient que les valeurs 0 ou 1 (case cochée ou non) de mes 3 entrées et non directement les 'titres' des cases cochés…

Je stocke donc dans ma base cet array qui ne contient pas les 'titres' 'un' 'deux' et 'trois';