web-dev-qa-db-fra.com

Rediriger vers la caisse après avoir cliqué sur le bouton "Ajouter au panier"

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é.

4
Patrick Kenny

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.

https://www.drupal.org/node/281072

3
Berdir

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();
}
4
Taggart Jensen

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

  }
  }; 
2
Egbert Bleyenburg

Merci à @Berdir d'avoir écrit le code pour cela.

Comment utiliser le patch

  1. Appliquez le patch.
  2. Accédez à la page Types de produits -> Modifier l'affichage pour le type de produit pour lequel vous souhaitez ignorer le panier (/admin/commerce/config/product-types/my-product-type/edit/display).
  3. Recherchez le champ Variations de produit , dont le format doit être Ajouter au panier . Cliquez sur la petite icône d'engrenage à droite.
  4. Cochez la case Ignorer le panier et appuyez sur Mettre à jour .
1
Patrick Kenny

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:

  • Redirection des règles basée sur l'enregistrement d'un article de commande
  • Écouteur d'événements sur: commerce_order.place.post_transition
  • Soumettez le gestionnaire sur l'action "ajouter au panier". Toutes ces solutions peuvent sembler fonctionner à première vue, mais après de nouveaux tests, il est apparu que la redirection était parfois effectuée avant d'ajouter l'article au panier.

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;
    }
  }
}
1
Floris Vedder