Magento 2 插件/拦截器访问和修改 $this 对象

Magento 2 Plugins / Interceptors accessing and modifying $this object

我有一个插件,我想在 Magento 2 的特定 class 中修改方法的功能,但是我不太确定如何访问原始对象和 return 修改后的数据。

原始方法

protected function _initTotals()
{
    $source = $this->getSource();

    $this->_totals = [];
    $this->_totals['subtotal'] = new \Magento\Framework\DataObject(
        ['code' => 'subtotal', 'value' => $source->getSubtotal(), 'label' => __('Subtotal')]
    );

    /**
     * Add shipping
     */
    if (!$source->getIsVirtual() && ((double)$source->getShippingAmount() || $source->getShippingDescription())) {
        $this->_totals['shipping'] = new \Magento\Framework\DataObject(
            [
                'code' => 'shipping',
                'field' => 'shipping_amount',
                'value' => $this->getSource()->getShippingAmount(),
                'label' => __('Shipping & Handling'),
            ]
        );
    }

    /**
     * Add discount
     */
    if ((double)$this->getSource()->getDiscountAmount()) {
        if ($this->getSource()->getDiscountDescription()) {
            $discountLabel = __('Discount (%1)', $source->getDiscountDescription());
        } else {
            $discountLabel = __('Discount');
        }
        $this->_totals['discount'] = new \Magento\Framework\DataObject(
            [
                'code' => 'discount',
                'field' => 'discount_amount',
                'value' => $source->getDiscountAmount(),
                'label' => $discountLabel,
            ]
        );
    }

    $this->_totals['grand_total'] = new \Magento\Framework\DataObject(
        [
            'code' => 'grand_total',
            'field' => 'grand_total',
            'strong' => true,
            'value' => $source->getGrandTotal(),
            'label' => __('Grand Total'),
        ]
    );

    /**
     * Base grandtotal
     */
    if ($this->getOrder()->isCurrencyDifferent()) {
        $this->_totals['base_grandtotal'] = new \Magento\Framework\DataObject(
            [
                'code' => 'base_grandtotal',
                'value' => $this->getOrder()->formatBasePrice($source->getBaseGrandTotal()),
                'label' => __('Grand Total to be Charged'),
                'is_formated' => true,
            ]
        );
    }
    return $this;
}

我已经设置了一个插件来修改上面方法的功能 di.xml:

<type name="Magento\Sales\Block\Order\Totals">
    <plugin disabled="false" name="Harrigo_EverDiscountLabel_Plugin_Magento_Sales_Block_Order_Totals" sortOrder="10" type="Harrigo\EverDiscountLabel\Plugin\Magento\Sales\Block\Order\Totals"/>
</type>

插件

class Totals
{

    public function after_initTotals(
        \Magento\Sales\Block\Order\Totals $subject,
        $result
    ) {
        if ((double)$subject->getSource()->getDiscountAmount() != 0 OR $subject->getSource()->getDiscountDescription() != null) {
            if ($subject->getSource()->getDiscountDescription()) {
                $discountLabel = __('Offer (%1)', $source->getDiscountDescription());
            } else {
                $discountLabel = __('Offer');
            }
            $subject->_totals['discount'] = new \Magento\Framework\DataObject(
                [
                    'code' => 'discount',
                    'field' => 'discount_amount',
                    'value' => $source->getDiscountAmount(),
                    'label' => $discountLabel,
                ]
            );
        }
        return $subject;
    }
}

在插件中使用 $subject 而不是 $this,但这对我不起作用。如何访问插件中的 $this 对象以从插件中添加/覆盖 $this->_totals['discount'] 和 return 更新后的 $this 对象。我让它在标准偏好下工作正常,但如果可能的话我宁愿使用插件。

我认为你应该在执行上面的代码之前检查一下。 http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html 根据无法拦截 Magento2 受保护函数的 devdocs,因此我们不能为此使用插件。

可能是您遇到的问题。 希望这对您有所帮助!