Osadź formularz „dodaj węzeł” na stronie

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.

ousneo
źródło
1
Jeśli masz określone problemy z blokiem formularza, najlepszym miejscem do poszukiwania może być kolejka problemów dla tego modułu.
Jeremy French

Odpowiedzi:

28

Możesz użyć:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
Daniel Wehner
źródło
3
Jeśli pojawi się błąd, który 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 )
mbrakken
Jest sposób, aby umieścić to w bloku? Czy to musi być uwzględnione w pliku tpl.php?
Nie mogę użyć kodu dla formularza z elementami Ajax (na przykład: przesyłanie plików). Możliwe rozwiązanie
Dimetry,
@Dimetry zobacz moją odpowiedź na temat używania elementów Ajax w postaci osadzonego węzła.
Елин Й.
16

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_addfunkcji, skopiowałem kod i usunąłem drupal_set_title. Powyższy kod jest tym samym kodem co node_addfunkcja, 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';
}
Елин Й.
źródło
Czy Inline Entityform byłby alternatywą? Bawiłem się z modułem, ale nie byłem w stanie wyświetlić formularza dodawania węzła na interfejsie, tylko podczas edycji węzła możesz podać pole referencji encji, które wyświetla formularz dodawania węzła.
AlxVallejo
1
Inline Entityform służy do pól referencyjnych encji, co nie ma znaczenia dla tego pytania.
Елин Й.
1
Jeśli nie chcesz używać hook_menu_alter () do przesyłania plików itp., Możesz zamiast tego function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
dodać zmienną
@ ЕлинЙ. Czy twoja odpowiedź dotyczy tego pytania ?
Umair,
1
@Umair Moja odpowiedź dotyczy tylko dodania formularza węzła do strony. Nie prześle on formularza przez AJAX, ani nie zaktualizuje widoku. Można je jednak osiągnąć za pomocą AJAX Framework .
Елин Й.
0

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 returnopracowałem $form:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;
alec
źródło