Campo di valori illimitati: come nascondere un campo aggiuntivo nella modifica del nodo


9

Quando creo un nuovo nodo, ho questo campo di valori illimitati con il pulsante "Aggiungi nuovo elemento".

Campo Valori illimitati - Nuovo nodo

Va bene, meraviglioso. Ma quando modifico un nodo esistente, ottengo un valore aggiunto vuoto UNDESIRED per me: Campo Valori illimitati - Modifica nodo

Il mio vero caso riguarda un grande campo composto, ma ho pensato che usare questo piccolo campo come esempio sarebbe stato più facile da capire.

Esiste un modo per impedire che questo campo "extra" venga aggiunto in modo intrusivo?


2
Per chiarire, vuoi che non ci siano campi vuoti presentati al momento della modifica? Quindi per aggiungere un altro campo, sarebbero costretti a usare il pulsante "Aggiungi un altro elemento"?
tim.plunkett,

Sì, l'hai capito perfettamente.
Fidelix,

@Fidelix, hai trovato un modulo per farlo, o solo codice personalizzato a questo punto?
David Barratt,

@DavidBarratt solo codice personalizzato, temo.
Fidelix,

Risposte:


10

Questo funzionerebbe per tutti i moduli di modifica dei nodi:

/**
 * 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]);
}

È possibile "aggiungere" un nuovo campo vuoto in questo hook?
Fidelix,

Teoricamente, potresti. Qualcosa del genere $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];potrebbe funzionare.
tim.plunkett,

C'è un problema in questa soluzione. Se non esiste alcun valore e il delta massimo è 0 e si fa clic su Aggiungi un altro elemento, non verrà aggiunto un campo aggiuntivo. quindi quando fai di nuovo clic su Aggiungi un altro elemento, verrà aggiunto un campo aggiuntivo. Significa doppio clic richiesto per aggiungere un altro elemento se il nodo non ha valore rispetto a quel campo.
Ahmad,

3

Funzionerebbe per tutti i moduli di modifica dei nodi senza nemmeno specificare i nomi dei campi.

/**
 * 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]);

        }
      }
    }

  }
}

Stavo solo pensando che potevi controllare la cardinalità leggendo la risposta migliore e poi l'hai visto!
jowan sebastian,

Per evitare di rimuovere l'unico input di campo (se il campo non è obbligatorio):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro

2

È possibile scrivere il proprio modulo con un hook_form_FORM_ID_alter per rimuovere il campo indesiderato. Qualcosa di simile a...

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;
}

0

se dal punto di vista del backend non è possibile per ora, un'alternativa potrebbe essere la seguente Jquery. Questo codice rimuoverà solo la prima destinazione quando viene caricata la pagina e rimuoverà la destinazione solo quando l'utente aggiungerà i file, quindi non avrai problemi quando hai già dei file:

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

(metti prima del bodytag di chiusura della tua pagina.tpl.php)

Secondo il mio test, le immagini vengono caricate senza problemi e quando si modifica il nodo, vengono elencati tutti i file.

nota: in questo esempio 'field_test_file' è il nome del campo CCK, quindi ricordati di cambiare in base al nome del tuo campo cck.


Il mio commento sulla tua soluzione CSS è ancora valido: perché farlo quando potresti farlo con PHP? Vedi drupal.stackexchange.com/questions/10481/…
tim.plunkett

Ciao Tim, posso capire il tuo punto di vista, e in alcuni casi sono d'accordo. Se non sbaglio, immagino che i campi di file CCK utilizzino javascript per mostrare nuovi campi ed è una buona soluzione (se disabiliti questa funzione o non hai javascript, il modo backend / php è possibile come seconda alternativa). Inoltre, penso che sia utile conoscere alternative per risolvere lo stesso requisito.
cigotete,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.