¿Cómo anular o deshabilitar los complementos principales en Magento2?

14

Estoy construyendo un mercado usando Magento2. Por esa razón, necesito poder cargar el pedido del cliente utilizando las credenciales de cliente del proveedor.

El problema con esto es que Magento2 utiliza un complemento para verificar que solo el cliente de este pedido (o un administrador) pueda cargar el pedido.

En este caso, necesito anular el complemento como un todo o anular el método protegido isAllowed(). ¿Qué puedo hacer sin modificar el núcleo?

Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization Se ve como esto:

use Magento\Authorization\Model\UserContextInterface;
use Magento\Framework\Exception\NoSuchEntityException;
class Authorization
{
    /**
     * @var UserContextInterface
     */
    protected $userContext;

    /**
     * @param UserContextInterface $userContext
     */
    public function __construct(
        \Magento\Authorization\Model\UserContextInterface $userContext
    ) {
        $this->userContext = $userContext;
    }

    /**
     * Checks if order is allowed
     *
     * @param \Magento\Sales\Model\ResourceModel\Order $subject
     * @param callable $proceed
     * @param \Magento\Framework\Model\AbstractModel $order
     * @param mixed $value
     * @param null|string $field
     * @return \Magento\Sales\Model\Order
     * @throws NoSuchEntityException
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function aroundLoad(
        \Magento\Sales\Model\ResourceModel\Order $subject,
        \Closure $proceed,
        \Magento\Framework\Model\AbstractModel $order,
        $value,
        $field = null
    ) {
        $result = $proceed($order, $value, $field);
        if (!$this->isAllowed($order)) {
            throw NoSuchEntityException::singleField('orderId', $order->getId());
        }
        return $result;
    }

    /**
     * Checks if order is allowed for current customer
     *
     * @param \Magento\Sales\Model\Order $order
     * @return bool
     */
    protected function isAllowed(\Magento\Sales\Model\Order $order)
    {
        return $this->userContext->getUserType() == UserContextInterface::USER_TYPE_CUSTOMER
            ? $order->getCustomerId() == $this->userContext->getUserId()
            : true;
    }
}
awavi
fuente

Respuestas:

23

1) Puede deshabilitar el complemento por nombre. En tu caso es authorization.

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" disabled="true" />
</type>
<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="vendor_name_authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>

Luego, debe crear su propia clase, que extenderá la clase de complemento magento. En la propia clase, puede sobrescribir el método protegido.

2) Puede hacerlo sin eliminar y volver a crear el complemento:

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>

Código de muestra de su clase de complemento:

namespace Vendor\Name\Model\ResourceModel\Plugin\Sales\Order;
class Authorization extends \Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization
{
    protected function isAllowed(\Magento\Sales\Model\Order $order)
    {
            ///You code here
    }
}
sergei.sss
fuente
He intentado por complemento primordial dentro de la carpeta webapi_rest pero no su trabajo
bhargav Shastri
6

Si utiliza la primera solución de sergei.sss , obtendrá el error de duplicar Magento \ Sales \ Model \ ResourceModel \ Order \ Plugin \ Authorization
La forma correcta de hacerlo es:

<type name="Magento\Sales\Model\ResourceModel\Order\Plugin\Authorization">
    <plugin name="authorization" disabled="true" />
    <plugin name="vendor_name_authorization" type="Vendor\Name\Model\ResourceModel\Plugin\Sales\Order\Authorization" sortOrder="1" />
</type>
fudu
fuente