2010-10-12 13 views
5

J'ai étendu le formulaire d'information client de Magento pour stocker un attribut supplémentaire pour le client. Appelons-le 'customer_referrer_id'.Comment obtenir des données pour une entité (par exemple client) de la table eav_attribute à afficher dans Customer Grid pour l'administrateur

J'ai un rôle de 'référant' qui a accès à la grille de client et à la grille de commande seulement. Mais, je veux restreindre un référent à ne voir que les clients de la grille qui ont l'ID client_referrer comme ID du référent qui s'est connecté. De même pour les commandes, le référent connecté ne pourra voir que les commandes effectuées par les clients qui ayez customer_referrer_id = loggedin_referrer_id.

Je sais déjà comment passer outre un module et que je dois remplacer principalement Adminhtml/Bloc/Client/Grille :: _ prepareCollection et Adminhtml/Bloc/Ventes/commande/Grille :: _ prepareCollection

J'utilise Magento 1.4.1.1

Ceci est mon fichier de déclaration du module dans app/etc/modules/Myproject_Adminhtml

<?xml version="1.0"?> 

<config> 
    <modules> 
     <Myproject_Adminhtml> 
      <active>true</active> 
      <codePool>local</codePool> 
      <depends> 
       <Mage_Sales /> 
      </depends> 
     </Myproject_Adminhtml> 
    </modules> 
</config> 

Et mes modules config.xml dans local/Myproject/Adminhtml/etc/est la suivante:

<config> 
    <modules> 
     <Myproject_Adminhtml> 
      <version>1.0.0</version> 
     </Myproject_Adminhtml>  
    </modules> 

    <global> 
      <blocks> 
      <adminhtml> 
       <rewrite> 
       <sales_order_grid>Myproject_Adminhtml_Block_Sales_Order_Grid</sales_order_grid> 
       <customer_grid>Myproject_Adminhtml_Block_Customer_Grid</customer_grid> 
       </rewrite> 
      </adminhtml> 
     </blocks> 
    </global> 
</config> 

Et

class Myproject_Adminhtml_Block_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid 
{ 
    protected function _prepareCollection() 
    { 
     $collection = Mage::getResourceModel('customer/customer_collection') 
     ->addNameToSelect() 
     ->addAttributeToSelect('email') 
     ->addAttributeToSelect('created_at') 
     ->addAttributeToSelect('group_id') 
     ->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left') 
     ->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left') 
     ->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left') 
     ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left') 
     ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');  

     $this->setCollection($collection); 

     $referrer_id = Mage::getSingleton('admin/session')->getUser()->getId(); 
     Mage::log('Logged in admin has id: ' . $referrer_id); 

     return parent::_prepareCollection(); 
    } 
} 
+0

Je n'ai rien essayé pour ce cas, sauf essayer d'utiliser collection-> getSelect() -> joinLeft(). Mais je n'ai pas été en mesure de déterminer quels paramètres sont exactement requis.En plus de cela, j'ai essayé d'obtenir customer_group_id de la table sales_flat_order en grille de commande, en utilisant joinAttribute ('order', 'main_entity.entity_id = order.entity_id', 'customer_group_id'), mais cela n'a pas fonctionné pour moi non plus. –

+0

Je vois le message "HURRAY" dans /var/log/system.log –

Répondre

5

Ma première tentative serait (pour les deux fichiers mentionnés),

$collection->addAttributeToFilter('customer_referrer_id', $referrer_id); 

$referrer_id est la valeur que vous devez récupérer de l'utilisateur connecté. Puisque vous semblez utiliser des utilisateurs admin - qui sont des entités distinctes des clients - c'est une façon de récupérer; Remarque: l'utilisateur admin actuellement connecté n'apparaît pas dans la base de données uniquement. Il ne peut donc pas s'agir d'une jointure de table.

Sur un autre point j'utiliserais le frontend pour les referrers au lieu de l'admin. Les nouveaux clients et leurs commandes apparaîtraient dans le compte client du référent, similaire à leur propre page "Mes commandes". Bien sûr, je ne sais pas quelles autres exigences vous devez respecter.

Deuxième partie

Override Mage_Adminhtml_Block_Sales_Order_Grid::_prepareCollection() à ressembler à ceci:

protected function _prepareCollection() 
{ 
    $collection = Mage::getResourceModel('customer/customer_collection'); 
    $collection->getSelect()->reset('columns'); // remove all customer columns 
    $collection->addAttributeToFilter('entity_id', $referrer_id); 
    $collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('*')); 

    $this->setCollection($collection); 
    return parent::_prepareCollection(); 
} 

Cela est nécessaire parce que la table d'origine sales/order_grid est plat, pas une collection d'entités, et ne peut donc pas être jointe à les attributs. Ce qui précède fonctionne à l'inverse, en commençant par une collection de clients et ensuite rejoindre la table à plat après.

Une méthode peut-être plus simple serait de surcharger sales/order_grid_collection avec votre propre classe de collection qui effectue tout cela. Même s'il suit mieux les conventions de codage, c'est plus de travail et pas plus fonctionnel à la fin.

+0

Ce qui précède a été posté avant que j'ai vu que la question avait été mise à jour avec des exemples. Je vois maintenant que vous avez déjà essayé quelque chose de similaire. – clockworkgeek

+0

ok, les clients sont filtrés correctement maintenant. Et, même s'il semble évident que les deux mêmes lignes ne fonctionneraient pas pour filtrer la table des commandes, j'ai déjà essayé d'ajouter ces lignes dans Sales_Order_Grid :: _ prepareCollection. Comment filtrer les commandes effectuées par les clients dont customer_referrer_id = loggedin_referrer_id –

+0

J'ai également supprimé le remplacement _prepareColumn, qui est présent dans ma question initiale, juste pour valider l'affichage des résultats corrects. –