Collection échoue lors de l'utilisation d'un utilisateur admin plus restreint
-
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?
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);