Tùy biến giỏ hàng và thanh toán
- Hiểu cách can thiệp vào quy trình giỏ hàng và thanh 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ù.

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.
Xem thêm

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