Score:2

ส่งการโทรกลับแบบกำหนดเองเฉพาะเมื่อแบบฟอร์มถูกต้องเมื่ออยู่ในกล่องโต้ตอบ

ธง cg

ฉันกำลังพยายามสร้างโหนดในกล่องโต้ตอบด้วยลิงก์ต่อไปนี้:

ป้อนชื่อแบบฟอร์มการลงทะเบียนหรือ <a class="use-ajax" 
    data-dialog-options="{"width":800}" 
    data-dialog-type="modal" 
    href="/node/add/mycontenttype?enableAjaxSubmit=true">
    สร้างแบบฟอร์มการลงทะเบียนใหม่
</a>

การโทรกลับ _mymodule_close_dialog() ทำงานได้อย่างสมบูรณ์เมื่อไม่มีข้อผิดพลาดในการตรวจสอบ แต่เมื่อมีข้อผิดพลาด (เช่น ชื่อเรื่องว่างเปล่า) JS จะแสดงข้อผิดพลาดออกมา Uncaught TypeError: this.url ไม่ได้ถูกกำหนด.

ฉันสามารถกำจัดข้อผิดพลาด JS ได้โดย ป้องกันไม่ให้การดำเนินการของฟอร์มกลายเป็นปุ่มโมเดลแต่จากนั้นฟอร์มก็ล้มเหลวอย่างเงียบ ๆ

ฉันจะแสดงข้อความแสดงข้อผิดพลาดของแบบฟอร์มเมื่อสร้างโหนดในกล่องโต้ตอบได้อย่างไร

การโทรกลับ:

/**
 * ใช้ hook_form_BASE_FORM_ID_alter() สำหรับ \Drupal\node\NodeForm
 */
ฟังก์ชัน mymodule_form_node_mycontenttype_form_alter (&$form, FormStateInterface $form_state) {
    $enableAjaxSubmit = \Drupal::request()->query->get('enableAjaxSubmit');
    ถ้า (!empty($enableAjaxSubmit) && $enableAjaxSubmit === 'จริง') {    
      $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
      $form['#attached']['library'][] = 'core/jquery.form';

      $form['actions']['submit']['#attributes']['class'][] = 'use-ajax-submit';
      $form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';
    }
}

ใช้ Drupal\Core\Ajax\AjaxResponse;
ใช้ Drupal\Core\Ajax\CloseModalDialogCommand;
ใช้ Drupal\Core\Ajax\PrependCommand;
ใช้ Drupal\Core\Ajax\AlertCommand;

ฟังก์ชัน _mymodule_close_dialog (อาร์เรย์ &$form, FormStateInterface $form_state) {
  $response = ใหม่ AjaxResponse();

  // ถ้า (!$form_state->getErrors()) {
    $response->addCommand(ใหม่ CloseModalDialogCommand());
  // }

  $messages = ['#type' => 'status_messages'];
  $response->addCommand(new PrependCommand('.some-wrapper', $messages));

  $form_state->setResponse($ตอบกลับ);
}

ฉันตาม:

อัปเดต

เปลี่ยน:

$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';

ถึง:

$form['actions']['submit']['#ajax']['callback'] = '_mymodule_close_dialog'; // เปลี่ยนชื่อฟังก์ชันเพื่อลบ `_`
$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add', ['node_type' => $contentType]) ;
$form['actions']['submit']['#ajax']['ตัวเลือก'] = [
  'แบบสอบถาม' => [
    \Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => จริง,
  ]
];

แต่ได้รับข้อผิดพลาด PHP:

Symfony\Component\HttpKernel\Exception\HttpException: การเรียกกลับ #ajax ที่ระบุว่างเปล่าหรือไม่สามารถเรียกได้ ใน Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse()

เมื่อฉัน แก้ไขจุดบกพร่อง ($ triggering_element) ใน FormAjaxResponseBuilder ไฟล์องค์ประกอบการส่งไม่มี #อาแจ็กซ์ คีย์หรือ ใช้-ajax-ส่ง ระดับ. ดังนั้น องค์ประกอบทริกเกอร์จะไม่ถูกเปลี่ยนแปลงในท้ายที่สุด

ความคิดใด ๆ ?

Score:0
ธง ua

และอีกเล็กน้อย: https://www.drupal.org/project/drupal/issues/2934463#comment-13180158

คุณพลาดการเพิ่มส่วนนี้ในการแก้ไขของคุณ ซึ่งควรแก้ไขปัญหาที่ไม่ได้กำหนด URL ของคุณ

$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add');
$form['actions']['submit']['#ajax']['ตัวเลือก'] = [
  'แบบสอบถาม' => [
    Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => จริง,
  ]
];
Chris Happy avatar
cg flag
ฉันลองเพิ่มโค้ดด้านล่าง `$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';` แต่แล้วมันก็หยุดบันทึก ไม่ใช่รหัสด้านบนสำหรับเปิดแบบฟอร์ม `node.add` (และไม่ใช่สำหรับเมื่อบันทึกแบบฟอร์มโหนด) หรือฉันไม่เข้าใจอะไรบางอย่าง?
Chris Happy avatar
cg flag
ฉันได้เพิ่มการอัปเดตด้วยโซลูชันของคุณแล้ว น่าเสียดายที่ Drupal ไม่ได้ใช้องค์ประกอบที่ถูกแก้ไขด้วยปุ่ม `#ajax`

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา