Làm cách nào để truyền tham số cho trình tạo biểu mẫu?


15

Tôi có các tuyến đường sau trong module_name.routing.yml.

module_name.usergroup_delete:
  path: 'module_name/usergroup/delete/{arg1}'
  defaults:
    _form: '\Drupal\module_name\Form\DeleteUserGroup'
    _title: 'Delete User group'
  requirements:
    _permission: 'access admin menus'

Đây là mã trong module_name / src / Form / DeleteUsergroup.php.

namespace Drupal\module_name\Form;

use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

class DeleteUserGroup extends ConfigFormBase {

  public function getFormId() {
    return 'delete_user_group';
  }
/**
 * General form for switching all nodes from one user to another.
 */
  public function buildForm(array $form, FormStateInterface $form_state,$product_code) {
  $form['_product'] = array(
        '#type' => 'value',
        '#value' => $product_code,);
//get the user group and username to display the confirmation message 
$result = db_query('select field_p_group_name_value from {content_type_usergroup} ctu'       
        . ' where vid=%d',$product_code);      
    while ($row = $result->fetchObject()) {
      $user_group = $row->field_p_group_name_value;
    }

return confirm_form($form,t('Are you sure you want to delete "' .$user_group. '" User Group?'),
        isset($_GET['destination']) ? $_GET['destination'] : "function_name",t('This action cannot be undone.'),t('Delete'),t('Cancel'));

  }
/**
 * #submit callback for node_adoption_transfer_form().
 */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $form_values = $form_state->getValues();
  //if ($form_state['values']['confirm']) {
    $param = $form_state->getValue('_product');
    drupal_set_message(t('Group ' .$param.' will get deleted.'));               
    db_query('DELETE FROM {content_type_usergroup} WHERE vid = %d', $param);
    //delete the users of the usergroup too
    db_query('DELETE FROM {usergroup_user_map} WHERE group_id=%d', $param);
    drupal_set_message(t('usergroup has been deleted.'));
    drupal_goto('function_name');
  }

  protected function getEditableConfigNames() {
    return "delete_user_group";
  }

}

Tôi nhận được lỗi sau:

DeleteUsergroup :: buildForm () phải tương thích với Drupal \ Core \ Form \ FormInterface :: buildForm (mảng $ form, Drupal \ Core \ Form \ FormStateInterface $ form_state)

Tại sao?


Bất cứ ai cũng có thể giải thích làm thế nào điều này tương đương khi sử dụng mô-đun WebForm? Tôi không có mô-đun cụ thể cho biểu mẫu tôi đã xây dựng bằng mô-đun, vậy điểm '_form' sẽ nằm trong tệp định tuyến nào?
John Cogan

Câu trả lời:


28

Tham số phải có cùng tên trong định tuyến và phương thức xây dựng. Và khi sử dụng tham số trong các biểu mẫu, bạn phải đặt giá trị null trong danh sách tham số:

public function buildForm(array $form, FormStateInterface $form_state, $arg1 = NULL) {

Lỗi nghiêm trọng có thể phục hồi: Đối số 2 được truyền cho db_query () phải thuộc mảng kiểu, chuỗi đã cho
Crazyrubixfan

khi tôi đang cố gắng sử dụng arg1 trong chức năng
Crazyrubixfan

1
OK, sau đó vấn đề của câu hỏi này với các tham số trong các hình thức được giải quyết. Cuộc gọi của buildForm () đã thành công. Bạn gặp phải một vấn đề mới với db_query (), không chấp nhận tham số chuỗi từ tuyến.
4k4

Vâng cảm ơn . Vấn đề là với db_query. Đang nhận được thông số ngay bây giờ
Crazyrubixfan

11

Đầu tiên tạo một tập tin định tuyến.

admin_notes.form:
  path: '/example_module/form/{arg}'
  defaults:
    _form: '\Drupal\example_module\Form\ExampleForm'
  requirements:
    _permission: 'access content'

Sau đó tạo tệp .php trong cấu trúc thư mục /src/Form/ExampleForm.php. Sau đó, hãy tạo một biểu mẫu

public function buildForm(array $form, FormStateInterface $form_state,$arg = NULL) {

             $form['example_note'] = array(
            '#type' => 'textarea',
            '#title' => t('Block contents'),
            '#description' => t('This text will appear in the example block.'),
            '#default_value' => $arg,
        );
       $form['actions'] = ['#type' => 'actions'];
        $form['actions']['delete'] = array(
            '#type' => 'submit',
            '#value' => $this->t('Delete'),
        );

return $form;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.