Je cherche un moyen d'incorporer un formulaire "node add" sur une page de destination. J'utilisais le bloc de formulaire , mais il semble apporter de nombreuses erreurs car j'utilisais une version de capture instantanée de développement.
Je cherche un moyen d'incorporer un formulaire "node add" sur une page de destination. J'utilisais le bloc de formulaire , mais il semble apporter de nombreuses erreurs car j'utilisais une version de capture instantanée de développement.
Réponses:
Vous pouvez utiliser:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
n'est pas définie, vous voudrez l'ajouter if (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
au début. Cette information vient d'ici: ( kahthong.com/2012/01/embed-drupal-node-form-anywhere )
Bien que la réponse de Daniel Wehner soit absolument correcte et fonctionne, je voulais ajouter deux problèmes courants rencontrés avec cette approche et des solutions de contournement pour surmonter ces problèmes. D'abord mon code, puis les explications:
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)
Pourquoi je l'ai fait de cette façon, au lieu du simple de Daniel node_add
?
Problème 1: la node_add()
fonction change le titre de la page en Créer un «type de nœud» , c'est codé en dur dans la fonction.
Solution de contournement 1: au lieu d'utiliser la node_add
fonction, j'ai copié le code et supprimé le drupal_set_title
. Le code ci-dessus est le même code que la node_add
fonction, sauf à partir de cette seule ligne.
Problème 2: Dans le formulaire intégré, certaines fonctions ajax ne fonctionnaient pas. Par exemple, si vous avez un champ qui peut avoir des valeurs illimitées, de sorte que vous avez un bouton «Ajouter un autre élément», ou si vous avez un champ de téléchargement de fichier dans votre formulaire, ils ne fonctionnent pas.
Solution de contournement 2: dans votre module personnalisé, implémentez hook_menu_alter()
pour les chemins d'appel ajax et incluez 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'); }
Si j'utilise le code de réponse accepté ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... à l'intérieur d'une fonction de rappel de page, print drupal_render..
cela se traduit par une page complètement sans thème (d'aspect cassé).
Au lieu de cela, je viens return
de rédiger le $form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;