Коллекция не удается при использовании более ограниченного пользователя администратора

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

  •  16-10-2019
  •  | 
  •  

Вопрос

У меня есть следующая коллекция, которая помогает внедрить пользовательский отчет.

<?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;
    }

}

Когда я вхожу в систему как полный администратор, он выбирает правильные данные, но когда я вхожу в систему в качестве более ограниченного пользователя, я получаю ошибку, «Нарушение ограничений целостности: 1052 столбец« store_id », где предложение является неоднозначным».
Я могу понять, что это говорит о том, что Store_id присутствует как в таблице ORDER_ITEM, так и в таблице заказов, но я указываю таблицу, чтобы вытащить при использовании store_id.

Кроме того, ошибка происходит прямо на соединении. Если я прокомментирую код Store_id, я все еще получаю ошибку. Почему?

Это было полезно?

Решение

Если вы используете Enterprise Edition, AdminGws Модуль применяет фильтры с прицелом хранилища, поэтому администраторы могут получить доступ только к данным, которые им разрешены.

Кроме того, вы, вероятно, хотите удалить свой __construct() метод См. Ниже дополнительную информацию.

Фон:

Вы простираетесь от Mage_Reports_Model_Resource_Order_CollectionАнкет Этот класс использует sales/order таблица (то есть sales_flat_order как основной стол.

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

Основная таблица фактически извлекается из соответствующей модели ресурсов:

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

    return $this->_mainTable;
}

Таким образом, модель ресурса отвечает за предоставление основного имени таблицы.
Mage::getResourceModel($this->getResourceModelName()) используется для сбора модели ресурса.
Так что же getResourceModelName() возвращаться?
Он возвращает значение, которое было установлено _init() вызов.

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

В вашем классе вы переоцениваете _init() Call of the Parent Class:

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

По сути, вы указываете, что ваша коллекция должна использовать модель ресурса элемента заказа, которая вернет таблицу sales/order_item как основной стол.
Из -за вашего _init() звоните, вы присоединяетесь к sales_flat_order_item стол с собой.
Исправить это, удалив _init() позвонить, или на самом деле все __construct() Переопределить, вероятно, решит эту проблему для вас.

Другие советы

Если я сделаю это:

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()));
    }
}

в AdmingWs/model/collections.php

И в моей коллекции создайте конструктор, который делает $ this-> _ init ('sales/order_item') он работает.

Часть конструктора не имеет смысла для меня, но я буду спрашивать об этом отдельно.

Сегодня я столкнулся с аналогичной проблемой. Включение $_logAllQueries Как показал @Vinai, показал, что Enterprise_AdminGws отфильтровывал мою коллекцию store_id. Анкет Я исправил это, добавив:

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

прямо перед $this->setCollection($collection);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top