Tùy biến giỏ hàng và thanh toán

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 7 tháng 4, 2025
  • Hiểu cách can thiệp vào quy trình giỏ hàngthanh toán của EC-CUBE.
  • Biết cách thêm logic riêng vào quy trình đặt hàng như: khuyến mãi, phí vận chuyển, và validate dữ liệu.
  • Tùy chỉnh giao diện và trường dữ liệu trong checkout.

Tùy biến giỏ hàng và thanh toán

1. Hook vào giỏ hàng*

1.1 CartItemAddEvent

Sự kiện này được kích hoạt mỗi khi một sản phẩm được thêm vào giỏ hàng. Bạn có thể hook vào sự kiện này để kiểm tra và thay đổi sản phẩm trong giỏ.

namespace Plugin\MyPlugin\EventSubscriber;

use Eccube\Event\CartItemAddEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class CartItemAddSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            'eccube.event.cart.item.add' => 'onCartItemAdd',
        ];
    }

    public function onCartItemAdd(CartItemAddEvent $event)
    {
        $cartItem = $event->getCartItem();
        // Kiểm tra điều kiện khuyến mãi
        if ($cartItem->getProduct()->getPrice() > 100) {
            $cartItem->setPrice($cartItem->getPrice() * 0.9); // Giảm giá 10% nếu sản phẩm trên 100
        }
    }
}

1.2 CartEvent

Sự kiện này cho phép bạn can thiệp vào giỏ hàng khi giỏ hàng thay đổi. Bạn có thể tính toán lại tổng giá trị giỏ hàng, thêm phí vận chuyển, hoặc áp dụng khuyến mãi.

namespace Plugin\MyPlugin\EventSubscriber;

use Eccube\Event\CartEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class CartSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            'eccube.event.cart.change' => 'onCartChange',
        ];
    }

    public function onCartChange(CartEvent $event)
    {
        $cart = $event->getCart();
        // Tính phí vận chuyển (giả sử là 5% tổng giá trị giỏ hàng)
        $shippingFee = $cart->getTotalPrice() * 0.05;
        $cart->setShippingFee($shippingFee);
    }
}

2. Hook vào quy trình thanh toán

2.1 PreOrderEvent

Sự kiện này xảy ra trước khi đơn hàng được tạo. Bạn có thể kiểm tra dữ liệu trong giỏ hàng và thực hiện validation trước khi đơn hàng được lưu.

namespace Plugin\MyPlugin\EventSubscriber;

use Eccube\Event\PreOrderEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class PreOrderSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            'eccube.event.order.pre_order' => 'onPreOrder',
        ];
    }

    public function onPreOrder(PreOrderEvent $event)
    {
        $cart = $event->getCart();
        if ($cart->getTotalPrice() < 50) {
            // Không cho phép đặt hàng nếu tổng giá trị giỏ hàng dưới 50
            throw new \Exception('Giỏ hàng phải có giá trị tối thiểu là 50.');
        }
    }
}

3. Tùy chỉnh màn hình checkout và thêm trường dữ liệu

EC-CUBE cho phép bạn thêm trường dữ liệu vào quá trình thanh toán (checkout). Bạn có thể thêm trường khuyến mãi, mã giảm giá, phí vận chuyển, hoặc thông tin cá nhân vào form thanh toán.

3.1 Tạo trường mới trong form thanh toán (Checkout)

Tạo một extension để thêm trường nhập liệu trong quá trình thanh toán.

namespace Plugin\MyPlugin\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CheckoutCustomFieldType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('custom_field', TextType::class, [
            'label' => 'Mã khuyến mãi',
            'required' => false,
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => null,
        ]);
    }
}

Sau đó, đăng ký trường này trong service và thêm vào checkout form.

Kết luận

  • EC-CUBE cung cấp nhiều sự kiện (events) để bạn có thể tùy chỉnh quy trình giỏ hàng và thanh toán.
  • Hook vào các sự kiện như CartItemAddEvent, CartEvent, và PreOrderEvent giúp bạn thêm các logic như khuyến mãi, phí vận chuyển, validate dữ liệu mà không phải sửa đổi trực tiếp code gốc.
  • Tùy chỉnh form checkout giúp nâng cao trải nghiệm người dùng và hỗ trợ các yêu cầu kinh doanh đặc thù.
Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ