Добавьте продукты коммерции drupal в корзину без перезагрузки страницы программно

Как реализовать следующую задачу: -

У меня есть 2 div, в первом div у меня есть название продукта и ссылка для добавления. Если пользователь нажимает на ссылку «Добавить ссылку», соответствующий продукт должен быть добавлен во второй div.

Во втором div внизу у меня есть кнопка «Добавить в корзину», поэтому при нажатии кнопки «Корзина» все добавленные продукты должны быть добавлены на страницу добавления в корзину drupal commerce.

Просто для справки, пожалуйста, проверьте ссылку ниже: -

http://buildabagpartyfavours.ca/pages/build-your-own-goodie-bag


person Karan Karnot    schedule 01.10.2014    source источник


Ответы (2)


Если кто-то использует Drupal 8 и хочет решить этот вопрос, может сделать это следующим образом:

Если у вас есть идентификатор варианта продукта $var_id, вы можете создать тег «a» с классом «use-ajax»:

<a href="/add/product/'.$var_id.'" class="use-ajax -add-to-cart">Add to cart</a>

В routing.yml вы должны добавить следующий путь с контроллером:

path: '/add/product/{pid}'
_controller: Drupal\MY_MODULE\Controller\ShopProductController::addToCart

И вам нужно создать контроллер с ответом ajax:

    namespace Drupal\MY_MODULE\Controller;

    use Drupal\commerce_order\Entity\OrderInterface;
    use Drupal\commerce_order\Entity\OrderItem;
    use Drupal\commerce_order\Entity\Order;
    use Drupal\Core\Ajax\AjaxResponse;
    use Drupal\Core\Ajax\HtmlCommand;
    use Drupal\Core\Ajax\CssCommand;

class ShopProductController {
    public function addToCart($pid) {

        $ajax_response = new AjaxResponse();
        #### ADD TO CART ####
        // variation_id of product.

        if (isset($pid) && !empty($pid)) {

            $store_id = 1;
            $order_type = 'default';
            $variation_id = $pid;

            $entity_manager = \Drupal::entityManager();
            $cart_manager = \Drupal::service('commerce_cart.cart_manager');
            $cart_provider = \Drupal::service('commerce_cart.cart_provider');

            // Drupal\commerce_store\Entity\Store::load($store_id);
            $store = $entity_manager->getStorage('commerce_store')->load($store_id); 
            $product_variation = $entity_manager->getStorage('commerce_product_variation')->load($variation_id);

            // order type and store
            $cart = $cart_provider->getCart($order_type, $store);
            if (!$cart) {
                $cart = $cart_provider->createCart($order_type, $store);
            }

            //Create new order item 
            $order_item = $entity_manager->getStorage('commerce_order_item')->create(array(
                'type' => 'default',
                'purchased_entity' => (string) $variation_id,
                'quantity' => 1,
                'unit_price' => $product_variation->getPrice(),
            ));

            $order_item->save();
            $cart_manager->addOrderItem($cart, $order_item);

            $ajax_response->addCommand(new HtmlCommand('.-add-to-cart', '<span class="-added">Added</span>'));

            }

            return $ajax_response;

        }
}
person Santo Boldizar    schedule 22.12.2017
comment
Похоже, ваш код предназначен для Drupal 8. ОП пометил вопрос с помощью Drupal 7, который сильно отличается. - person 2pha; 22.12.2017

Сделайте так, чтобы ваша кнопка вызывала некоторый вызов AJAX, передайте идентификатор продукта, а с другой стороны в сценарии обратного вызова AJAX соберите идентификатор продукта, создайте из него позицию и добавьте ее в корзину ( https://www.drupal.org/node/1288414 ).

Когда вызов AJAX завершен, вам нужно будет вызвать еще один, чтобы обновить блок корзины.

person MilanG    schedule 07.10.2014