Comment passer des paramètres au générateur de formulaires?

15

J'ai les itinéraires suivants dans 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'

Il s'agit du code dans 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";
  }

}

Je reçois l'erreur suivante:

DeleteUserGroup :: buildForm () doit être compatible avec Drupal \ Core \ Form \ FormInterface :: buildForm (tableau $ form, Drupal \ Core \ Form \ FormStateInterface $ form_state)

Pourquoi?

Crazyrubixfan
la source
Quelqu'un peut-il expliquer comment cela équivaut lors de l'utilisation du module WebForm? Je n'ai pas de module spécifiquement pour le formulaire que j'ai construit en utilisant le module, alors à quoi sert le point «_form» dans le fichier routing.yml?
John Cogan

Réponses:

28

Le paramètre doit avoir le même nom dans routing.yml et build method. Et lorsque vous utilisez des paramètres dans des formulaires, vous devez définir une valeur nulle dans la liste des paramètres:

public function buildForm(array $form, FormStateInterface $form_state, $arg1 = NULL) {
4k4
la source
Erreur fatale récupérable: l'argument 2 passé à db_query () doit être du type tableau, chaîne donnée
Crazyrubixfan
quand j'essaie d'utiliser arg1 dans la fonction
Crazyrubixfan
1
OK, le problème de cette question avec les paramètres dans les formulaires est résolu. L'appel de buildForm () a réussi. Vous rencontrez un nouveau problème avec db_query (), qui n'accepte pas le paramètre de chaîne de la route.
4k4
Oui merci . Le problème est avec db_query. Je reçois le param maintenant
Crazyrubixfan
11

Créez d'abord un fichier routing.yml

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

Créez ensuite un fichier .php sous la structure de dossiers /src/Form/ExampleForm.php. Puis créez un formulaire

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
la source