Magento 2:如何通过自定义送货方式在collectRates期间获得客户

时间:2019-03-22 19:53:15

标签: magento2 shipping-method

如何在我的自定义送货方式的collectRates()函数期间获取客户和购物车。

public function __construct(
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory,
    \Psr\Log\LoggerInterface $logger,
    \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory,
    \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory,
    \Magento\Checkout\Model\Cart $cart,
    \Magento\Customer\Model\Session $customerSession,
    array $data = []
) {
    $this->_cart = $cart;
    $this->_rateResultFactory = $rateResultFactory;
    $this->_rateMethodFactory = $rateMethodFactory;
    $this->_customerSession = $customerSession;

    parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);
}

public function collectRates(RateRequest $request)
{

    if (!$this->getConfigFlag('active')) {
        return false;
    }

    if(!$this->_customerSession->isLoggedIn()) {
        return false;
    }

    $customer = $this->_customerSession->getCustomer();
    $qty = $this->_cart->getItemsQty();
    ...

使用客户会话并检查isLoggedIn()是否仅适用于前端,但是在管理员下订单时返回false。

如何才能正确地吸引客户并计算前端和管理员订单放置位置的每项价格?

1 个答案:

答案 0 :(得分:1)

如果您可以检测代码何时在Admin中运行,则可以使用 \ Magento \后端\模型\会话\行情 作为您的[admin_session],并使用[admin_session]-> getCustomerId()以及客户存储库(在构造函数中注入接口,并让DI传递正确的对象)来获取客户对象。

我建议检查\ Magento \ Backend \ Model \ Session \ Quote对象的内容,因为它可能已经包含一个预加载的客户对象,在这种情况下,您可以避免加载它。

您可以使用\ Magento \ Framework \ App \ State :: getAreaCode()检查是否在管理员范围内