web-dev-qa-db-fra.com

Comment obtenir les paramètres de la redirection de formulaire?

J'ai créé un formulaire et j'essaie d'obtenir le résultat de la soumission dans une page de redirection avec une URL api:

 public function submitForm(array &$form, FormStateInterface $form_state)
    {

    $metier=$form_state->getValue('metier');
    $position=$form_state->getValue('position');

    //$form_state->setRedirect('recherche.resultat',array('param'=>'test');

    $url = new Url('recherche.resultat');
    $url->setOptions(array('param'=>'test2'));
    $url->setRouteParameters(array('param'=>'test2'));

    $form_state->setRedirectUrl($url);

    drupal_set_message("envoyer");

}

J'ai défini deux options:

$url->setOptions(array('param'=>'test2'));

et

$url->setRouteParameters(array('param'=>'test2'));

Le formulaire me redirige et voici mon contrôleur:

public function resultat()
{
    $request = \Drupal::request();
    $url = Url::createFromRequest($request);
    kint($url);
    kint($url->getOptions());
    kint($url->getRouteParameters());
    return array('#markup'=>t('test'));

}

Les deux méthodes:

    kint($url->getOptions());
    kint($url->getRouteParameters());

sont vides

Voici mon itinéraire:

 recherche.resultat:
  path: '/resultat'
  defaults:
    _title: 'resultat'
    _controller: '\Drupal\recherche\Controller\ResultatRechercheController::resultat'
  requirements:
     _permission: 'access content'

Les paramètres sont dans l'URL et je peux les obtenir avec $ _GET mais comment puis-je obtenir avec l'API URL?

5
Kevin

Ok je l'ai eu de cette façon:

J'ai donc 2 paramètres de mon formulaire à transmettre à mon contrôleur:

public function submitForm(array &$form, FormStateInterface $form_state)
{

    $metier=$form_state->getValue('metier');
    $position=$form_state->getValue('position');

    $url = \Drupal\Core\Url::fromRoute('recherche.resultat')
          ->setRouteParameters(array('metier'=>$metier,'position'=>$position));

    $form_state->setRedirectUrl($url);


}

La clé est dans le routage YAML, vous devez construire votre chemin comme ça pour obtenir les paramètres (le nom des paramètres doit être le même que votre itinéraire, voir la fonction précédente (submitForm)):

recherche.resultat:
  path: '/resultat/{metier}/{position}'
  defaults:
    _title: 'resultat'
    _controller: '\Drupal\recherche\Controller\ResultatRechercheController::resultat'
    metier: ''
    position: ''
  requirements:
     _permission: 'access content'

Et dans mon contrôleur pour obtenir mes paramètres:

Classe: ResultatRechercheController

 public function resultat($metier, $position)
    {

        kint($metier);
        kint($position);

        return array('#markup'=>t('la premiere spécialite est @specialite',array('@specialite'=>'test')));

    }

Et l'URL est propre:

localhost: 8888 // monsite.com/resultat/{metier}/{position}

6
Kevin

Vous pouvez obtenir les attributs get directement à partir de l'objet de requête \Drupal::request()->attributes->get('param'); ou \Drupal::request()->query

Source: https://api.drupal.org/api/drupal/core%21lib%21Drupal.php/function/Drupal%3A%3Arequest/8

3
SebCorbin

Dans un formulaire bloc, vous pouvez simplement ajouter vos paramètres dans votre URL de redirection de formulaire, sans routage:

public function submitForm(array &$form, FormStateInterface $form_state) {
  # get form data
    $form_var = $form_state->getValue('input_name')
    ...

  # set form data in url redirect
  $option = [
    'query' => ['testvar' => $form_var],
  ];
  $url = Url::fromUri('internal:/my_url/redirect', $option);

  $form_state->setRedirectUrl($url);
}

Ensuite, récupérez-le et nettoyez-le:

# retrieve query param
$my_var = \Drupal::request()->query->get('testvar');

# clean for a textfield
$my_var_escaped = Html::escape($my_var);
0
Flo Develop