Score:0

โยนข้อผิดพลาดสำหรับฟิลด์ที่ต้องการใน hook_form_alter?

ธง cn

ฉันมีประเภทโหนดที่ผู้ใช้ที่รับรองความถูกต้องสามารถสร้างได้ ในแบบฟอร์มสร้างโหนด ฉันได้เพิ่มช่องทำเครื่องหมายข้อกำหนดในการให้บริการผ่านแบบฟอร์มเบ็ดดังนี้:

ฟังก์ชัน themename_form_alter(&$form, &$form_state, $form_id) {
  ถ้า ($form_id == 'node_nodetype_form') {
    $form['field_tos_accept'] = อาร์เรย์(
      '#type' => 'ช่องทำเครื่องหมาย',
      '#title' => t('ฉันยอมรับเงื่อนไขการบริการ'),
      '#น้ำหนัก' => '999',
      '#required' => จริง,
    );
  }
}

สิ่งนี้ทำให้ฉันสามารถทำเครื่องหมายในช่องนี้ในแบบฟอร์มสร้างโหนดได้ แต่ไม่ใช่ในรูปแบบแก้ไขโหนดเนื่องจากไม่จำเป็นต้องใช้ เมื่อฉันเพิ่ม

'#required_error' => t('โปรดยอมรับข้อกำหนดในการให้บริการ'), 

ในความเข้าใจของฉันสิ่งนี้ควรส่งข้อความแสดงข้อผิดพลาดเมื่อส่งแบบฟอร์ม แต่สถานะที่จำเป็นของฟิลด์จะป้องกันไม่ให้ส่งแบบฟอร์ม ดังนั้นจึงไม่มีข้อความแสดงข้อผิดพลาดเกิดขึ้น

มีวิธีการตั้งค่าใน form_alter หรือไม่? หรือฉันควรตรวจสอบสถานะช่องทำเครื่องหมายผ่าน JS อะไรจะถือว่าเป็นแนวปฏิบัติที่ดีที่สุด? ขอบคุณล่วงหน้า!

apaderno avatar
us flag
`#required_error` คือข้อผิดพลาดที่แสดงเมื่อมีการตรวจสอบความถูกต้องของแบบฟอร์มและจำเป็นต้องมีองค์ประกอบของแบบฟอร์ม แต่ผู้ใช้ไม่ได้ป้อนค่าใดๆ `#required` ใช้เพื่อหมายความว่าผู้ใช้ต้องป้อนค่าสำหรับองค์ประกอบแบบฟอร์มนั้น ทั้งคู่ไม่ได้ป้องกันการส่งแบบฟอร์ม ตราบใดที่ผู้ใช้ให้ค่าสำหรับองค์ประกอบฟอร์มนั้น ฟอร์มจะถูกส่ง
apaderno avatar
us flag
นอกจากนี้ หากคุณเพิ่มช่องทำเครื่องหมายเฉพาะเมื่อสร้างโหนด แต่ไม่ใช่เมื่อแก้ไขโหนด แสดงว่าคุณกำลังใช้โค้ดมากกว่าที่คำถามแสดงอยู่
Berry Dingle avatar
cn flag
@apaderno ฉันใช้เพียงรหัสด้านบนในไฟล์ themename.theme ของฉัน แต่เนื่องจากฉันเชื่อมต่อกับ node-nodetype-form และไม่ได้อยู่ใน node-nodetype-edit-form มันจึงแสดงเฉพาะในแบบฟอร์มเพิ่ม/สร้างโหนดเท่านั้น และไม่อยู่ในแบบฟอร์มแก้ไข คุณมีสิทธิ์เกี่ยวกับการส่ง สถานะที่กำหนดไม่ได้ป้องกันการส่งแบบฟอร์ม แต่ทริกเกอร์การตรวจสอบฟิลด์ HTML5 เริ่มต้นซึ่งฉันไม่เห็นเพราะฉันสร้างปุ่มสลับจากอินพุตช่องทำเครื่องหมายเริ่มต้น เดาว่าฉันจะทำใน JS และโยนข้อผิดพลาดเมื่อคลิกปุ่มส่ง แต่ไม่ได้เลือกช่องทำเครื่องหมาย
apaderno avatar
us flag
แบบฟอร์มสำหรับแก้ไขโหนดเป็นแบบฟอร์มเดียวกับที่ใช้ในการสร้างโหนด ซึ่งใช้โดยคลาส `Drupal\node\NodeForm` หากคุณต้องการเพิ่มองค์ประกอบฟอร์มเฉพาะเมื่อโหนดถูกสร้างขึ้น คุณควรเพิ่มโค้ดที่คล้ายกับโค้ดต่อไปนี้: `$node = $form_state->getFormObject()->getEntity(); ถ้า ($node && $node->isNew()) { /* กำลังสร้างโหนด */ }`
Score:1
ธง cn

มีวิธีการตั้งค่าใน form_alter หรือไม่? หรือฉันควรตรวจสอบสถานะช่องทำเครื่องหมายผ่าน JS

คุณสามารถแทนที่ #ที่จำเป็น โดยการตั้งค่าตัวจัดการการตรวจสอบความถูกต้องแบบกำหนดเองในรูปแบบ alter hook หากคุณต้องการสร้างข้อความแสดงข้อผิดพลาดฝั่งเซิร์ฟเวอร์:

$form_state->setErrorByName('field_tos_accept', $error_message);

เมื่อฉันเพิ่ม '#required_error' สิ่งนี้ควร - ในความเข้าใจของฉัน - ส่งข้อความแสดงข้อผิดพลาดเมื่อส่งแบบฟอร์ม

#required_error' เปิดตัวในปี 2554 แต่เมื่อ Drupal 8 เปิดตัวดูเหมือนว่าจะหยุดทำงานในเบราว์เซอร์ที่รองรับการตรวจสอบความถูกต้องของแบบฟอร์ม HTML5 ดังนั้นจึงไม่เคยนำมาใช้จริง ๆ

อย่างไรก็ตาม คุณสามารถใช้แอตทริบิวต์ฟอร์ม HTML5 ปรับปรุงใหม่ เพื่อปิดใช้งานการตรวจสอบแบบฟอร์มฝั่งไคลเอ็นต์ จากนั้นคุณสมบัตินี้จะใช้งานได้อีกครั้ง และคุณจะได้รับข้อความแสดงข้อผิดพลาดที่กำหนดเองโดยไม่มีตัวจัดการการตรวจสอบความถูกต้องแบบกำหนดเอง:

ฟังก์ชัน themename_form_alter(&$form, &$form_state, $form_id) {
  // สำหรับฟอร์มเอนทิตี $form_id ประกอบด้วย
  // ENTITY_TYPE_BUNDLE_FORM_MODE_form
  // BUNDLE ก็ต่อเมื่อเอนทิตีมีบันเดิล
  // FORM_MODE เฉพาะในกรณีที่ไม่ใช่ค่าเริ่มต้น
  // ตัวอย่าง:
  // node_article_edit_form - โหนดแก้ไขแบบฟอร์มสำหรับบทความประเภทเนื้อหา
  // node_page_form - โหนดสร้างแบบฟอร์มสำหรับหน้าประเภทเนื้อหา
  // โหนดใช้สำหรับสร้างฟอร์มโหมดฟอร์มเริ่มต้น
  ถ้า ($form_id == 'node_nodetype_form') {
    $form['#attributes']['novalidate'] = 'novalidate';
    $แบบฟอร์ม['field_tos_accept'] = [
      '#type' => 'ช่องทำเครื่องหมาย',
      '#title' => t('ฉันยอมรับเงื่อนไขการบริการ'),
      '#น้ำหนัก' => '999',
      '#required' => จริง,
      '#required_error' => t('โปรดยอมรับข้อกำหนดในการให้บริการ'), 
    ];
  }
}

ดู https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-novalidate

Berry Dingle avatar
cn flag
ว้าว - ขอบคุณมาก! นี่คือสิ่งที่ฉันกำลังมองหาและใช้งานได้ตามที่ต้องการ ขอบคุณมากอีกครั้ง!

โพสต์คำตอบ

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