Szukam sposobu na osadzenie formularza „dodaj węzeł” na stronie docelowej. Korzystałem z Form Block , ale wydaje się, że przynosi wiele błędów, ponieważ korzystałem z wersji migawki programowania.
19
Szukam sposobu na osadzenie formularza „dodaj węzeł” na stronie docelowej. Korzystałem z Form Block , ale wydaje się, że przynosi wiele błędów, ponieważ korzystałem z wersji migawki programowania.
Odpowiedzi:
Możesz użyć:
źródło
node_add()
jest niezdefiniowany, będziesz chciał dodaćif (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
na początku. Informacja ta pochodzi stąd: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )Chociaż Daniel Wehner za odpowiedź jest całkowicie poprawny i działa, chciałem dodać dwa typowe problemy, ja do czynienia z takim podejściem i obejścia, jak przezwyciężyć te problemy. Najpierw mój kod, a potem wyjaśnienia:
Dlaczego zrobiłem to w ten sposób, zamiast prostego Daniela
node_add
?Problem 1:
node_add()
funkcja zmienia tytuł strony na Utwórz „typ węzła” , jest na stałe zakodowany w funkcji.Obejście 1: Zamiast korzystać z
node_add
funkcji, skopiowałem kod i usunąłemdrupal_set_title
. Powyższy kod jest tym samym kodem conode_add
funkcja, z wyjątkiem tego jednego wiersza.Problem 2: W osadzonej formie niektóre funkcje ajax nie działały. Na przykład, jeśli masz pole, które może mieć nieograniczone wartości, tak że masz przycisk „Dodaj kolejny element”, lub jeśli masz pole pliku do przesłania w formularzu, nie działają.
Obejście 2: W niestandardowym module zaimplementuj
hook_menu_alter()
ścieżki wywoływania ajax i dołącznode.pages.inc
.źródło
function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
Jeśli użyję kodu zaakceptowanej odpowiedzi ...
... wewnątrz funkcji wywołania zwrotnego strony powoduje to, że strona
print drupal_render..
jest całkowicie pozbawiona tematów (wygląda na zepsutą).Zamiast tego właśnie
return
opracowałem$form
:źródło