Free Shipping by certain user group
-
08-01-2021 - |
문제
following code:
/magento/vendor/magento/module-sales/Block/Adminhtml/Order/Create/Shipping/Method/Form.php
<?php
/**
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method;
use Magento\Framework\Pricing\PriceCurrencyInterface;
use Magento\OfflineShipping\Model\Carrier\Freeshipping;
/**
* Adminhtml sales order create shipping method form block
*
* @author Magento Core Team <core@magentocommerce.com>
*/
class Form extends \Magento\Sales\Block\Adminhtml\Order\Create\AbstractCreate
{
/**
* Shipping rates
*
* @var array
*/
protected $_rates;
/**
* Tax data
*
* @var \Magento\Tax\Helper\Data
*/
protected $_taxData = null;
/**
* @var PriceCurrencyInterface
*/
protected $priceCurrency;
protected $orderCreate;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Model\Session\Quote $sessionQuote
* @param \Magento\Sales\Model\AdminOrder\Create $orderCreate
* @param PriceCurrencyInterface $priceCurrency
* @param \Magento\Tax\Helper\Data $taxData
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Model\Session\Quote $sessionQuote,
\Magento\Sales\Model\AdminOrder\Create $orderCreate,
PriceCurrencyInterface $priceCurrency,
\Magento\Tax\Helper\Data $taxData,
array $data = []
) {
$this->_taxData = $taxData;
$this->orderCreate = $orderCreate;
parent::__construct($context, $sessionQuote, $orderCreate, $priceCurrency, $data);
}
/**
* Constructor
*
* @return void
*/
protected function _construct()
{
parent::_construct();
$this->setId('sales_order_create_shipping_method_form');
}
/**
* Retrieve quote shipping address model
*
* @return \Magento\Quote\Model\Quote\Address
*/
public function getAddress()
{
return $this->getQuote()->getShippingAddress();
}
/**
* Retrieve array of shipping rates groups
*
* @return array
*/
public function getShippingRates()
{
$usergroup = $this->orderCreate->getCustomerGroupId();
if($usergroup == 1) {
} else {
error_log("Nichtmitgliedsbetrieb");
}
if (empty($this->_rates)) {
$this->_rates = $this->getAddress()->getGroupedAllShippingRates();
}
return $this->_rates;
}
/**
* Rertrieve carrier name from store configuration
*
* @param string $carrierCode
* @return string
*/
public function getCarrierName($carrierCode)
{
if ($name = $this->_scopeConfig->getValue(
'carriers/' . $carrierCode . '/title',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$this->getStore()->getId()
)
) {
return $name;
}
return $carrierCode;
}
/**
* Retrieve current selected shipping method
*
* @return string
*/
public function getShippingMethod()
{
return $this->getAddress()->getShippingMethod();
}
/**
* Check activity of method by code
*
* @param string $code
* @return bool
*/
public function isMethodActive($code)
{
return $code === $this->getShippingMethod();
}
/**
* Retrieve rate of active shipping method
*
* @return \Magento\Quote\Model\Quote\Address\Rate|false
*/
public function getActiveMethodRate()
{
$rates = $this->getShippingRates();
if (is_array($rates)) {
foreach ($rates as $group) {
foreach ($group as $rate) {
if ($rate->getCode() == $this->getShippingMethod()) {
return $rate;
}
}
}
}
return false;
}
/**
* Get rate request
*
* @return mixed
*/
public function getIsRateRequest()
{
return $this->getRequest()->getParam('collect_shipping_rates');
}
/**
* Get shipping price
*
* @param float $price
* @param bool $flag
* @return float
*/
public function getShippingPrice($price, $flag)
{
/*
$usergroup = $this->orderCreate->getCustomerGroupId();
if($usergroup == 1) {
return "0 €";
} else {
return $this->priceCurrency->convertAndFormat(
$this->_taxData->getShippingPrice(
$price,
$flag,
$this->getAddress(),
null,
$this->getAddress()->getQuote()->getStore()
),
true,
PriceCurrencyInterface::DEFAULT_PRECISION,
$this->getQuote()->getStore()
);
}
*/
return $this->priceCurrency->convertAndFormat(
$this->_taxData->getShippingPrice(
$price,
$flag,
$this->getAddress(),
null,
$this->getAddress()->getQuote()->getStore()
),
true,
PriceCurrencyInterface::DEFAULT_PRECISION,
$this->getQuote()->getStore()
);
}
}
How can I activate free shipping for certain user group? Take a look at getShippingRates();
Thanks!!!
EDIT: the problem is, that it always takes Tablerates-Shipping as Shipment-Method even though the initial order had Freeshipping as Shipping-Method.
해결책
Try this code
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Sales\Block\Adminhtml\Order\Create\Shipping\Method;
use Magento\Framework\Pricing\PriceCurrencyInterface;
/**
* Adminhtml sales order create shipping method form block
*
* @api
* @author Magento Core Team <core@magentocommerce.com>
* @since 100.0.2
*/
class Form extends \Magento\Sales\Block\Adminhtml\Order\Create\AbstractCreate
{
/**
* Shipping rates
*
* @var array
*/
protected $_rates;
/**
* Tax data
*
* @var \Magento\Tax\Helper\Data
*/
protected $_taxData = null;
/**
* @var PriceCurrencyInterface
*/
protected $priceCurrency;
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Model\Session\Quote $sessionQuote
* @param \Magento\Sales\Model\AdminOrder\Create $orderCreate
* @param PriceCurrencyInterface $priceCurrency
* @param \Magento\Tax\Helper\Data $taxData
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\Magento\Backend\Model\Session\Quote $sessionQuote,
\Magento\Sales\Model\AdminOrder\Create $orderCreate,
PriceCurrencyInterface $priceCurrency,
\Magento\Tax\Helper\Data $taxData,
array $data = [],
\Magento\Customer\Model\CustomerFactory $customerFactory
) {
$this->_taxData = $taxData;
$this->customerFactory = $customerFactory ;
parent::__construct($context, $sessionQuote, $orderCreate, $priceCurrency, $data);
}
/**
* Constructor
*
* @return void
*/
protected function _construct()
{
parent::_construct();
$this->setId('sales_order_create_shipping_method_form');
}
/**
* Retrieve quote shipping address model
*
* @return \Magento\Quote\Model\Quote\Address
*/
public function getAddress()
{
return $this->getQuote()->getShippingAddress();
}
/**
* Retrieve array of shipping rates groups
*
* @return array
*/
public function getShippingRates()
{
if (empty($this->_rates)) {
$this->_rates = $this->getAddress()->getGroupedAllShippingRates();
}
if ($this->getRequest()->getPost('customer_id')) {
$customer = $this->customerFactory->create()->load($this->getRequest()->getPost('customer_id'));
if ($customer->getId() > 0) {
if($customer->getGroupId() == 1) {
} else {
error_log("Nichtmitgliedsbetrieb");
}
}
}
return $this->_rates;
}
/**
* Rertrieve carrier name from store configuration
*
* @param string $carrierCode
* @return string
*/
public function getCarrierName($carrierCode)
{
if ($name = $this->_scopeConfig->getValue(
'carriers/' . $carrierCode . '/title',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$this->getStore()->getId()
)
) {
return $name;
}
return $carrierCode;
}
/**
* Retrieve current selected shipping method
*
* @return string
*/
public function getShippingMethod()
{
return $this->getAddress()->getShippingMethod();
}
/**
* Check activity of method by code
*
* @param string $code
* @return bool
*/
public function isMethodActive($code)
{
return $code === $this->getShippingMethod();
}
/**
* Retrieve rate of active shipping method
*
* @return \Magento\Quote\Model\Quote\Address\Rate|false
*/
public function getActiveMethodRate()
{
$rates = $this->getShippingRates();
if (is_array($rates)) {
foreach ($rates as $group) {
foreach ($group as $rate) {
if ($rate->getCode() == $this->getShippingMethod()) {
return $rate;
}
}
}
}
return false;
}
/**
* Get rate request
*
* @return mixed
*/
public function getIsRateRequest()
{
return $this->getRequest()->getParam('collect_shipping_rates');
}
/**
* Get shipping price
*
* @param float $price
* @param bool $flag
* @return float
*/
public function getShippingPrice($price, $flag)
{
return $this->priceCurrency->convertAndFormat(
$this->_taxData->getShippingPrice(
$price,
$flag,
$this->getAddress(),
null,
$this->getAddress()->getQuote()->getStore()
),
true,
PriceCurrencyInterface::DEFAULT_PRECISION,
$this->getQuote()->getStore()
);
}
}
Never do change in vendor folder, You have to create plugin to overwrite this functionality.
다른 팁
ou can add new shipping method by creating new module by following this tutorial, then you can check specific customer group in /Model/Carrier.php like this:
public function __construct(
...
\Magento\Customer\Model\Session $customerSession,
...
) {
...
$this->_customerSession = $customerSession;
...
}
public function collectRates(RateRequest $request)
{
...
//get customer group id
$customerGroup = $this->_customerSession->getCustomer()->getGroupId();
if($customerGroup == 'X' || $customerGroup == 'Y'){
$method->setPrice('0');
$method->setCost('0');
}
...
}
제휴하지 않습니다 magento.stackexchange