เอนทิตีผู้ใช้เป็นหนึ่งในเอนทิตีหลักของ 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()
และ ธงการละเมิด ()
วิธีการ