określić elementy formularza $, które mają zostać wykluczone z wyświetlania?

20

Chcę ukryć niektóre elementy w formularzu za pomocą form_alter lub pliku szablonu. Czytałem gdzieś, że w Drupal 7 możemy określić elementy $ form, aby nie były wyświetlane w formie, ale nie pamiętam! Nie unset (), ale inna funkcja!

Serjas
źródło

Odpowiedzi:

29

Używanie unset()nie jest dobrym rozwiązaniem dla formularzy (jak myślę, że wiesz), ponieważ nigdy nie wiadomo, jakie procedury obsługi przesyłania / sprawdzania poprawności mogą oczekiwać, że element nieokreślony będzie istniał podczas ich przetwarzania. Może to prowadzić do niepożądanych błędów.

Istnieją trzy metody bezpiecznego ukrywania elementu formularza

  • Użyj '#type' => 'value'na elemencie, co spowoduje, że wartość elementu będzie nadal przekazywana do funkcji wysyłania / sprawdzania poprawności z jego #valuenormalną wartością. To jest moja preferowana metoda.
  • Użyj '#access' => FALSEna elemencie, aby zaznaczyć, że nie powinien być wyświetlany na ekranie.
  • Użyj '#type' => 'hidden'zgodnie z sugestią Bartka (chociaż użycie tego zależy od przypadku użycia; wyobrażam sobie, że jeśli próbujesz ukryć wartość elementu formularza, nie chcesz wyprowadzać go w formularzu jako ukrytego wejścia).
Clive
źródło
zapomniałem hide () .
Yusef
2
@zhilevan hide()nie powinien być używany w elementach formularza, może łatwo zepsuć cały proces wysyłania formularza, ponieważ weryfikatory są nadal uruchamiane dla elementu. Na przykład, jeśli jesteś hide($form['title']);w formularzu węzła, nigdy nie będziesz mógł przesłać formularza, ponieważ pole tytułu jest wymagane, ale nie zostanie podana wartość. 3 powyższe metody są najlepsze do użycia, w tej kolejności :)
Clive
@ Dziękuję, znam powyższe metody, moje pytanie było związane z hide () myślę (wciąż nie pamiętam funkcji) .. w każdym razie proszę odnieść się do mojego komentarza w pierwszej odpowiedzi, dlaczego drupal_render($form['base']['prices']['sell_price'])nie działa?
Serjas
Czy ten kod w pliku szablonu, który ma formę formularza? Jeśli nie, powodem, dla którego nie działa, jest to, że chociaż możesz wydrukować dowolny element renderujący na ekranie drupal_render(), nie otrzymasz żadnych tagów / tokenów / formularzy. chyba że wypiszesz całą $formtablicę
Clive
użyłem motywu haka i print_r ($ form), a nawet drupal_render ($ form ['tytuł']) działają, problemem są elementy pod zakładkami vertcal!
Serjas
4

Jeśli używasz pliku szablonu, możesz ukryć różne rzeczy za pomocą hide () .

Jeśli chcesz ukryć element formularza hook_form_alter, unset()może być najlepszą opcją.

Jeśli ma to być tylko wartość, możesz użyć również „#type” => „hidden” .

Bart
źródło
hide jest lepszą metodą na usunięcie elementu.
Yusef
To, co próbowałem osiągnąć, to niestandardowa forma węzła produktu Ubsercart, wszystko, co chciałem wyświetlić, to cena_sprzedania i ukryć inne elementy, takie jak wysyłka, waga itp. Ale drupal_render($form['base']['prices']['sell_price'])wyświetli formę, ale nie oszczędza!
Serjas
4

Odkryłem, że użycie #access do false może uszkodzić niektóre formularze, jeśli zostanie użyte w przyciskach przesyłania lub podobnych. W takich przypadkach użyłem CSS do ukrycia elementów:

$form['basic']['submit']['#attributes']['class'][] = 'element-hidden';

Po prostu inna opcja.

Tom James
źródło