Tùy chỉnh Service

Tùy chỉnh Service

Tùy chỉnh giỏ hàng # 2613

CartItemComparatorCartItemAllocatorBằng cách triển khai các lớp và lớp, bạn có thể tùy chỉnh hành vi khi bạn đặt các mặt hàng vào giỏ hàng của bạn.

Sơ đồ trình tự

Tách cùng một mặt hàng / cùng tiêu chuẩn sản phẩm thành các chi tiết riêng biệt

Trong triển khai tiêu chuẩn, các mục giỏ hàng được chia cho từng tiêu chuẩn sản phẩm. Ví dụ: khi tùy chỉnh để thêm tùy chọn sản phẩm như gói quà tặng, CartItemComparatorbằng cách triển khai , có thể phân chia các chi tiết theo sự hiện diện hoặc không có gói quà ngay cả đối với cùng một sản phẩm / cùng tiêu chuẩn sản phẩm.

<?php
namespace Eccube\Service\Cart;


use Eccube\Entity\CartItem;

/**
 * So sánh chi tiết đơn hàng với tiêu chuẩn sản phẩm và tùy chọn sản phẩm CartItemComparator
 */
class ProductClassAndOptionComparator implements CartItemComparator
{
    /**
     * @param CartItem $Item1 mục 1
     * @param CartItem $Item2 mục 2
     * @return boolean true Nếu nó là cùng một mục
     */
    public function compare(CartItem $Item1, CartItem $Item2)
    {
        $ProductClass1 = $Item1->getProductClass();
        $ProductClass2 = $Item2->getProductClass();
        $product_class_id1 = $ProductClass1 ? (string) $ProductClass1->getId() : null;
        $product_class_id2 = $ProductClass2 ? (string) $ProductClass2->getId() : null;

        if ($product_class_id1 === $product_class_id2) {
            // 別途 ProductOption を追加しておく
            return $Item1->getProductOption()->getId() === $Item2->getProductOption()->getId();
        }
        return false;
    }
}

Để bật CartItemComparator, hãy app/config/eccube/packages/cart.yamltạo và thêm định nghĩa của CartItemComparator.

services:
    Eccube\Service\Cart\CartItemComparator:
      class: Eccube\Service\Cart\ProductClassAndOptionComparator

Đảm bảo rằng các mặt hàng với các phương thức thanh toán khác nhau có thể được thêm vào giỏ hàng cùng một lúc

Ví dụ: khi có các phương thức phân phối A/B và A/B, tương ứng,

  • Phương thức giao hàng
    • Phương thức giao hàng A: Loại bán hàng A / Thẻ tín dụng
    • Phương thức giao hàng B: Loại bán hàng A / tiền mặt khi giao hàng
  • Hàng hóa
    • Mục A: Bán hàng loại A
    • Mục B: Loại bán hàng B

Trong EC-CUBE 3.0, khi cố gắng đưa sản phẩm A vào giỏ hàng và sau đó đặt sản phẩm B vào giỏ hàng, sẽ xảy ra lỗi “Không thể mua sản phẩm này cùng một lúc”.

CartItemAllocatorBằng cách cài đặt nó, bạn sẽ có thể phân chia giỏ hàng theo bất kỳ tiêu chí nào. Ví dụ: bạn muốn gửi một mặt hàng được đặt hàng trước cùng một lúc vào giỏ hàng, nhưng bạn có thể tùy chỉnh nó như để giải quyết riêng đơn hàng (muốn tách đơn hàng) .

<?php
namespace Eccube\Service\Cart;

use Eccube\Entity\CartItem;

/**
 * 販売種別と予約商品フラグごとにカートを振り分ける CartItemAllocator
 */
class SaleTypeAndReserveCartAllocator implements CartItemAllocator
{
    /**
     * 商品の振り分け先となるカートの識別子を決定します。
     *
     * @param CartItem $Item カート商品
     * @return string
     */
    public function allocate(CartItem $Item)
    {
        $ProductClass = $Item->getProductClass();
        if ($ProductClass && $ProductClass->getSaleType()) {
            $salesTypeId = (string) $ProductClass->getSaleType()->getId();
            // isReserveItem は別途追加カスタマイズをしておく
            if ($ProductClass->isReserveItem()) {
                return $salesTypeId.':R' ;
            }
            return $salesTypeId;
        }
        throw new \InvalidArgumentException('ProductClass/SaleType not found');
    }
}

Để bật CartItemAllocator, hãy app/config/eccube/packages/cart.yamltạo và thêm định nghĩa của CartItem ALLocator.

services:
    Eccube\Service\Cart\CartItemAllocator:
      class: Eccube\Service\Cart\SaleTypeAndReserveCartAllocator

Tùy chỉnh luồng mua hàng # 2424

Xác nhận như xử lý tóm tắt và kiểm tra hàng tồn kho là logic phổ biến liên quan đến nhận đơn đặt hàng. Thông thường, nó được triển khai riêng lẻ trên màn hình để sử dụng, chẳng hạn như CartService và ShoppingService, có một vấn đề là khó đọc ảnh hưởng tại thời điểm tùy chỉnh và rất khó sử dụng lại (ví dụ: khi thay đổi logic tính toán của phí vận chuyển Nó là cần thiết để sửa chữa nhiều hơn một nơi trên)

Giờ đây, việc tùy chỉnh PurchFlow dễ dàng hơn để kiểm soát luồng tổng hợp và Bộ xử lý thực hiện từng xử lý, thay thế logic hoặc thêm xác thực mới.

Hoạt động

Toàn bộ hoạt động như sau.

hoạt động mua hàng

Lưu lượng kiểm soát dòng chảy

Ví dụ, trong ví dụ giỏ hàng, xử lý tóm tắt và xác nhận được thực hiện như sau.

  • Tải giỏ hàng từ phiên
  • Kiểm tra trạng thái hiện tại của chi tiết giỏ hàng (đảm bảo tính nhất quán trên cơ sở chi tiết đơn hàng)
    • Kiểm tra giới hạn bán hàng của sản phẩm
    • Kiểm tra hết hàng
    • Kiểm tra trạng thái công khai / riêng tư
  • Theo kết quả kiểm tra, quy trình làm tròn chi tiết được thực hiện
    • Giảm số lượng mặt hàng xuống giới hạn bán hàng – số lượng giới hạn bán hàng
    • Hết hàng – Xóa chi tiết (số được đặt thành 0)
    • Trạng thái Công khai / Riêng tư – Xóa các mục (số được đặt thành 0)
  • Xử lý tập hợp
    • Tổng hợp số tiền, phí vận chuyển, hoa hồng vv
  • Kiểm tra trạng thái hiện tại của giỏ hàng (đảm bảo tính nhất quán trong toàn bộ mặt hàng)
    • Có sự không nhất quán trong loại sản phẩm
    • Có sự không nhất quán trong phương thức thanh toán?
    • Cho dù giới hạn trên giá mua không vượt quá
  • Theo kết quả kiểm tra, trả về lỗi
  • Xử lý tập hợp
    • Tổng hợp số tiền, phí vận chuyển, hoa hồng vv

mặc định

Sơ đồ lớp

mặc định

Các vai trò lớp chính như sau.

ItemIHoldernterface

Một giao diện đại diện cho danh sách vật phẩm (tóm tắt của vật phẩm). Giỏ hàng và Đặt hàng là các lớp thực hiện.

Mặt hàng

Một giao diện đại diện cho một tuyên bố. CartItem và OrderItem là các lớp thực hiện.

Mua hàng nhanh

Nó kiểm soát dòng tổng thể của xử lý mục và xử lý tóm tắt. PurchasingFlow đã tính toán () thực hiện phương thức tổng hợp và mua () để thực hiện xử lý hoàn tất . Khi phương thức được thực thi, Item hoặc ItemHolder được truyền cho Bộ xử lý và Bộ xử lý được thực hiện tuần tự. Ngoài ra, trả lại kết quả thực hiện của Bộ xử lý cho người gọi.

ItemHolderProcessor

Bộ xử lý thực hiện xử lý trên ItemHolder (Đặt hàng và Giỏ hàng). Chúng tôi xác minh tính hợp lệ của giỏ hàng và toàn bộ đơn hàng như tính nhất quán của phương thức thanh toán và giới hạn trên của giá mua.

Bộ xử lý

Bộ xử lý thực hiện xử lý trên Item. Chúng tôi xác minh tính hợp lệ của các mặt hàng như hàng tồn kho và hạn chế bán hàng.

Bộ xử lý mua hàng

Bộ xử lý được gọi tại thời điểm xử lý hoàn thành. Chúng tôi sẽ xử lý ItemHolder. Bạn cũng có thể nhận ItemHolder trước khi thay đổi thông qua PurchasingContext.

Mua hàng Nội dung

Một lớp giữ trạng thái trong thời gian chạy. Khi bạn thêm thông tin vào Ngữ cảnh trên bộ điều khiển cuộc gọi, bạn có thể truy cập từ mỗi bộ xử lý.

MuaFlowResult

Lớp này giữ kết quả thực hiện của PurchasingFlow. Lỗi được tạo trong ItemProcessor được coi là Cảnh báo và Lỗi được tạo bởi ItemHolderProcessor được coi là Lỗi.

Ví dụ thực hiện bộ xử lý

EmptyProcessor::process() Khi nó được gọi, nhật ký thông tin là đầu ra.

<?php

namespace Plugin\PurchaseProcessors\Processor;

use Eccube\Entity\ItemInterface;
use Eccube\Service\PurchaseFlow\ItemProcessor;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\ProcessResult;

class EmptyProcessor implements ItemProcessor
{
    /**
     * @param ItemInterface $item
     * @param PurchaseContext $context
     * @return ProcessResult
     */
    public function process(ItemInterface $item, PurchaseContext $context)
    {
        log_info('empty processor executed', [__METHOD__]);
        return ProcessResult::success();
    }
}

ValidatableEmptyProcessor::validate()Khi Eccube\Service\PurchaseFlow\InvalidItemExceptionném vào, nó ValidatableEmptyProcessor::handle()được thực thi PurchaseFlowResult::warn()và trả về.

<?php

namespace Plugin\PurchaseProcessors\Processor;

use Eccube\Entity\ItemInterface;
use Eccube\Service\PurchaseFlow\InvalidItemException;
use Eccube\Service\PurchaseFlow\PurchaseContext;
use Eccube\Service\PurchaseFlow\ValidatableItemProcessor;

class ValidatableEmptyProcessor extends ValidatableItemProcessor
{
    protected function validate(ItemInterface $item, PurchaseContext $context)
    {
        $error = false;
        if ($error) {
            throw new InvalidItemException('ValidatableEmptyProcessorのエラーです');
        }
    }

    protected function handle(ItemInterface $item, PurchaseContext $context)
    {
        $item->setQuantity(100);
    }
}

Để kích hoạt Bộ xử lý của riêng bạn app/config/eccube/packages/purchaseflow.yaml, hãy sửa đổi định nghĩa của.

    eccube.purchase.flow.cart.item_processors:
        class: Doctrine\Common\Collections\ArrayCollection
        arguments:
            - #
                - '@Plugin\PurchaseProcessors\Processor\EmptyProcessor' # 追加
                - '@Eccube\Service\PurchaseFlow\Processor\DisplayStatusValidator'
                - '@Eccube\Service\PurchaseFlow\Processor\SaleLimitValidator'
                - '@Eccube\Service\PurchaseFlow\Processor\DeliverySettingValidator'
                - '@Eccube\Service\PurchaseFlow\Processor\StockValidator'
                - '@Eccube\Service\PurchaseFlow\Processor\ProductStatusValidator'
                - '@Plugin\PurchaseProcessors\Processor\ValidatableEmptyProcessor' # 追加

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *