ฝังฟอร์ม“ โหนดเพิ่ม” ในหน้า


19

ฉันกำลังมองหาวิธีการฝังแบบฟอร์ม "เพิ่มโหนด" ในหน้า Landing Page ฉันใช้Form Blockแต่ดูเหมือนว่าจะมีข้อผิดพลาดมากมายเนื่องจากฉันใช้รุ่นสแน็ปช็อตการพัฒนา


1
หากคุณมีปัญหาเฉพาะกับบล็อกแบบฟอร์มสถานที่ที่ดีที่สุดในการดูอาจเป็นคิวปัญหาสำหรับโมดูลนั้น
Jeremy French

คำตอบ:


28

คุณสามารถใช้ได้:

module_load_include('inc', 'node', 'node.pages');
$form = node_add('nodetype');
print drupal_render($form);

3
หากคุณได้รับข้อผิดพลาดที่node_add()ไม่ได้กำหนดคุณจะต้องเพิ่มif (!function_exists('node_add')) { module_load_include('inc', 'node', 'node.pages'); }ที่จุดเริ่มต้น ข้อมูลนี้มาจากที่นี่: ( kahthong.com/2012/01/01/embed-drupal-node-form-anywhere )
mbrakken

มีวิธีใส่สิ่งนี้ในบล็อกหรือไม่? หรือสิ่งนี้จะต้องรวมอยู่ในไฟล์ tpl.php หรือไม่

ฉันไม่สามารถใช้รหัสสำหรับแบบฟอร์มที่มีองค์ประกอบ Ajax (ตัวอย่างเช่น: อัปโหลดไฟล์) วิธีแก้ปัญหาที่เป็นไปได้
Dimetry

@Dimetry เห็นคำตอบของฉันสำหรับการใช้องค์ประกอบ Ajax ในรูปแบบโหนดที่ฝังตัว
ЕлинЙ

16

แม้ว่าคำตอบของ 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';
}

Inline Entityform จะเป็นทางเลือกหรือไม่? ฉันได้เล่นกับโมดูล แต่ไม่สามารถแสดงแบบฟอร์มเพิ่มโหนดในส่วนหน้าเฉพาะเมื่อคุณแก้ไขโหนดคุณสามารถให้เขตข้อมูลเอนทิตีที่แสดงแบบฟอร์มเพิ่มโหนด
AlxVallejo

1
Inline Entityform ใช้สำหรับฟิลด์การอ้างอิงเอนทิตีซึ่งไม่เกี่ยวข้องกับคำถามนี้
ЕлинЙ

1
หากคุณไม่ต้องการใช้ hook_menu_alter () สำหรับการอัปโหลดไฟล์ ฯลฯ คุณสามารถเพิ่มการรวมไว้ในแบบฟอร์มการเปลี่ยนแปลงสำหรับรูปแบบโหนดแทน: function YOURMODULE_form_NODETYPE_node_form_alter(&$form, &$form_state) { form_load_include($form_state, 'inc', 'node', 'node.pages'); }
joe_flash

@ ЕлинЙ คำตอบของคุณนำไปใช้กับคำถามนี้หรือไม่?
Umair

1
@Umair คำตอบของฉันเป็นเพียงการเพิ่มฟอร์มโหนดให้กับหน้า มันจะไม่ส่งแบบฟอร์มผ่าน AJAX และจะไม่อัปเดตมุมมอง อย่างไรก็ตามคุณสามารถใช้AJAX Frameworkได้
ЕлинЙ

0

หากฉันใช้รหัสคำตอบที่ยอมรับ ...

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.