Buduję typ zawartości paneli CTools (tj. Rzecz, którą wstawiasz do paneli podczas dodawania treści, a nie rodzaj węzła) i próbuję użyć #ajax
atrybutu elementu formularza, aby ustawić niektóre wartości domyślne. Zobacz kod poniżej.
Nawiasem my_module_content_type_edit_form($form, &$form_state)
mówiąc, wszystko to znajduje się w wywołaniu typu zawartości .
$form['link_type'] = array(
'#type' => 'radios',
'#title' => t('Link Type'),
'#ajax' => array(
'callback' => 'my_module_set_target'
),
'#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
'#options' => array('none'=>t('No Link'), 'internal'=>t('Internal Link'), 'external'=>t('External Link'), 'document'=>t('Document Link')),
);
Moje oddzwonienie jest następujące.
function my_module_set_target($form, $form_state) {
watchdog("Test", "Testing callback", array(), WATCHDOG_ALERT);
$form['link_target']['#default_value'] = '_parent';
return $form['link_target']['#default_value'];
}
Niezależnie od tego, czy zwrot, który sugeruję, rzeczywiście zadziała, watchdog()
nawet nie zadziała.
Wiem, że CTools robi dziwne rzeczy z AJAX, ale to nie może być takie dziwne. Czy masz pomysł na to, jak bym zrobił to, co chcę?
Dzięki!
Alternatywnie: Jak ustawić wartość domyślną na podstawie wartości poprzedniej opcji formularza?
Wymyśliłem, jak to zrobić, ale jest to trochę hack - tworzysz nowe pola formularza dla każdego rozwidlenia zależności. Następnie możesz scalić wartości razem hook_content_type_edit_form_submit()
, używając dowolnej, która odpowiada wartości wybranej dla komponentu, który początkowo rozwidlał wszystko.
Pozostawiam pytanie otwarte, ponieważ ja (i, szczerze mówiąc, każdy programista, z którym pracuję) naprawdę chcę dobrego sposobu na użycie AJAX w tych formularzach edycji typu zawartości Panelu.
Aktualizacja: Wygląda na to, że nie możesz robić rzeczy z #attached.
$form['link'][$i] = array(
'#type' => 'fieldset',
'#title' => t('Link #@num', array('@num' => $i)),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attached' => array(
'js' => array(
'alert("Yay.");', 'inline'
),
)
);
źródło
ctools_add_js();
lubdrupal_add_js();
na końcuhook_content_type_edit_form();
. Jeśli po prostu robisz proste rzeczy związane z interfejsem użytkownika, wydaje się, że to może być najlepsze połączenie (przynajmniej dopóki ktoś nie odpowie poprawnie na to pytanie).Odpowiedzi:
Krótka odpowiedź: powinieneś użyć #ajax ['ścieżka'].
Długa odpowiedź:
Posiadanie wywołania zwrotnego ajax nie pomaga, ponieważ ctools tworzą różne formy afaik. Wywołanie zwrotne wykonane przez system / ajax nie może znaleźć pełnej definicji formularza, dlatego nie może znaleźć elementu do przetworzenia żądania ajax. Użycie #ajax [ścieżka] wyzwala po prostu element menu.
Możesz to sprawdzić samodzielnie, zrzucając formularz, używając #ajax [oddzwanianie]
Zmodyfikowałem simpleecontext_content_type_edit_form dodając widżet autouzupełniania użytkownika i pole, które działają :)
Kiedy teraz używasz ścieżki #ajax, musisz dodać element menu, tak jak mi się podobało
Nitpick o #attached [js]: wstawiany js powinien mieć wartość key =>, taką jak:
Użyłem Firebuga, aby sprawdzić wynikową wartość, a nie wynikowy efekt. Mam więc nadzieję, że to pomoże rozwiązać problem.
źródło
Miałem podobny problem, gdy chciałem dołączyć typ elementu Media do wtyczki typu zawartości CTools, która również używa ajax do wybierania obrazu.
Używa własnego ustawienia „ścieżki” ajax, zamiast ustawienia „wywołania zwrotnego”, ale podczas wybierania obrazu formularz został przebudowany bez elementu media w całości.
Śledziłem to do faktu, że drupal_rebuild_form nie mógł znaleźć ani funkcji otoki formularza CTools, ani funkcji formularza ustawień rzeczywistych. Naprawiłem to, dodając następujące wiersze kodu do formularza ustawień narzędzi:
Być może brakuje mi czegoś oczywistego, dlaczego pliki dołączeń nie są ładowane, ale włączenie ich ręcznie rozwiązało problem.
źródło
ze swojej strony musiałem napisać funkcję opakowania formularza w pliku .module i ręcznie dołączyć okienko (w którym zdefiniowano oryginalną treść formularza) w następujący sposób:
Teraz, podczas wywoływania ajax, Drupal jest w stanie pobrać mój formularz, dzięki czemu mogę użyć standardowego interfejsu API formularza AJAX.
źródło