Lorsqu'un utilisateur appuie sur le bouton "ajouter au panier" sur une page de produit, je souhaite rediriger automatiquement l'utilisateur vers la page de paiement.
Drupal 7 a un problème pour le faire par programme et un problème pour le faire avec le module Rules .
Les règles sont toujours en alpha pour D8, et j'ai essayé de créer une règle qui agit sur après avoir enregistré une nouvelle commande , mais je reçois une erreur lorsque J'essaye d'ajouter une action:
Error: Call to a member function getDataType() on null in Drupal\rules\Plugin\RulesAction\EntityCreateDeriver->getDerivativeDefinitions() (line 99 of modules/contrib/rules/src/Plugin/RulesAction/EntityCreateDeriver.php).
Donc je veux rediriger de l'ajout au panier vers la page de paiement par programme.
Mais il y a pas de documentation pour l'instant. Donc, si quelqu'un peut expliquer comment procéder, je serais très obligé.
Il y a un problème ici pour permettre que via le formateur, il y ait un MR de moi que nous utilisons pour un projet. Notez qu'il saute complètement le panier, il n'y a que la caisse.
vous pourriez faire quelque chose comme ça:
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
if (strpos($form_id, 'commerce_order_item_add_to_cart_form_commerce_product') !== false) {
$form['actions']['submit']['#submit'][] = 'MYMODULE_cart_alter_sub';
}
}
function MYMODULE_cart_alter_sub(&$form, FormStateInterface $form_state) {
$responce = new RedirectResponse('/cart');
$responce->send();
}
Comme il n'y a pas encore de solution basée sur des règles, j'ai construit une fonction jquery pour le faire.
Tout d'abord, il vérifie si Drupal a envoyé un message indiquant que vous avez ajouté un produit à votre panier, puis effectue une simple redirection vers la page du panier, et là, il soumet directement à la page de paiement.
Drupal.behaviors.donate = {
attach: function (context, settings) {
if ($("div[role=contentinfo]").length){
var str=$("div[role=contentinfo]").html();
var n=str.includes('Donatie added to <a href="/cart">your cart</a>.');
if (n){
window.location="/cart";
}
}
if ($("#edit-checkout").length){
$("#edit-checkout").click();
}
}
};
Merci à @Berdir d'avoir écrit le code pour cela.
Comment utiliser le patch
/admin/commerce/config/product-types/my-product-type/edit/display
).J'avais également besoin de cette redirection (vers le panier, mais cela pourrait également fonctionner pour la caisse).
Il y a quelques possibilités qui semblaient fonctionner, mais non prévisibles:
Je retombe donc sur la solution donnée par Egbert Bleyenburg avec la différence que j'ai utilisé hook_preprocess_status_messages (). Je saute donc l'étape de rendu du message d'état et n'utilise pas le javascript.
Appelez votre fonction dans hook_preprocess_status_messages ():
function hook_preprocess_status_messages(&$variables) {
redirect_order_to_cart($variables['message_list']['status']);
}
Ci-dessus n'est qu'un exemple, en production, vous souhaitez avoir une condition pour vérifier si vous êtes sur la bonne page et si les messages d'état sont définis. Sous la fonction personnalisée que vous appelez pour rediriger:
function redirect_order_to_cart(array $status_messages) {
$cart_path = Url::fromRoute('commerce_cart.page')->getInternalPath();
foreach ($status_messages as $message) {
// If we have a status message containing a href with the cart path we know
// that it's the order item confirm message. This is the moment we want to
// redirect to the cart.
if (
$message instanceof Markup
&& strpos($message->jsonSerialize(), 'href="/' . $cart_path) !== FALSE
) {
// Setting the redirect.
$response = new RedirectResponse(\Drupal::service('url_generator')
->generateFromRoute('commerce_cart.page'));
$response->send();
break;
}
}
}