Thực thể Người dùng là một trong những thực thể cốt lõi của Drupal bổ sung các thành phần biểu mẫu theo chương trình trong lớp biểu mẫu thực thể của chúng và vẫn sử dụng các ràng buộc xác thực.
AccountForm::form()
thêm các yếu tố hình thức và Người dùng::baseFieldDefinitions()
thêm các ràng buộc xác thực vào các trường thực thể.
(Biểu mẫu tài khoản
là lớp mở rộng bởi Mẫu hồ sơ cá nhân
và Mẫu đăng ký
các lớp, là hai trong số ba lớp biểu mẫu thực thể được sử dụng cho thực thể Người dùng.)
// Thông tin tài khoản.
$form['account'] = [
'#type' => 'thùng chứa',
'#cân nặng' => -10,
];
// Trường thư KHÔNG bắt buộc nếu tài khoản ban đầu không có thư được đặt
// và người dùng thực hiện chỉnh sửa có quyền 'quản trị người dùng'.
// Điều này cho phép người dùng không có địa chỉ email được chỉnh sửa và xóa.
// Xem thêm \Drupal\user\Plugin\Validation\Constraint\UserMailRequired.
$form['account']['mail'] = [
'#type' => 'email',
'#title' => $this->t('Địa chỉ email'),
'#description' => $this->t('Địa chỉ email hợp lệ. Tất cả email từ hệ thống sẽ được gửi đến địa chỉ này. Địa chỉ email không được công khai và sẽ chỉ được sử dụng nếu bạn muốn nhận mật khẩu mới hoặc muốn nhận một số tin tức hoặc thông báo qua email.'),
'#required' => !(!$account->getEmail() && $user->hasPermission('quản lý người dùng')),
'#default_value' => !$register ? $account->getEmail() : '',
];
// Chỉ hiển thị trường tên trên biểu mẫu đăng ký hoặc người dùng có thể thay đổi tên người dùng của chính mình.
$form['account']['name'] = [
'#type' => 'trường văn bản',
'#title' => $this->t('Tên người dùng'),
'#maxlength' => Giao diện người dùng::USERNAME_MAX_LENGTH,
'#description' => $this->t("Một số ký tự đặc biệt được phép, bao gồm dấu cách, dấu chấm (.), dấu gạch nối (-), dấu nháy đơn ('), dấu gạch dưới (_) và dấu @."),
'#required' => ĐÚNG,
'#thuộc tính' => [
'lớp học' => [
'tên tài khoản',
],
'tự động sửa lỗi' => 'tắt',
'tự động viết hoa' => 'tắt',
'kiểm tra chính tả' => 'sai',
],
'#default_value' => !$register ? $account->getAccountName() : '',
'#access' => $account->name->access('chỉnh sửa'),
];
$fields['name'] = BaseFieldDefinition::create('string')
->setLabel(t('Tên'))
->setDescription(t('Tên của người dùng này.'))
-> thiết lậpBắt buộc(TRUE)
->setConstraint([
// Không có ràng buộc Độ dài ở đây vì ràng buộc Tên người dùng cũng bao gồm
// điều đó.
'Tên người dùng' => [],
'Tên người dùng duy nhất' => [],
]);
$fields['name']
->getItemDefinition()
->setClass('\Drupal\user\UserNameItem');
$fields['pass'] = BaseFieldDefinition::create('password')
->setLabel(t('Mật khẩu'))
->setDescription(t('Mật khẩu của người dùng này (đã băm).'))
-> addConstraint('ProtectedUserField');
Các Biểu mẫu tài khoản
, Hồ sơ Form, và
Đăng kýMẫu các lớp, mở rộng [
Nội dungThực thểHình thức[6] lớp, không mở rộng [
ContentEntityForm::validateForm()[7], mặc dù. Họ triển khai các phương pháp cần thiết để Drupal hiểu trường thực thể nào được chỉnh sửa và vi phạm nào sẽ được hiển thị: [
AccountForm::getEditedFieldNames()][8] và [
AccountForm::flagViolations()`]6.
hàm được bảo vệ getEditedFieldNames(FormStateInterface $form_state) {
trả lại mảng_merge ([
'Tên',
'vượt qua',
'email',
'Múi giờ',
'mã ngôn ngữ',
'mã_lang được ưu tiên',
'preferred_admin_langcode',
], cha mẹ::getEditedFieldNames($form_state));
}
chức năng được bảo vệ flagViolations(EntityConstraintViolationListInterface $violations, array $form, FormStateInterface $form_state) {
// Gắn cờ vi phạm thủ công các trường không được hiển thị biểu mẫu xử lý. Cái này
// cần thiết vì biểu mẫu thực thể chỉ hiển thị các vi phạm gắn cờ cho các trường
// chứa trong màn hình.
$field_names = [
'Tên',
'vượt qua',
'email',
'Múi giờ',
'mã ngôn ngữ',
'mã_lang được ưu tiên',
'preferred_admin_langcode',
];
foreach ($violations->getByFields($field_names) as $violation) {
danh sách($field_name) = phát nổ('.', $violation->getPropertyPath(), 2);
$form_state->setErrorByName($field_name, $violation->getMessage());
}
cha mẹ::flagViolations($violations, $form, $form_state);
}
ContentEntityForm::validateForm()
chỉ hiển thị các lỗi xác thực đối với các phần tử biểu mẫu được báo cáo là đã được chỉnh sửa. Điều này có nghĩa là nếu tên phần tử biểu mẫu không được trả về từ AccountForm::getEditedFieldNames()
hoặc ContentEntityForm::getEditedFieldNames()
, phần tử biểu mẫu đó và trường thực thể tương ứng không được coi là đã chỉnh sửa.
Để trả lời câu hỏi: Có, có thể thêm các phần tử biểu mẫu vào mẫu đơn()
phương thức của lớp biểu mẫu thực thể và sử dụng các ràng buộc xác thực (và xác thực "tự động" của chúng), miễn là lớp biểu mẫu thực thể thực hiện getEditedFieldNames()
và vi phạm cờ()
các phương pháp.