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?