ฉันกำลังมองหาวิธีการฝังแบบฟอร์ม "เพิ่มโหนด" ในหน้า Landing Page ฉันใช้Form Blockแต่ดูเหมือนว่าจะมีข้อผิดพลาดมากมายเนื่องจากฉันใช้รุ่นสแน็ปช็อตการพัฒนา
ฉันกำลังมองหาวิธีการฝังแบบฟอร์ม "เพิ่มโหนด" ในหน้า Landing Page ฉันใช้Form Blockแต่ดูเหมือนว่าจะมีข้อผิดพลาดมากมายเนื่องจากฉันใช้รุ่นสแน็ปช็อตการพัฒนา
คำตอบ:
คุณสามารถใช้ได้:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
node_add()
ไม่ได้กำหนดคุณจะต้องเพิ่มif (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }
ที่จุดเริ่มต้น ข้อมูลนี้มาจากที่นี่: ( kahthong.com/2012/01/01/embed-drupal-node-form-anywhere )
แม้ว่าคำตอบของ Daniel Wehner นั้นถูกต้องและได้ผลจริง ๆ แล้วฉันต้องการเพิ่มปัญหาทั่วไปสองอย่างที่ฉันเผชิญกับวิธีการนี้และวิธีแก้ไขปัญหาที่ฉันเอาชนะปัญหาเหล่านั้นได้ รหัสแรกของฉันจากนั้นคำอธิบาย:
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)
ทำไมฉันไม่ได้ด้วยวิธีนี้แทนแดเนียลที่เรียบง่ายnode_add
?
ปัญหาที่ 1: node_add()
ฟังก์ชั่นเปลี่ยนชื่อหน้าเป็น'ประเภทโหนด' สร้างซึ่งเป็นรหัสที่ยากในการทำงาน
วิธีแก้ปัญหาที่ 1: แทนการใช้ฟังก์ชั่นที่ผมได้คัดลอกโค้ดและลบnode_add
drupal_set_title
รหัสข้างต้นเป็นรหัสเดียวกับnode_add
ฟังก์ชั่นยกเว้นจากหนึ่งบรรทัดนี้
ปัญหาที่ 2: ในรูปแบบฝังฟังก์ชั่น ajax บางฟังก์ชั่นไม่ทำงาน ตัวอย่างเช่นถ้าคุณมีฟิลด์ที่สามารถมีค่าไม่ จำกัด ดังนั้นคุณจึงมีปุ่ม 'เพิ่มรายการอื่น' หรือหากคุณมีฟิลด์ไฟล์อัปโหลดในแบบฟอร์มของคุณพวกเขาจะไม่ทำงาน
วิธีแก้ปัญหาที่ 2: ในโมดูลที่กำหนดเองของคุณใช้สำหรับเส้นทางโทรอาแจ็กซ์และรวมถึงhook_menu_alter()
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'); }
หากฉันใช้รหัสคำตอบที่ยอมรับ ...
module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);
... ด้านในของฟังก์ชั่นการโทรกลับของหน้าprint drupal_render..
ผลลัพธ์นี้จะส่งผลให้หน้าเว็บที่ไม่มีการแยกส่วน
ดังนั้นแทนที่จะฉันเพียงแค่return
'เอ็ด$form
:
module_load_include('inc', 'node', 'node.pages');
$form = node_add('program_registration');
return $form;