Widget de terme de taxonomie «Ajouter plus»


8

J'essaie de créer un widget de champ similaire au widget de référence de terme normal avec une différence clé. L'utilisateur doit pouvoir ajouter plusieurs nouveaux termes de taxonomie en même temps, cela peut mieux le démontrer:

entrez la description de l'image ici

Je suis arrivé à un point où la fonctionnalité est similaire à ce que fournissent les modules taxonomie / options / liste (c.-à-d. Les cases à cocher / radios sont affichées, l'enregistrement, etc.)

Voici une partie importante du code que j'utilise dans hook_field_widget_form():

 $element += array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

Ce qui me jette ici, c'est que $ element n'est pas votre tableau de formulaire habituel, donc je ne sais pas comment ajouter le champ de texte et le bouton et - d'autant plus que leurs valeurs ne sont pas censées être enregistrées. Quelle est la meilleure façon d'ajouter ces champs à mon widget?

Quant à l'ajout du Javascript nécessaire, ai-je raison de penser que je devrais utiliser #ajax qui appelle une fonction qui reconstruit les #options pour les cases à cocher?

Merci d'avance!

EDIT - Ma question initiale était assez vague, voici quelques détails sur ce que j'ai essayé:

  $element += array(
    '#type' => 'fieldset',
    '#delta' => $delta,
  );

  $element['value'] = array(
    '#type' => $multiple ? 'checkboxes' : 'radios',
    '#default_value' => $multiple ? $default_value : reset($default_value),
    '#options' => $options,
    '#value_key' => $value_key,
    '#element_validate' => array('options_field_widget_validate'),
    '#properties' => $properties,
  );

  $element['text'] = array(
    '#type' => 'textfield',
    '#title' => t('Add another'),
    '#weight' => 5,
  );

Ceci est une fusion de divers exemples que j'ai vus et semble me rapprocher. Le problème est que lorsque je soumets le formulaire d'entité, j'obtiens l'erreur suivante:

Remarque: Index non défini: tid dans taxonomy_field_is_empty () (ligne 1402 des modules \ taxonomy \ taxonomy.module).

J'ai examiné de plus près cette fonction et elle s'attend $itemà avoir la structure $item = array('tid', 2). Lors de l'utilisation du code ci-dessus, il semble y avoir un delta venant de quelque part et la structure de $itemfinit par être $item = array(0, array('tid', 2). Je ne peux pas savoir d'où vient «0»?

UNE AUTRE MODIFICATION

J'ai pu corriger l'erreur ci-dessus avec le code suivant en modifiant $ element comme ceci:

$element += array(
    '#type' => 'fieldset',
    '#process' => array('taxonomy_free_entry_ignore_parent'),
);

et en ajoutant la fonction:

function taxonomy_free_entry_ignore_parent(&$form, &$form_state, $complete) {
  array_pop($form['#parents']);
  return $form;
}

Lorsque j'enregistre l'entité, je reçois un message me disant qu'elle a été enregistrée. Lorsque je vérifie la table du champ, il n'est pas enregistré. Qu'est-ce que je fais mal?

Réponses:


2

Je suis sûr que vous pouvez le faire hook_field_widget_form()(ce qui, je suppose, est l'endroit où se trouve votre code actuel) en ajoutant simplement un élément enfant à votre élément existant, par exemple

$element['text'] = array(
  '#type' => 'textfield',
  '#title' => 'Title',
  // etc...
);

Si cela ne fonctionne pas, je sais que cela fonctionnera certainement si vous utilisez hook_field_widget_form_alter().

Par exemple, voici une petite fonction qui active le altchamp pour un type de champ Image à l'aide du widget Media Selector (pour une raison quelconque, il n'est pas activé par défaut):

function media_image_attributes_field_widget_form_alter(&$element, &$form_state, &$context) {
  if ($context['field']['type'] == 'image') {
    $element['alt'] = array(
      '#type' => 'textfield',
      '#title' => 'Image Description',
      '#weight' => 10000,
      '#default_value' => count($element['#default_value']) ? $element['#default_value']['alt'] : ''
    );
  }
}

En ce qui concerne la fonctionnalité ajax, je pense que vous allez certainement dans la bonne direction. Je pense que le module Exemple de champ dans Exemples a un exemple de code qui pourrait aider.


Merci pour la réponse, je l'ai votée positivement car elle m'a donné de bonnes informations mais je n'y ai pas encore répondu! Consultez ma modification qui donne plus d'informations sur ce que j'ai essayé grâce à votre réponse.
splatio

@splat avez-vous pu implémenter un widget fonctionnel? Seriez-vous prêt à le partager?
Joe Beuckman

Désolé Joe, je n'ai pas pu résoudre ce problème et j'ai fini par utiliser une approche complexe et différente! Si vous travaillez, postez-le ici car je serais intéressé de savoir comment pour l'avenir. Je l'accepterais aussi volontiers comme réponse.
splatio

@splatio Pouvez-vous donner quelques informations sur votre approche alternative?
vfclists


0

Je viens de trouver Taxonomy Other module qui peut convenir à vos besoins.

Il s'agit d'un module simple permettant d'ajouter un «- Autre -» facultatif aux listes de sélection de taxonomie. Il permet aux utilisateurs disposant des autorisations appropriées de créer de nouveaux termes.

Pour le port Drupal 7, vérifiez: Port Taxonomy Other to D7 ( lien direct ).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.