Jestem pewien, że to funkcja motywu. Która funkcja motywu ma być użyta, to pytanie. :)
akalata
Ach, jesteś tam.
chrisjlee
Myślę, że możesz także użyć klawisza #attribute do zdefiniowania klasy
Mika A.
@Mika A. Dotyczy to tylko znacznika <input>, który chciałbym zmienić klasę opakowania (<div>).
chrisjlee
Odpowiedzi:
5
Możesz zastąpić theme_form_element()normalnie, jeśli chcesz zmienić temat globalnie. Jeśli chcesz zmodyfikować tylko jeden określony element formularza, mam świadomość kilku opcji.
Możesz zarejestrować nową funkcję motywu dla określonego typu elementu formularza, który Cię interesuje (np. Pole tekstowe). Następnie tworzysz tę funkcję motywu (na podstawie oryginału, np. theme_textfield()), Ale to nie wywołuje theme('form_element', ...)na końcu (możesz obsługiwać zarówno opakowanie, jak i element w funkcji jednego motywu, lub możesz utworzyć osobną funkcję motywu opakowania i użyj tego). Na koniec dodajesz #themewłaściwość do określonego elementu formularza, a ten element otrzyma niestandardowe motywy.
Możesz utworzyć plik szablonu o nazwie, form_element.tpl.phpktóry ma tylko domyślne zachowanie, theme_form_element()a następnie użyć go, hook_preprocess_form_element()aby dodać sugestię szablonu. Następnie tworzysz nowy szablon, który pasuje do sugestii. Często słyszysz, jak ludzie wspominają, że szablony są nieco wolniejsze niż funkcje, a przy tak często używanym wywołaniu motywu mogę sobie wyobrazić, że ludzie nie chcą używać szablonu. Jednak sam nigdy nie dokonałem żadnych pomiarów. Ponadto musisz mieć wystarczającą ilość kontekstu na etapie wstępnego przetwarzania, aby móc przedstawić sugestię.
Jest to dobre alternatywne rozwiązanie - nie dodawaj klasy do zawijającego div, po prostu zawijaj div zawijający we własnym divie, a możesz zastosować dowolne klasy.
Felix Eve
3
Aby zmienić „opakowanie”, musisz zastąpić element_formularz. Zasadniczo wszystkie elementy formularza są renderowane za pomocą kompozycji theme_form_element($element,$value);form_element (plik form.inc)
Aby zmienić sposób renderowania elementów formularza, wystarczy skopiować tę funkcję do folderu template.php i zmienić jej nazwę na: phptemplate_form_element($element,$value)
teraz możesz wprowadzić dowolne zmiany i zostaną one użyte zamiast oryginalnej funkcji
Ta odpowiedź pomogła mi, ale zauważ, że dotyczy ona w szczególności Drupala 8.xi późniejszych.
Czy Martin
0
Co ważne, theme_form_element zmodyfikuje tylko div bezpośredniego opakowania nadrzędnego i może to nie być zamierzony cel dla efektów CSS.
[Chociaż nie jest to programowe, jeśli ktoś chce po prostu zastosować klasę do górnego opakowania pola węzła (to jest opakowanie, opakowanie, opakowanie), można przypuszczać, że można użyć modułu „Grupa pól”, wybierając opcję „Zarządzaj polami” dla określonego typu treści i wybierz „Dodaj nową grupę” jako prosty DIV. Następnie można usunąć etykietę i przypisać pożądane klasy do dodatkowego opakowania (ale teraz mamy jeszcze więcej opakowań) - z nieograniczonym zagnieżdżaniem]
function my_module_form_alter(&$form,&$form_state, $form_id){
$form['account']['mail']['#my_theme_wrapper_attributes']['class'][]='form-field--inline';}
Zdarzają się przypadki, w których ani #prefix/#suffixnie #attributes => array('class')dają pożądanych rezultatów. Moim szczególnym przypadkiem jest dodanie klasy do div otoki otoki ajax wokół elementu managed_file. #prefix/#suffixtworzy nowy kontener i #attributes/'class'modyfikuje klasę elementu wewnętrznego, a nie najbardziej zewnętrznego.
Normalny skrajny div jest po prostu
<divid="edit-doc1--XX-ajax-wrapper">
który jest trudny do celowania w CSS. Mogę kierować [id^="edit-doc"]albo [id$="-ajax-wrapper"]ale oba z tych cel więcej niż tylko elementy chciałem.
Rozwiązaniem, które wymyśliłem, jest dodanie #processelementu do formularza i ręczne manipulowanie kodem elementu. Oto #processatrybut dodany do deklaracji elementu formularza:
function mymodule_managed_file_process($element,&$form_state, $form){// Call the original function to perform its processing.
$element = file_managed_file_process($element, $form_state, $form);// Add our own class for theming.
$element['#prefix']= str_replace('id=','class="managed-file-wrapper" id=',
$element['#prefix']);return $element;}
Poleganie na zamianie ciągów nie jest zbyt przenośne, więc używaj str_replacena własne ryzyko. Ten kod jednak rzeczywiście zmienia skrajne DIV, aby dodać niezbędną klasę:
Odpowiedzi:
Możesz zastąpić
theme_form_element()
normalnie, jeśli chcesz zmienić temat globalnie. Jeśli chcesz zmodyfikować tylko jeden określony element formularza, mam świadomość kilku opcji.Możesz zarejestrować nową funkcję motywu dla określonego typu elementu formularza, który Cię interesuje (np. Pole tekstowe). Następnie tworzysz tę funkcję motywu (na podstawie oryginału, np.
theme_textfield()
), Ale to nie wywołujetheme('form_element', ...)
na końcu (możesz obsługiwać zarówno opakowanie, jak i element w funkcji jednego motywu, lub możesz utworzyć osobną funkcję motywu opakowania i użyj tego). Na koniec dodajesz#theme
właściwość do określonego elementu formularza, a ten element otrzyma niestandardowe motywy.Możesz utworzyć plik szablonu o nazwie,
form_element.tpl.php
który ma tylko domyślne zachowanie,theme_form_element()
a następnie użyć go,hook_preprocess_form_element()
aby dodać sugestię szablonu. Następnie tworzysz nowy szablon, który pasuje do sugestii. Często słyszysz, jak ludzie wspominają, że szablony są nieco wolniejsze niż funkcje, a przy tak często używanym wywołaniu motywu mogę sobie wyobrazić, że ludzie nie chcą używać szablonu. Jednak sam nigdy nie dokonałem żadnych pomiarów. Ponadto musisz mieć wystarczającą ilość kontekstu na etapie wstępnego przetwarzania, aby móc przedstawić sugestię.źródło
Wiem, że to bardzo stary wątek, ale uczyłem się, jak zmieniać elementy formularza i dodawać klasy. Zacząłem tworzyć niestandardowy moduł:
źródło
Aby zmienić „opakowanie”, musisz zastąpić element_formularz. Zasadniczo wszystkie elementy formularza są renderowane za pomocą kompozycji
theme_form_element($element,$value);
form_element (plik form.inc)Aby zmienić sposób renderowania elementów formularza, wystarczy skopiować tę funkcję do folderu template.php i zmienić jej nazwę na:
phptemplate_form_element($element,$value)
teraz możesz wprowadzić dowolne zmiany i zostaną one użyte zamiast oryginalnej funkcji
theme_form_element($element,$value);
z form.incphptemplate_form_element($element,$value)
źródło
Możesz użyć właściwości wrapper_attributes .
źródło
Co ważne, theme_form_element zmodyfikuje tylko div bezpośredniego opakowania nadrzędnego i może to nie być zamierzony cel dla efektów CSS.
[Chociaż nie jest to programowe, jeśli ktoś chce po prostu zastosować klasę do górnego opakowania pola węzła (to jest opakowanie, opakowanie, opakowanie), można przypuszczać, że można użyć modułu „Grupa pól”, wybierając opcję „Zarządzaj polami” dla określonego typu treści i wybierz „Dodaj nową grupę” jako prosty DIV. Następnie można usunąć etykietę i przypisać pożądane klasy do dodatkowego opakowania (ale teraz mamy jeszcze więcej opakowań) - z nieograniczonym zagnieżdżaniem]
źródło
Możesz użyć
i to go obejmie
źródło
Ustaw atrybuty opakowania konfigurowalne!
Utwórz własną funkcję motywu elementu formularza w swoim motywie ...
sites/all/themes/MY_THEME/theme/form-element.theme.inc
Następnie możesz robić takie rzeczy ...
źródło
Zdarzają się przypadki, w których ani
#prefix/#suffix
nie#attributes => array('class')
dają pożądanych rezultatów. Moim szczególnym przypadkiem jest dodanie klasy do div otoki otoki ajax wokół elementu managed_file.#prefix/#suffix
tworzy nowy kontener i#attributes/'class'
modyfikuje klasę elementu wewnętrznego, a nie najbardziej zewnętrznego.Normalny skrajny div jest po prostu
który jest trudny do celowania w CSS. Mogę kierować
[id^="edit-doc"]
albo[id$="-ajax-wrapper"]
ale oba z tych cel więcej niż tylko elementy chciałem.Rozwiązaniem, które wymyśliłem, jest dodanie
#process
elementu do formularza i ręczne manipulowanie kodem elementu. Oto#process
atrybut dodany do deklaracji elementu formularza:A oto
mymodule_managed_file_process()
funkcja:Poleganie na zamianie ciągów nie jest zbyt przenośne, więc używaj
str_replace
na własne ryzyko. Ten kod jednak rzeczywiście zmienia skrajne DIV, aby dodać niezbędną klasę:źródło
Możesz użyć powyższego sposobu, aby dodać klasę do elementu formularza.
źródło