Double champ de saisie avec CCK

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 cherche à créer un type de champ CCK double comprenant un textfield + un select.

Comme suggéré dans le post http://drupalfr.org/node/2213,
je me suis appuyé sur le module text.module et observé le code link.module pour voir comment gérer les deux champs de saisie et les valeurs à enregistrer dans la BDD.

Je m'y connais un brin en PHP mais peu en API Drupal. Après pas mal de sueurs et de recherches, j'arrive au résultat suivant:
- Je peux créer et configurer mon champ double dans un nouveau type de contenu. Je voulais que ce champ soit à valeurs multiple, ca marche.
- Je peux saisir le contenu dans le textfield et choisir l'option dans le select, c'est bien enregistré dans la BDD.

Maintenant plusieurs soucis:
- Quand je veux modifier le node créé, les valeurs enregistrées n'apparaissent pas dans mes champs.
La fonction en erreur est celle ci (modifiée sur text.module).
Le probleme vient de "foreach ($items as $data)" :

function motcle_widget($op, &$node, $field, &$node_field) {
  switch ($op) {

   case 'form':
  $form = array();
   $form[$field['field_name']] = array(
     '#type' => 'fieldset',
      '#title' => t($field['widget']['label']),
     '#weight' => $field['widget']['weight'],
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
        '#tree' => TRUE,
    );
     if ($field['multiple']) {
        $form[$field['field_name']]['#type'] = 'fieldset';
        $form[$field['field_name']]['#description'] = t($field['widget']['description']);
        $delta = 0;        print_r($field);
        foreach ($items as $data) {
          if ($data['motcle']) {  
              $form[$field['field_name']][$delta]['motcle'] = array(
                '#type' => 'textfield',
                '#title' => ($delta == 0) ? t($field['widget']['label']) : '',
                '#default_value' => $data['motcle'],
                '#required' => ($delta == 0) ? $field['required'] : FALSE,
                '#maxlength' => $field['max_length'] ? $field['max_length'] : NULL,
                '#weight' => $field['widget']['weight'],
              );
          $form[$field['field_name']][$delta]['typemotcle'] = array(
                  '#type' => 'select',
                '#title' => ($delta == 0) ? t('Type') : '',
               '#options' => motcle_allowed_values($field),
                  '#default_value' => $data['typemotcle'],
                '#required' => FALSE,
                 '#weight' => $field['widget']['weight']+1,
              );
            $delta++;
          }
        }
.......

  • Quand j'affiche le node, les valeurs de mes champs ne s'affichent pas. Quand je configure l'affichage de ce champs dans "Display Field", je n'ai que le choix "", alors que j'ai conservé les modes "Plain" et "Default".

function motcle_field_formatter_info() {
   return array(
    'default' => array(
      'label' => 'Default',
      'field types' => array('text'),
    ),
    'plain' => array(
      'label' => 'Plain text',
      'field types' => array('text'),
    ),
  );
}

/**
* Prepare an individual item for viewing in a browser.
*/

function motcle_field_formatter($field, $item, $formatter, $node) {
   if (!isset($item['motcle'])) {
    return '';
  }

  switch ($formatter) {
    case 'plain':
      $text = strip_tags($item['motcle']." - ".$item['typemotcle']);
      break;

    case 'default':
      $text = $item['motcle']." - ".$item['typemotcle'];
  }

    return check_plain($text);
}

Forum : 
Version de Drupal : 

dans motcle_field_formatter_info(), tu déclares des formatters pour des champs de type text. A la place, tu dois mettre quelque chose comme :

'field types' => array('motcle') // le nom du type de champ que ton module implémente, tel que déclaré dans ton hook_field_info().

Et l'erreur dans ton motcle_widget(), c'est que tu prends le paramètre $node_field, mais que le code de la fonction l'utilise sous le nom $items.

function motcle_widget($op, &$node, $field, &$items) {

devrait mieux marcher.

Effectivement ca marche beaucoup mieux avec $items à la place de $node_field!
Voila ce qui arrive quand on copie des bouts de code et qu'on fait pas attention aux arguments des fonctions! :)

Pour le reste, les modifications n'ont fonctionné qu'en effacant le champ existant et en en créant un nouveau.

Merci de ton aide!