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.
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ć:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
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:
global $user;
module_load_include('inc', 'node', 'node.pages');
$node = (object) array(
'uid' => $user->uid,
'name' => (isset($user->name) ? $user->name : ''),
'type' => 'YOUR_NODE_TYPE',
'language' => LANGUAGE_NONE,
);
$form = drupal_get_form('YOUR_NODE_TYPE . '_node_form', $node);
print drupal_render($form)
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ąłem drupal_set_title
. Powyższy kod jest tym samym kodem co node_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łącz node.pages.inc
.
function YOURMODULE_menu_alter(&$items) {
$items['file/ajax']['file path'] = drupal_get_path('module', 'node');
$items['file/ajax']['file'] = 'node.pages.inc';
$items['system/ajax']['file path'] = drupal_get_path('module', 'node');
$items['system/ajax']['file'] = 'node.pages.inc';
}
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 ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... 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
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;