drupal

Drupal 7 Supprimer une entrée dans un champ de type multifield

De base, Drupal 7 gère mal la suppression des entrées dans un champ de type multifield.

De base, Drupal 7 gère mal la suppression des entrées dans un champ de type multifield.

Il faut en effet effacer toutes les valeurs de l'entrée puis sauvegarder le node afin d'effacer l'entrée en question ce qui est tout sauf ergonomique pour un utilisateur lambda.

L'astuce ci-dessous explique comment rajouter un boutton supprimer qui permetrtra de supprimer la dernière entrée saisie à chaque fois.

Cette solution est loin d'être la plus propre ou la plus optimisé mais elle a le mérite de marcher dans le cas d'un champ crée programmatiquement.

function hook_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element)
{
if ($form_state['field'][$instance['field_name']][$langcode]['items_count'] != 0 && $form_state['field'][$instance['field_name']][$langcode]['items_count'] == $delta)
{
$element['delete_item'] = array(
'#type' => 'submit',
'#name' => strtr($delta, '-', '_') . '_delete_item',
'#value' => t('Delete item'),
'#attributes' => array('class' => array('field-delete-item-submit')),
'#limit_validation_errors' => array(),
'#submit' => array('field_myfield_delete_item_submit'),
);
}

return $element;
}

function field_myfield_delete_item_submit($form, &$form_state)
{
$form_state['field']['field_myfield'][$form['#node']->language]['items_count']--;
$form_state['rebuild'] = TRUE;
}

 

Quelques explications :
On rajoute un nouveau bouton de type submit dans le "hook_field_widget_form" puis on implemente la fonction "field_myfield_delete_item_submit" dans laquelle on décremente le nombre d'éléments dans le formulaire puis on le reconstruit.
PS : on utilise le node->language plutôt que le langage dans le $form car c'est celui qui est pris en comtpe dans le tableau de construction des fields.