Điểm:2

Chặn Cài đặt bên trong Biểu mẫu

lá cờ in

Xin vui lòng tôi cần giúp đỡ với mã của tôi. Tôi có một biểu mẫu và một khối được tạo theo chương trình. Khối nhúng biểu mẫu để hiển thị nó trên giao diện người dùng.Khối này cũng có một số cài đặt (văn bản tiền tố mẫu). Tôi muốn tải các cài đặt khối bên trong buildForm của mình trong Form.php để lấy văn bản tiền tố và hiển thị nó trong trường đánh dấu biểu mẫu. Nhưng dường như tôi không thể tìm ra cách chuyển $block_id sang buildForm() để nó có thể tải khối.

Tôi có một kịch bản trong đó có thể có hai trong số các khối này trên cùng một trang trong đó Drupal duy nhất khối đó bằng cách nối thêm một số ID với id khối. Vì vậy, ví dụ: trang của tôi có hai trong số các khối này, một khối sẽ như thế nào khối phản hồi cái khác sẽ là khối phản hồi_2 do đó tôi không thể mã hóa cứng id khối để tải nó trong hàm buildForm của mình.

Tôi muốn nó tự động chuyển id khối vào biểu mẫu.

build() từ Block.php của tôi:

  xây dựng chức năng công cộng () {
    $block_id // lấy id khối của thể hiện khối hiện tại
    $feedback_form = $this->formBuilder->getForm(FeedbackForm::class, $block_id);

    $xây dựng = [];
    $build['#theme'] = 'feedback_block';
    $build['feedback_block']['#markup'] = render($feedback_form);

    trả lại bản dựng $;
  }

buildForm từ FeedbackForm.php của tôi:

  chức năng công khai buildForm(mảng $form, FormStateInterface $form_state, chuỗi $block_id) {
      // Lấy id khối ở đây.
  }

Có bất kì cách nào để đạt được điều này không?

Kevin avatar
lá cờ in
$feedback_form đã là một mảng kết xuất, bạn không cần phải kết xuất nó. Chỉ cần đặt nó thành một biến, hãy để Drupal thực hiện công việc.
Kevin avatar
lá cờ in
Ngoài ra: https://drupal.stackexchange.com/a/199929/57
New To 'C' avatar
lá cờ in
Cảm ơn vì liên kết nhưng tôi đã xem liên kết đó và điều đó sẽ không hoạt động trong trường hợp của tôi vì tôi không có định tuyến.yml và tôi không cần. Tôi chỉ đang tạo một khối và một khối biểu mẫu đang hiển thị biểu mẫu đó và khối đó có thể được hiển thị ở bất kỳ đâu trên trang web bất kể tuyến đường.
Kevin avatar
lá cờ in
Bạn không cần định tuyến yaml. Đọc câu trả lời. "khi sử dụng tham số trong biểu mẫu, bạn phải đặt giá trị null trong danh sách tham số"
New To 'C' avatar
lá cờ in
Ồ, cảm ơn bạn đời! Điều này đã hiệu quả, tôi ước tôi có thể nâng cao nhận xét của bạn nhưng không có tùy chọn. Bây giờ tôi có thể chuyển đối số bổ sung tới buildForm(). Nhưng làm cách nào tôi có thể tự động lấy id khối của phiên bản khối hiện tại?
Kevin avatar
lá cờ in
Tôi không hiểu những gì bạn có nghĩa là năng động nhận được?
New To 'C' avatar
lá cờ in
Ví dụ: trang của tôi có hai trong số các khối này nên Drupal gán ID duy nhất (tên máy) cho chúng. Một cái sẽ giống như feedbackblock và cái kia sẽ giống như feedbackblock_2, đây là hành vi Drupal mặc định không phải là điều tôi đang làm. Drupal duy nhất các khối nếu có hai khối trên cùng một trang. Vậy làm cách nào tôi có thể lấy tên máy duy nhất này cho từng tên máy và chuyển nó cho buildForm() ?
Điểm:2
lá cờ cn

Có một lớp abstaction giữa lưu trữ cấu hình khối và tòa nhà xem khối. Cấu hình khối có thể được lưu trữ ở bất kỳ đâu và không nhất thiết phải có tên máy.Tuy nhiên, bạn có thể chuyển tên máy sang cài đặt khối khi bạn đặt một khối trong Bố cục khối:

sử dụng Drupal\block\BlockInterface;

/**
 * Triển khai hook_ENTITY_TYPE_presave() cho các thực thể khối.
 */
function mymodule_block_presave(BlockInterface $block) {
  nếu ($block->isNew()) {
    $settings = $block->get('settings');
    $settings['block_id'] = $block->get('id');
    $block->set('settings', $settings);
  }
}

Sau đó, bạn có thể lấy tên máy trong build():

  xây dựng chức năng công cộng () {
    // lấy id khối của thể hiện khối hiện tại
    $block_id = !empty($this->configuration['block_id']) ? $this->configuration['block_id'] : '';

Như một lưu ý phụ. Tôi không nghĩ rằng phần còn lại của mã trong câu hỏi không hoạt động. Bạn cần thêm ID duy nhất vào phiên bản biểu mẫu trước khi gọi formBuilder->getForm() rồi sử dụng nó để tạo ID biểu mẫu duy nhất. Sau đó, buildForm() có thể lấy ID từ thuộc tính lớp. Nhìn thấy Sử dụng cùng một biểu mẫu nhiều lần trên mỗi trang với lệnh gọi lại AJAX

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