Điểm:1

Xác thực trên biểu mẫu chỉnh sửa thực thể tùy chỉnh

lá cờ lc

Tôi có một thực thể tùy chỉnh ở đó, thay vì sử dụng cách thông thường để chỉ định các tùy chọn biểu mẫu chỉnh sửa với setDisplayOptions('biểu mẫu' và dựa vào Nội dungThực thểHình thức để tạo biểu mẫu chỉnh sửa cho tôi, tôi phải tạo biểu mẫu của riêng mình trong xây dựngForm() (Tôi có các tương tác Ajax giữa các trường mà cổ phiếu không thể cung cấp). Nó hoạt động tốt, chỉ là tôi không thể kích hoạt xác thực như với biểu mẫu chứng khoán. Các ràng buộc ở đó và nếu tôi ghi đè lên:

hàm công khai validateForm(mảng &$form, FormStateInterface $form_state) {
  $entity = parent::validateForm($form, $form_state);
  $violations = $entity->validate();
  foreach ($vi phạm như $v) {
    dpm($v->getMessage());
  }
  trả lại thực thể $;
}

trên thực tế, các lỗi xác thực đã được tìm thấy và liệt kê, chỉ là biểu mẫu sẽ không hiển thị các cảnh báo màu đỏ thông thường, khiến người dùng không thể tiếp tục. Tôi có thể điều hòa việc xây dựng biểu mẫu tùy chỉnh với xác thực tự động không?

Điểm:0
lá cờ us

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ânMẫ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()vi phạm cờ() các phương pháp.

lá cờ lc
Rất hay, cảm ơn bạn, tôi sẽ đi theo con đường này.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.