Colección falla cuando se utiliza un usuario administrador más restringida

magento.stackexchange https://magento.stackexchange.com/questions/4877

  •  16-10-2019
  •  | 
  •  

Pregunta

Tengo el siguiente colección que ayuda a implementar un informe personalizado.

<?php


class VMR_Customreports_Model_Resource_Productsordered_Collection
    extends Mage_Reports_Model_Resource_Order_Collection
{
    public function __construct()
    {
        parent::__construct();
        $this->_init('sales/order_item');
    }

    public function setDateRange($from, $to)
    {
        $this->_reset();
        $this->getSelect()
            ->joinInner(
                array('i' => $this->getTable('sales/order_item')),
                'i.`order_id` = main_table.`entity_id`'
            )
            ->where("main_table.created_at BETWEEN '" . $from . "' AND '" . $to . "'")
            ->where('main_table.status != \'canceled\'')
            ->where('main_table.customer_email NOT LIKE \'%@v2cigs.%\'')
            ->where('i.parent_item_id IS NULL')
            ->columns(array(
                'myname' => 'i.name',
                'ordered_qty' => 'sum(i.qty_ordered)',
                'ordered_money' => 'sum(i.`price`*i.qty_ordered)'))
            ->group('i.name');

        return $this;
    }

    public function setStoreIds($storeIds)
    {
        if ($storeIds)
            $this->addAttributeToFilter('i.store_id', array('in' => (array)$storeIds));

        return $this;
    }

}

Cuando está registrado como administrador completo, selecciona los datos correctos pero cuando está registrado como un usuario más restringido me sale un error acerca de "violación de integridad: 1052 Columna 'store_id' en donde cláusula es ambigua".
Puedo entender que se está hablando de estar presente store_id tanto en la tabla order_item y en la tabla de orden, pero estoy especificando la mesa para tirar partir del momento en store_id.

Por otra parte, el error ocurre justo en la unión. Si comento hacia fuera el código store_id todavía consigo el error. ¿Por qué?

¿Fue útil?

Solución

Si está utilizando la versión Enterprise Edition, el módulo AdminGws está aplicando filtros tienda de alcance por lo que los administradores sólo son capaces de acceder a los datos que están autorizados a ver.

Además, es probable que se quite cualquier método __construct(). Véase más abajo para información adicional.

Antecedentes:

se extiende desde Mage_Reports_Model_Resource_Order_Collection. Esta clase utiliza la tabla sales/order (es decir, sales_flat_order como la tabla principal.

 $this->getSelect()->from(array('main_table' => $this->getMainTable()));

La tabla principal es en realidad descargue de la modelo de recursos asociada:

public function getMainTable()
{
    if ($this->_mainTable === null) {
        $this->setMainTable($this->getResource()->getMainTable());
    }

    return $this->_mainTable;
}

Así que el modelo de recurso es responsable de suministrar el nombre de la tabla principal.
Mage::getResourceModel($this->getResourceModelName()) se utiliza para recoger el modelo de recursos.
Entonces, ¿qué retorno getResourceModelName()?
Devuelve el valor que se establece por la llamada _init().

protected function _init($model, $resourceModel = null)
{
    $this->setModel($model);
    if (is_null($resourceModel)) {
        $resourceModel = $model;
    }
    $this->setResourceModel($resourceModel);
    return $this;
}

En su clase, está sustituyendo la llamada _init() de la clase padre:

$this->_init('sales/order_item');

En efecto, está especificando que su colección debe utilizar el modelo de recursos posición de la orden, que devolverá la sales/order_item tabla como la tabla principal.
Debido a su llamada _init() se está uniendo a la mesa sales_flat_order_item consigo mismo.
Fijación de que mediante la eliminación de la llamada _init(), o, de hecho, toda la anulación __construct(), probablemente solucionar ese problema para usted.

Otros consejos

Si hago esto:

public function addStoreAttributeToFilter($collection)
{
    if($collection->getModelName() == 'sales/order' || $collection->getModelName() == 'sales/order_item')
    {
        $collection->addFieldToFilter('main_table.store_id', array('in' => $this->_role->getStoreIds()));
    }
    else
    {
        $collection->addAttributeToFilter('store_id', array('in' => $this->_role->getStoreIds()));
    }
}

en AdminGws / modelo / Collections.php

y en mi colección crear un constructor, que hace $ this -.> _ Init ( 'ventas / order_item') funciona

La parte del constructor que no tiene sentido para mí, pero me preguntará por que por separado.

Hoy me enfrentaba a un problema similar. Encender $_logAllQueries como @Vinai sugirieron mostraron que Enterprise_AdminGws se filtraba por mi colección store_id. Me fijo añadiendo:

$collection->addFilterToMap('store_id', 'main_table.store_id');

justo antes de la $this->setCollection($collection);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top