Score:1

การตรวจสอบความถูกต้องของแบบฟอร์มแก้ไขเอนทิตีแบบกำหนดเอง

ธง lc

ฉันมีเอนทิตีแบบกำหนดเอง โดยที่แทนที่จะใช้วิธีปกติในการระบุตัวเลือกการแก้ไขแบบฟอร์มด้วย setDisplayOptions('แบบฟอร์ม' และอาศัย ContentEntityForm หากต้องการสร้างแบบฟอร์มแก้ไขสำหรับฉัน ฉันต้องทำแบบฟอร์มเอง สร้างแบบฟอร์ม () (ฉันมีการโต้ตอบ Ajax ระหว่างฟิลด์ที่สต็อกไม่สามารถให้ได้) ใช้งานได้ดี เพียงแต่ว่าฉันไม่สามารถเรียกใช้การตรวจสอบความถูกต้องได้เหมือนกับแบบฟอร์มสต็อค มีข้อ จำกัด อยู่ที่นั่นและถ้าฉันแทนที่:

ฟังก์ชันสาธารณะ validateForm (อาร์เรย์ &$form, FormStateInterface $form_state) {
  $entity = parent::validateForm($form, $form_state);
  $violations = $entity->validate();
  foreach (การละเมิด $ เป็น $v) {
    dpm($v->getMessage());
  }
  ส่งคืน $entity;
}

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

Score:0
ธง us

เอนทิตีผู้ใช้เป็นหนึ่งในเอนทิตีหลักของ Drupal ที่เพิ่มองค์ประกอบของฟอร์มในคลาสฟอร์มเอนทิตีโดยทางโปรแกรม และยังคงใช้ข้อจำกัดในการตรวจสอบความถูกต้อง
แบบฟอร์มบัญชี::แบบฟอร์ม() เพิ่มองค์ประกอบแบบฟอร์มและ ผู้ใช้::baseFieldDefinitions() เพิ่มข้อจำกัดการตรวจสอบฟิลด์เอนทิตี
(แบบฟอร์มบัญชี เป็นคลาสที่ขยายโดย แบบฟอร์มโปรไฟล์ และ แบบฟอร์มลงทะเบียน คลาสซึ่งเป็นสองในสามคลาสของฟอร์มเอนทิตีที่ใช้สำหรับเอนทิตีผู้ใช้)

  // ข้อมูลเกี่ยวกับบัญชี.
  $แบบฟอร์ม['บัญชี'] = [
    '#type' => 'คอนเทนเนอร์',
    '#น้ำหนัก' => -10,
  ];

  // ฟิลด์เมลไม่จำเป็นหากบัญชีเดิมไม่มีการตั้งค่าเมล
  // และผู้ใช้ที่ดำเนินการแก้ไขมีสิทธิ์ 'ดูแลผู้ใช้'
  // สิ่งนี้ทำให้ผู้ใช้ที่ไม่มีที่อยู่อีเมลสามารถแก้ไขและลบได้
  // ดูที่ \Drupal\user\Plugin\Validation\Constraint\UserMailRequired
  $form['account']['mail'] = [
    '#type' => 'อีเมล',
    '#title' => $this->t('ที่อยู่อีเมล'),
    '#description' => $this->t('ที่อยู่อีเมลที่ถูกต้อง อีเมลทั้งหมดจากระบบจะถูกส่งไปยังที่อยู่นี้ ที่อยู่อีเมลนี้จะไม่เปิดเผยต่อสาธารณะและจะใช้ในกรณีที่คุณต้องการรับรหัสผ่านใหม่เท่านั้น หรือต้องการรับข่าวสารหรือการแจ้งเตือนทางอีเมล'),
    '#required' => !(!$account->getEmail() && $user->hasPermission('ดูแลผู้ใช้')),
    '#default_value' => !$register ? $account->getEmail() : '',
  ];

  // แสดงเฉพาะฟิลด์ชื่อในแบบฟอร์มการลงทะเบียน หรือผู้ใช้สามารถเปลี่ยนชื่อผู้ใช้ของตัวเองได้
  $แบบฟอร์ม['บัญชี']['ชื่อ'] = [
    '#type' => 'ช่องข้อความ',
    '#title' => $this->t('ชื่อผู้ใช้'),
    '#maxlength' => ส่วนติดต่อผู้ใช้::USERNAME_MAX_LENGTH,
    '#description' => $this->t("อนุญาตให้ใช้อักขระพิเศษหลายตัว รวมถึงช่องว่าง จุด (.) ยัติภังค์ (-) เครื่องหมายอัญประกาศเดี่ยว (') เครื่องหมายขีดล่าง (_) และเครื่องหมาย @"),
    '#required' => จริง,
    '#attributes' => [
      'คลาส' => [
        'ชื่อผู้ใช้',
      ]
      'แก้ไขอัตโนมัติ' => 'ปิด',
      'autocapitalize' => 'ปิด',
      'spellcheck' => 'เท็จ',
    ]
    '#default_value' => !$register ? $account->getAccountName() : '',
    '#access' => $account->name->access('แก้ไข'),
  ];
  $fields['name'] = BaseFieldDefinition::create('สตริง')
    ->setLabel(t('ชื่อ'))
    ->setDescription(t('ชื่อของผู้ใช้รายนี้'))
    -> setRequired (จริง)
    ->ชุดข้อ จำกัด ([
    // ไม่มีข้อจำกัดความยาวที่นี่ เนื่องจากข้อจำกัดชื่อผู้ใช้ยังครอบคลุม
    // นั่น.
    'ชื่อผู้ใช้' => [],
    'ชื่อผู้ใช้ที่ไม่ซ้ำใคร' => [],
  ]);
  $fields['ชื่อ']
    ->getItemDefinition()
    ->setClass('\Drupal\user\UserNameItem');
  $fields['pass'] = BaseFieldDefinition::create('รหัสผ่าน')
    ->setLabel(t('รหัสผ่าน'))
    ->setDescription(t('รหัสผ่านของผู้ใช้รายนี้ (แฮช)'))
    ->addConstraint('ProtectedUserField');

เดอะ แบบฟอร์มบัญชี, แบบฟอร์มโปรไฟล์และ แบบฟอร์มลงทะเบียน คลาสซึ่งขยาย [ContentEntityForm][6] ชั้นไม่ขยาย [ContentEntityForm::validateForm()][7] แม้ว่า พวกเขาใช้วิธีการที่จำเป็นสำหรับ Drupal เพื่อทำความเข้าใจว่าฟิลด์ใดมีการแก้ไขและควรแสดงการละเมิดใด: [รูปแบบบัญชี::getEditedFieldNames()][8] และ [รูปแบบบัญชี::flagViolations()`]6.

ฟังก์ชันที่ได้รับการป้องกัน getEditedFieldNames (FormStateInterface $form_state) {
  ส่งคืน array_merge([
    'ชื่อ',
    'ผ่าน',
    'จดหมาย'
    'เขตเวลา',
    'รหัสภาษา'
    'preferred_langcode',
    'preferred_admin_langcode',
  ], parent::getEditedFieldNames($form_state));
}
ฟังก์ชันที่ได้รับการป้องกัน flagViolations (EntityConstraintViolationListInterface $violations, array $form, FormStateInterface $form_state) {
  // ตั้งค่าสถานะการละเมิดฟิลด์ที่ไม่ได้จัดการโดยการแสดงแบบฟอร์มด้วยตนเอง นี้
  // จำเป็นเนื่องจากแบบฟอร์มเอนทิตีแสดงเฉพาะการละเมิดการตั้งค่าสถานะสำหรับฟิลด์
  // อยู่ในจอแสดงผล
  $field_names = [
    'ชื่อ',
    'ผ่าน',
    'จดหมาย'
    'เขตเวลา',
    'รหัสภาษา'
    'preferred_langcode',
    'preferred_admin_langcode',
  ];
  foreach ($violations->getByFields($field_names) as $violation) {
    list($field_name) = ระเบิด('.', $violation->getPropertyPath(), 2);
    $form_state->setErrorByName($field_name, $violation->getMessage());
  }
  parent::flagViolations($violations, $form, $form_state);
}

ContentEntityForm::validateForm() แสดงเฉพาะข้อผิดพลาดในการตรวจสอบสำหรับองค์ประกอบแบบฟอร์มที่รายงานให้แก้ไข ซึ่งหมายความว่าหากไม่ส่งคืนชื่อองค์ประกอบฟอร์มจาก รูปแบบบัญชี::getEditedFieldNames() หรือ ContentEntityForm::getEditedFieldNames()องค์ประกอบฟอร์มนั้นและฟิลด์เอนทิตีที่เกี่ยวข้องจะไม่ถือว่าแก้ไข

เพื่อตอบคำถาม: ได้ คุณสามารถเพิ่มองค์ประกอบฟอร์มใน รูปร่าง() เมธอดของคลาสฟอร์มเอนทิตีและใช้ข้อจำกัดการตรวจสอบ (และการตรวจสอบ "อัตโนมัติ") ตราบใดที่คลาสฟอร์มเอนทิตีใช้ getEditedFieldNames() และ ธงการละเมิด () วิธีการ

lc flag
ดีมาก ขอบคุณ ฉันจะไปเส้นทางนี้

โพสต์คำตอบ

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