Cela marche:
$redirectURL = '/cart/add/p2';
return new RedirectResponse(base_path().$redirectURL);
Le problème est que je veux ceci:
$redirectURL = '/cart/add/p2?destination=somewhere';
Au moment où j'ai ajouté destination = quelque part, j'obtiens cette erreur:
InvalidArgumentException: The internal path component 'http://localhost/XXXX/public_html/XXXX/XXXX' is invalid. Its path component must have a leading slash, e.g. internal:/foo. in Drupal\Core\Url::fromInternalUri() (line 404 of C:\ampps\www\XXXX\public_html\core\lib\Drupal\Core\Url.php).
Cependant, si je fais cela:
$redirectURL = '/cart/add/p2?SOMETHING_ELSE=somewhere';
Alors ça marche. En d'autres termes, cela casse spécifiquement si j'ajoute "destination = quelque part".
Pourquoi serait-ce une rupture avec cela et comment puis-je le contourner? C'est à dire. Comment rediriger vers une URL avec destination = quelque part dans la chaîne de requête.
FYI: Si je peux faire fonctionner cela, je peux utiliser des "Liens de panier" pour ajouter des trucs à un panier et rediriger l'utilisateur en même temps, ce qui rend ma vie beaucoup plus facile.
Mieux vaut utiliser une route, pour que le traitement du chemin dans Drupal puisse faire son travail. Si custom.cart_add
est la route vers /cart/add/{page}
, cela renvoie une réponse de redirection avec un paramètre de requête de destination à partir d'un contrôleur:
return $this->redirect(
'custom.cart_add',
['page' => 'p2'],
[
'query' => ['destination' => 'somewhere'],
'absolute' => TRUE,
]
);
Essayez ce code.
$path = Drupal\Core\URL::fromUserInput('/cart/add/p2', array('query' => array('SOMETHING_ELSE' => 'somewhere')))->toString();
$response = new RedirectResponse($path);
$response->send();
$redirectURL = '/cart/add/p2';
return new RedirectResponse(base_path().$redirectURL);
Le code ci-dessus produit une double barre oblique avant l'élément cart, car base_path()
ajoute toujours une barre oblique à la fin du chemin renvoyé. Vous devez supprimer la barre oblique de la variable $redirectURL
Pour qu'elle fonctionne correctement.
Cet exemple complet pourrait aider:
use Symfony\Component\HttpFoundation\RedirectResponse;
$target = 65; // a parameter you want to add
$url = Url::fromUri('internal:/node/add/page'); // choose a path
$link_options = array(
'attributes' => array(
'class' => array(
'btn',
),
),
'query' => array(
'target' => $target
)
);
$url->setOptions($link_options);
$destination = $url->toString();
$response = new RedirectResponse($destination);
$response->send();