Collection échoue lors de l'utilisation d'un utilisateur admin plus restreint

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

  •  16-10-2019
  •  | 
  •  

Question

J'ai la collection suivante qui aide à mettre en œuvre un rapport personnalisé.

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

}

Quand je me connecte en tant qu'administrateur complet, il sélectionne les bonnes données, mais quand je me connecte comme un utilisateur restreint plus je reçois une erreur au sujet de « l'intégrité violation de contrainte: 1052 Colonne « store_id » dans la clause where est ambiguë ».
Je peux comprendre qu'il parle store_id être présent à la fois dans la table order_item et dans le tableau de commande, mais je spécifie la table à tirer de l'utilisation de store_id.

En outre, l'erreur se produit juste à la jointure. Si je commente le code store_id je reçois toujours l'erreur. Pourquoi?

Était-ce utile?

La solution

Si vous utilisez l'Enterprise Edition, le module AdminGws applique des filtres à portée de magasin afin que les administrateurs ne sont en mesure d'accéder aux données qu'ils sont autorisés à voir.

, vous voulez probablement supprimer votre méthode __construct(). Voir ci-dessous pour des informations supplémentaires.

Contexte:

Vous étendons de Mage_Reports_Model_Resource_Order_Collection. Cette classe utilise la table de sales/order (qui est, sales_flat_order comme la table principale.

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

Le tableau principal est en fait tiré par les cheveux à partir du modèle de ressource associée:

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

    return $this->_mainTable;
}

Ainsi, le modèle de ressource est responsable de fournir le nom de la table principale.
Mage::getResourceModel($this->getResourceModelName()) est utilisé pour recueillir le modèle de ressources.
Alors, qu'est-ce que le retour de getResourceModelName()?
Il retourne la valeur définie par l'appel _init().

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

Dans votre classe, vous surchargez l'appel _init() de la classe parente:

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

En effet, vous indiquez que votre collection doit utiliser le modèle de ressources de l'élément de commande, qui retourne la table sales/order_item comme la table principale.
En raison de votre appel _init() vous joindrez la table sales_flat_order_item avec lui-même.
Fixation que, en supprimant l'appel _init(), ou en fait toute override __construct(), va probablement résoudre ce problème pour vous.

Autres conseils

Si je fais ceci:

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

dans AdminGws / Modèle / Collections.php

et dans ma collection créer un constructeur qui ne $ this -.> _ Init ( 'ventes / de order_item'), il fonctionne

La partie constructeur n'a pas de sens pour moi, mais je demanderai à ce sujet séparément.

Aujourd'hui, je faisais face à un problème similaire. Mise sous tension $_logAllQueries comme @Vinai a montré que Enterprise_AdminGws ont suggéré de filtrait ma collection par store_id. Je l'ai fixé en ajoutant:

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

juste avant la $this->setCollection($collection);

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top