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:
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 $item
finit 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?
la source
Le Module Hierarchical Select est au moins très proche de ce que vous voulez réaliser. Son widget semble un peu différent mais fait essentiellement le même travail et serait un bon point de départ pour la personnalisation. Jetez un œil à la démonstration de taxonomie Lieux que j'ai visités .
Une autre option pourrait être le module de saisie semi - automatique de luxe .
la source
Je viens de trouver Taxonomy Other module qui peut convenir à vos besoins.
Pour le port Drupal 7, vérifiez: Port Taxonomy Other to D7 ( lien direct ).
la source