Pole nieograniczonych wartości - jak ukryć dodatkowe pole przy edycji węzła

9

Podczas tworzenia nowego węzła mam to pole nieograniczonych wartości za pomocą przycisku „Dodaj nowy element”.

Pole Nieograniczone wartości - Nowy węzeł

W porządku, wspaniale. Ale kiedy edytuję istniejący węzeł, otrzymuję dla mnie NIEZADOWOLONĄ pustą dodatkową wartość dodaną: Pole Nieograniczone wartości - Edytuj węzeł

Mój prawdziwy przypadek dotyczy dużego złożonego pola, ale pomyślałem, że użycie tego małego pola jako przykładu byłoby łatwiejsze do zrozumienia.

Czy mogę zapobiec ingerencji w to „dodatkowe” pole?

Fidelix
źródło
2
Aby to wyjaśnić, chcesz, aby podczas edycji nie było pustego pola? Aby dodać kolejne pole, byliby zmuszeni użyć przycisku „Dodaj kolejny element”?
tim.plunkett
Tak, doskonale to zrozumiałeś.
Fidelix,
@ Fidelix, czy znalazłeś moduł do wykonania tej czynności, czy tylko niestandardowy kod w tym momencie?
David Barratt
@DavidBarratt tylko niestandardowy kod, obawiam się.
Fidelix,

Odpowiedzi:

10

To działałoby dla wszystkich formularzy edycji węzłów:

/**
 * 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
źródło
Czy w tym haku można „dodać” nowe puste pole?
Fidelix,
Teoretycznie możesz. Coś takiego $form[$field_name][$field_language][$max_delta + 1] = $form[$field_name][$field_language][$max_delta];może działać.
tim.plunkett
W tym rozwiązaniu jest problem. Jeśli nie ma wartości, a maksymalna delta wynosi 0 i klikniesz Dodaj kolejny element, nie doda to dodatkowego pola. następnie, gdy klikniesz ponownie, dodaj kolejny element, a następnie dodasz dodatkowe pole. Oznacza to, że wymagane jest podwójne kliknięcie, aby dodać kolejny element, jeśli węzeł nie ma wartości względem tego pola.
Ahmad
3

To działałoby dla wszystkich formularzy edycji węzłów, nawet bez podawania nazw pól.

/**
 * 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
źródło
Myślałem, że możesz sprawdzić liczność czytając najlepszą odpowiedź, a potem zobaczyłem, że to zrobiłeś!
Jowan Sebastian
Aby uniknąć usunięcia jedynego pola wejściowego (jeśli pole nie jest wymagane):if ($max_delta > 0) { unset($form[$field_name][$field_language][$max_delta]); }
quotesBro
2

Możesz napisać własny moduł za pomocą hook_form_FORM_ID_alter, aby usunąć niechciane pole. Coś jak...

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
źródło
0

jeśli z perspektywy zaplecza nie jest na razie możliwe, alternatywą może być następująca Jquery. Ten kod usunie tylko pierwszy cel po załadowaniu strony i usunie cel tylko wtedy, gdy użytkownik doda pliki, więc nie będziesz mieć problemów, gdy już masz pliki:

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

(postawiony przed body tagiem zamykającym page.tpl.php)

Zgodnie z moim testem obrazy są przesyłane bez problemów, a podczas edycji węzła wyświetlane są wszystkie pliki.

Uwaga: w tym przykładzie „plik_testu_pola” to nazwa pola CCK, więc pamiętaj, aby zmienić zgodnie z nazwą swojego pola cck.

cigotete
źródło
Mój komentarz na temat twojego rozwiązania CSS wciąż jest ważny: po co to robić, skoro możesz to zrobić za pomocą PHP? Zobacz drupal.stackexchange.com/questions/10481/…
tim.plunkett
Witaj Tim, rozumiem twój punkt widzenia i w niektórych przypadkach zgadzam się. Jeśli się nie mylę, sądzę, że pola pliku CCK używają javascript do wyświetlania nowych pól i jest dobrym rozwiązaniem (jeśli wyłączysz tę funkcję lub nie masz javascript, sposób backend / php jest możliwy jak druga alternatywa). Ponadto uważam, że dobrze jest znać alternatywy, aby rozwiązać ten sam wymóg.
cigotete