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?
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}
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
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);