¿Cómo paso los parámetros al generador de formularios?

15

Tengo las siguientes rutas en 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'

Este es el código en 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";
  }

}

Estoy teniendo el siguiente error:

DeleteUserGroup :: buildForm () debe ser compatible con Drupal \ Core \ Form \ FormInterface :: buildForm (array $ form, Drupal \ Core \ Form \ FormStateInterface $ form_state)

¿Por qué?

Crazyrubixfan
fuente
¿Alguien puede explicar cómo se compara esto al usar el módulo WebForm? No tengo ningún módulo específicamente para el formulario que he creado usando el módulo, entonces, ¿cuál sería el punto '_form' dentro del archivo routing.yml?
John Cogan

Respuestas:

28

El parámetro debe tener el mismo nombre en routing.yml y el método de compilación. Y cuando use parámetros en formularios, debe establecer un valor nulo en la lista de parámetros:

public function buildForm(array $form, FormStateInterface $form_state, $arg1 = NULL) {
4k4
fuente
Error fatal recuperable: el argumento 2 pasado a db_query () debe ser del tipo de matriz, cadena dada
Crazyrubixfan
cuando estoy tratando de usar arg1 en la función
Crazyrubixfan
1
OK, entonces el problema de esta pregunta con parámetros en formularios está resuelto. La llamada de buildForm () fue exitosa. Se encuentra con un nuevo problema con db_query (), que no acepta el parámetro de cadena de la ruta.
4k4
Si gracias . El problema es con db_query. Estoy recibiendo el param ahora
Crazyrubixfan
11

Primero cree un archivo routing.yml

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

Luego cree un archivo .php en la estructura de carpetas /src/Form/ExampleForm.php. Luego, cree un formulario

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;
}
Shreya Shetty
fuente