Điểm:2

Biểu mẫu có hai nút gửi

lá cờ th

Tôi cố gắng tạo một biểu mẫu có hai nút gửi và mỗi nút sẽ sử dụng một chức năng khác nhau: mặc định gửi biểu mẫu chức năng và tùy chỉnh gửiFormEndSession chức năng. Vì vậy, tôi có mã này:

lớp EndSessionForm mở rộng FormBase {

  /**
   * @var \Drupal
   */
  $ drupal riêng tư;

  hàm công khai __construct() {
    $this->drupal = new Drupal();
  }

  /**
   * {@inheritdoc}
   */
  hàm công khai getFormId (): chuỗi {
    trả về 'end_session_form';
  }

  chức năng công khai buildForm (mảng $form, FormStateInterface $form_state): mảng {

    // ... một số trường

    $form['submit'] = [
      '#type' => 'gửi',
      '#value' => 'Đóng phiên',
      '#name' => 'btnEnd',
    ];

    $form['stop'] = [
      '#type' => 'gửi',
      '#value' => 'Dừng phiên',
      '#name' => 'btnStop',
    ];

    trả về biểu mẫu $;
  }

  hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
    // Hàm gọi với nút btnEnd
  }

  hàm công khai submitStopForm(mảng &$form, FormStateInterface $form_state) {
    // Hàm gọi với nút btnStop
  }
}

Theo tài liệu của Drupal 9.2.x, điều duy nhất tôi phải làm là thêm một #Gửi đi tham số cho $form['stop'] phần tử như thế này:

$form['stop'] = [
  '#type' => 'gửi',
  '#value' => 'Dừng phiên',
  '#name' => 'btnStop',
  '#submit' => [ $this, 'submitStopForm' ] // liên kết tới hàm gửi thứ hai
]

Nhưng nó không hoạt động.

Sau nhiều lần thử và nghiên cứu, tôi đã tìm ra giải pháp một phần bằng cách thêm phần này vào xây dựngForm:

$form['#submit'][] = [$this, 'submitStopForm'];

Hai nút hiện được liên kết với gửi biểu mẫugửiStopForm, không có vấn đề nếu tôi đặt một #Gửi đi tham số trên các nút hay không, gửiStopForm được thực hiện đầu tiên sau đó gửi biểu mẫu. Nhưng tôi tự hỏi làm cách nào tôi có thể liên kết nút đầu tiên với gửi biểu mẫu và cái thứ hai gửiStopForm đúng và không cần nhập trong cả hai chức năng khi chúng ta nhấp vào một nút.

Cảm ơn và có một ngày tốt đẹp!

berliner avatar
lá cờ bd
Xin chào và chào mừng bạn đến với Câu trả lời của Drupal! Tôi có một nhận xét không liên quan trực tiếp đến câu hỏi của bạn: Hàm tạo của bạn trông rất lạ. Bạn thường không cần một hàm tạo cho các lớp biểu mẫu nếu bạn không muốn đưa vào các dịch vụ. Và tôi chưa bao giờ thấy `new Drupal()` ở bất kỳ đâu bên trong mã tùy chỉnh. Tôi có thể hỏi bạn lấy nó từ đâu và tại sao bạn lại sử dụng nó không?
Auraylien avatar
lá cờ th
Xin chào @berlinern, mã này không phải là mã thích hợp của tôi, vì vậy tôi không thể giải thích hướng dẫn `$this->Drupal = new Drupal()`. Khi chúng tôi nhận dự án này, dự án đã có trên Drupal 8 và chúng tôi đã thực hiện một số cập nhật cho phiên bản Drupal mới nhất, vì vậy có thể đó là mã không được dùng nữa. Tôi đã xóa nó (và cả hàm tạo nữa) và không có gì thay đổi.
berliner avatar
lá cờ bd
Thực tế không có thay đổi nào được mong đợi;) Bạn đã thử ký hiệu khác từ tài liệu mà bạn đã liên kết đến chưa? `'::methodName'` đề phòng.
Auraylien avatar
lá cờ th
Vâng, tôi đã thử điều này nhưng nó cũng không hoạt động :(
berliner avatar
lá cờ bd
Bạn có thể đăng toàn bộ mã thực của mình cho nội dung của các hàm gửi (hoặc một ví dụ tối thiểu tái tạo sự cố của bạn) không? Có một cái gì đó kỳ lạ ở đó. Tất cả các hàm gửi được đặt trong `$form['#submit']` nên được gọi, không chỉ hàm đầu tiên.
Auraylien avatar
lá cờ th
Đó là một sai lầm của tôi: Tôi đã viết `die()` trong cả hai với một nhận xét để kiểm tra xem tôi có thể đạt được chức năng nào. Vì vậy, trước tiên tôi tiếp cận `submitStopForm` rồi đến `submitForm`. Nhưng điều tôi muốn là tiếp cận ngay lập tức `submitStopForm` hoặc `submitForm`, tùy thuộc vào nút và đặt `#submit => [$this, 'submitStopForm']` dưới một nút, các tham số không hoạt động
berliner avatar
lá cờ bd
Vui lòng cập nhật câu hỏi của bạn cho phù hợp. Điều đó sẽ tăng cơ hội nhận được câu trả lời của bạn.
Kevin avatar
lá cờ in
Có, vui lòng thêm mã _actual_ đang được sử dụng.
Điểm:1
lá cờ cn

Tôi nghĩ rằng bạn phải bọc cuộc gọi lại sumbit trong một mảng khác, nếu bạn đang sử dụng ký hiệu có thể gọi được đó. Vì vậy:

$form['stop'] = [
  '#type' => 'gửi',
  '#value' => 'Dừng phiên',
  '#name' => 'btnStop',
  '#submit' => [ [$this, 'submitStopForm'] ] // Mảng các hàm có thể gọi được (là các mảng)
];

hoặc cái này

$form['stop'] = [
  '#type' => 'gửi',
  '#value' => 'Dừng phiên',
  '#name' => 'btnStop',
  '#submit' => [ 'submitStopForm' ] // Mảng hàm gửi
]

Bạn cũng có thể lấy phần tử đã kích hoạt hành động từ bên trong hàm gửi, nhưng tôi có xu hướng nghĩ rằng giải pháp trước đó tốt hơn.

hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) { 
    $submitButton = $form_state->getTriggeringElement(); 
    bãi($sumbitButton); 
}

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormState.php/function/FormState%3A%3AgetTriggeringElement/8.2.x

Auraylien avatar
lá cờ th
Cám ơn phản hồi của bạn. `'#submit => [ [ $this, 'submitStop' ] ]` hoạt động, nhưng chỉ khi tôi đặt tham số `#submit` trên nút đầu tiên. Viết nó trên nút thứ hai không có tác dụng. Và đặt nó vào nút đầu tiên thay đổi trình xử lý cho cả hai nút. Và nếu tôi sử dụng giải pháp thứ hai của bạn, cả hai nút đều có phần tử kích hoạt giống nhau, tôi không hiểu tại sao

Đă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.