Champ de valeurs illimitées - comment masquer un champ supplémentaire lors de la modification d'un nœud

9

Lors de la création d'un nouveau nœud, j'ai ce champ de valeurs illimitées avec le bouton "Ajouter un nouvel élément".

Champ Valeurs illimitées - Nouveau nœud

C'est OK, merveilleux. Mais lorsque je modifie un nœud existant, j'obtiens pour moi une valeur supplémentaire vide INDÉSIRABLE : Champ Valeurs illimitées - Modifier le nœud

Mon cas réel est celui d'un grand champ composé, mais je pensais que l'utilisation de ce petit champ comme exemple serait plus facile à comprendre.

Existe-t-il un moyen d'empêcher ce champ "supplémentaire" d'être ajouté de manière intrusive?

Fidelix
la source
2
Pour clarifier, vous voulez qu'il n'y ait aucun champ vide présenté lors de la modification? Donc, pour ajouter un autre champ, ils seraient obligés d'utiliser le bouton "Ajouter un autre élément"?
tim.plunkett
Oui, tu l'as parfaitement compris.
Fidelix
@Fidelix, avez-vous trouvé un module pour ce faire, ou seulement du code personnalisé à ce stade?
David Barratt
@DavidBarratt uniquement du code personnalisé, je le crains.
Fidelix

Réponses:

10

Cela fonctionnerait pour tous les formulaires d'édition de nœud:

/**
 * Implements hook_form_BASE_FORM_ID_alter().
 */
function MYMODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  $field_name = 'field_YOURFIELD';

  if (empty($form[$field_name])) {
    return;
  }

  $field_language = $form[$field_name]['#language'];
  $max_delta = $form[$field_name][$field_language]['#max_delta'];
  unset($form[$field_name][$field_language][$max_delta]);
}
tim.plunkett
la source
Est-il possible "d'ajouter" un nouveau champ vide dans ce hook?
Fidelix
Théoriquement, vous pourriez. Quelque chose comme ça $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];pourrait marcher.
tim.plunkett
Il y a un problème dans cette solution. S'il n'y a pas de valeur et que le delta max est 0 et que vous cliquez sur ajouter un autre élément, il n'ajoutera pas de champ supplémentaire. puis lorsque vous cliquez à nouveau sur ajouter un autre élément, il ajoutera un champ supplémentaire. Cela signifie qu'un double-clic est requis pour ajouter un autre élément si le nœud n'a aucune valeur par rapport à ce champ.
Ahmad
3

Cela fonctionnerait pour tous les formulaires de modification de nœud sans même spécifier les noms de champ.

/**
 * Implements hook_form_NODE_FORM_alter().
 */
function MY_MODULE_form_node_form_alter(&$form, &$form_state, $form_id) {
  if (isset($form['#node']->nid) && $form['#node']->nid > 0) {
    $form_fields = array_keys($form);

    foreach ($form_fields as $index => $field_name) {
      if (substr($field_name, 0, 6) == "field_") { // Check if the field is a custom field
        $field_language = $form[$field_name]['#language'];
        if (isset($form[$field_name][$field_language]['#cardinality']) && 
            $form[$field_name][$form[$field_name]['#language']]['#cardinality'] == -1) {

          if (empty($form[$field_name])) {
            continue;
          }

          $max_delta = $form[$field_name][$field_language]['#max_delta'];
          unset($form[$field_name][$field_language][$max_delta]);

        }
      }
    }

  }
}
Vikas
la source
Je pensais juste que vous pouviez vérifier la cardinalité en lisant la première réponse, puis vous avez vu que vous l'avez fait!
jowan sebastian
Pour éviter de supprimer la seule entrée de champ (si le champ n'est pas obligatoire):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro
2

Vous pouvez écrire votre propre module avec un hook_form_FORM_ID_alter pour supprimer le champ indésirable. Quelque chose comme...

function my_module_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
  // Do checks here to make sure this is an existing node...

  // Get the index of the last input element in this field
  $last_index = $form['field_field_name'][LANGUAGE_NONE]['#max_delta'];
  // Get rid of the last input element
  unset($form['field_field_name'][LANGUAGE_NONE][$last_index]);
  // Move back the last index so that any new elements are added correctly
  $form['field_field_name'][LANGUAGE_NONE]['#max_delta'] = $last_index-1;
}
nmc
la source
0

si d'un point de vue backend n'est pas possible pour le moment, une alternative pourrait être le Jquery suivant. Ce code supprimera uniquement la première cible lors du chargement de la page et ne supprimera la cible que lorsque l'utilisateur ajoutera des fichiers, vous n'aurez donc aucun problème lorsque vous avez déjà des fichiers:

<script>
if(!$('div.filefield-file-info').length){
$('table#field_test_file_values tr.even:eq(0)').remove();
}
</script>

(mettre avant la bodybalise de fermeture de votre page.tpl.php)

Selon mon test, les images sont téléchargées sans problème et lorsque vous modifiez le nœud, tous les fichiers sont répertoriés.

Remarque: dans cet exemple, 'field_test_file' est le nom du champ CCK, alors n'oubliez pas de changer en fonction du nom de votre champ cck.

cigotete
la source
Mon commentaire sur votre solution CSS est toujours d'actualité: pourquoi faire cela alors que vous pouvez le faire avec PHP? Voir drupal.stackexchange.com/questions/10481/…
tim.plunkett
Bonjour Tim, je peux comprendre votre point de vue et je suis d'accord dans certains cas. Si je ne me trompe pas, je suppose que les champs du fichier CCK utilisent du javascript pour afficher de nouveaux champs, et est une bonne solution (si vous désactivez cette fonctionnalité, ou si vous n'avez pas le javascript, la méthode backend / php est possible comme deuxième alternative). De plus, je pense qu'il est bon de connaître des alternatives pour résoudre la même exigence.
cigotete