Je sais que vous pouvez facilement obtenir cette fonctionnalité dans Drupal 7 avec le module Rules ou en utilisant le module Commerce Checkout Express .
Étant donné que les règles et le commerce ne sont pas encore très intégrés, je ne suis pas sûr que nous puissions y parvenir aussi facilement, en Drupal 8.
Puis-je implémenter cette fonctionnalité en utilisant uniquement des règles? Si la réponse est non , comment puis-je le faire, par programme?
Si vous utilisez la dernière version de développement de commerce et recherchez le fichier commerce\modules\cart\src\Form\AddToCartForm.php
Qui se trouve sous l'espace de noms Drupal\commerce_cart\Form
, Vous pouvez voir que cart_id a été défini, et c'est l'ID de la commande également.
$form_state->set('cart_id', $cart->id());
Par conséquent, dans hook_form_alter()
, nous pouvons obtenir l'ID de commande (l'ID de panier).
$order_id = $form_state->get('cart_id');
Le code complet serait le suivant.
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
/**
* Implements hook_form_alter().
*/
function <MY_MODULE>_form_alter(&$form, FormStateInterface $form_state, $form_id) {
// Add to cart form id for product 5 is: commerce_order_item_add_to_cart_form_commerce_product_5
// Then it's enough to check $form_id contains the string 'commerce_order_item_add_to_cart_form_commerce'
if(strpos($form_id, 'commerce_order_item_add_to_cart_form_commerce') !== false) {
$form['actions']['submit']['#submit'][] = '_redirect_to_checkout';
}
}
// Callback for form submission
// @see hook_form_alter().
function _redirect_to_checkout(&$form, FormStateInterface $form_state) {
/** @var \Drupal\commerce_order\Entity\OrderInterface $cart_id */
$cart_id = $form_state->get('cart_id');
$url = Url::fromRoute('commerce_checkout.form',
['commerce_order' => $cart_id]
);
$form_state->setRedirectUrl($url);
}