首页 > 解决方案 > 根据产品属性使用自定义运输方式

问题描述

我正在尝试将产品自定义属性获取到我的自定义运输模块。但无法这样做。我尝试了论坛的各种问题,但我的问题仍然没有解决。但没有任何效果。我在产品属性中创建了一个名为 ars_freight_class 的自定义属性,并尝试在我的运输方法中获取该值,但是当我使用 $items->getProduct()->getAttributeText('ars_freight_class'); 时它显示为 null;它给 Null 以及只使用 getAttribute(('ars_freight_class') 也不起作用。然后我在产品中添加了一个名为 Freight 的新属性并使用 getFreight(); 也显示 null。所以请帮助我如何我可以在我的模型中获取自定义产品属性值。我正在使用下拉属性并在属性集中正确分配。

命名空间 Raveinfosys\Rlcarriers\Model\Carrier;

使用 Raveinfosys\Rlcarriers\Model\Carrier;

类 Rlcarriers 扩展 AbstractCarrierModel {

/**
 * Carrier's code
 *
 * @var string
 */

protected $_code = 'rlcarriers';

/**
 * Fields that should be replaced in debug with '***'
 *
 * @var array
 */
protected $_debugReplacePrivateDataKeys = ['APIKey'];

/**
 * Request Quote URL
 */
protected $_requestQuoteUrl = 'http://api.rlcarriers.com/1.0.1/RateQuoteService.asmx?WSDL';
protected $_apiKey = null;
protected $_debugData = [];

public function collectFreightRate()
{
    $request = $this->buildRequest();
    $this->_debugData['request'] = $request;
    try {
        $rates = $this->postRequest($request);
    } catch (\Exception $e) {
        return false;
    }
    return $rates;
}

public function buildRequest()
{
    $_originZip = $this->_dataHelper->getOriginPostcode();
    $_defaultShipClass = $this->_dataHelper->getShipclass();

    $this->_apiKey = $this->_dataHelper->decrypt($this->getConfigData('apikey'));

    if (!$this->_apiKey) {
        return false;
    }
    $request["APIKey"] = $this->_apiKey;
    $request["QuoteType"] = "Domestic";
    $request["CODAmount"] = "0";

    $request["Origin"] = [
        "City" => "",
        "StateOrProvince" => "",
        "ZipOrPostalCode" => trim($_originZip),
        "CountryCode" => $this->_dataHelper->getCountryISO3Code($this->_dataHelper->getOriginCountry())
    ];

    $request["Destination"] = [
        "City" => "",
        "StateOrProvince" => "",
        "ZipOrPostalCode" => trim($this->_request->getDestPostcode()),
        "CountryCode" => $this->_dataHelper->getCountryISO3Code($this->_request->getDestCountryId()),
    ];
    $request["DeclaredValue"] = 0;

    $request["OverDimensionPcs"] = 0;

    $items = [];
    $cn = 0;
    foreach ($this->getItems() as $item) {
        $items[$cn]['Class'] = (float) ($this->_dataHelper->getShipclass());
        $items[$cn]['Weight'] = (float) ceil($item->getProduct()->getWeight() * $item->getQty());
        $items[$cn]['Freight'] = $items->getProduct()->getFreight();
       $items[$cn]['Freight'] = $items->getProduct()->getAttributeText('ars_freight_class');
         $items[$cn]['Height'] = (float) $item->getProduct()->getPrice();
        $items[$cn]['Width'] =  $item->getProduct()->getVisibility();
        $items[$cn]['Length'] = (float) $item->getProduct()->getFreightLength();
    }


    $request["Accessorials"] = [];

    $request["Items"] = $items;

    return $request;
}

public function postRequest($request)
{
    try {
        $client = new \Zend\Soap\Client($this->_requestQuoteUrl);
        $response = $client->GetRateQuote(["APIKey" => $this->_apiKey, "request" => $request]);
        $this->_debugData['result'] = $response;
        $_results = $this->parseXmlResponse($response);
    } catch (\Exception $e) {
        $this->_debugData['result'] = $e->getMessage();
        return false;
    }
    $this->debugRlcData($this->_debugData);
    return $_results;
}

public function parseXmlResponse($response)
{
    $_rates = [];
    try {
        $_result = $response->GetRateQuoteResult->Result;
        $_rlcRates = $_result->ServiceLevels->ServiceLevel;
    } catch (\Exception $e) {
        return $_rates;
    }
    $_allowdMethods = $this->getConfigData('allowed_methods_rl');
    if (is_array($_rlcRates)) {
        $_methods = explode(',', $_allowdMethods);
        foreach ($_rlcRates as $_rlcRate) {
            if (!in_array($_rlcRate->Code, $_methods)) {
                continue;
            }
            $_rate = preg_replace('/[^0-9.]* /', '', str_replace('$', '', $_rlcRate->NetCharge));
            $_rates[] = [
                'rate'      => $_rate,
                'method'    => $_rlcRate->Title,
                'code'      => $_rlcRate->Code,
                'carrier'   => $this->_code
            ];
        }
    } else {
        $_rate = preg_replace('/[^0-9.]*/', '', str_replace('$', '', $_result->ServiceLevels->ServiceLevel->NetCharge));
        $_rates[] = [
            'rate'      => $_rate,
            'carrier'   => $this->_code,
            'method'    => $_result->ServiceLevels->ServiceLevel->Title,
            'code'      => $_result->ServiceLevels->ServiceLevel->Code
        ];
    }
    return $_rates;
}

}

标签: phpmagento2

解决方案


推荐阅读