2010-10-12 5 views
5

Ho esteso modulo informazioni sui clienti di Magento per memorizzare un attributo aggiuntivo per il cliente. Lo chiamo 'customer_referrer_id'.Come ottenere i dati per un'entità (ad esempio cliente) dalla tabella eav_attribute per essere mostrato nella griglia dei clienti per admin

Ho un ruolo di ‘referente‘che ha accesso alla rete del cliente e la griglia solo su ordinazione. Ma, voglio limitare una referrer per vedere solo i clienti nella griglia che hanno la customer_referrer_id impostato come ID del referrer che ha effettuato l'accesso. Allo stesso modo per gli ordini, connesso in referrer sarà in grado di vedere solo gli ordini effettuati da clienti che avere customer_referrer_id = loggedin_referrer_id.

so già come ignorare un modulo e che devo ignorare principalmente Adminhtml/blocchi/clienti/griglia :: _ prepareCollection e Adminhtml/blocchi/Vendite/ordine/griglia :: _ prepareCollection

Sto usando Magento 1.4.1.1

Questo è il mio file di dichiarazione del modulo in 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> 

E il mio moduli Config.xml in local/myproject/Adminhtml/etc/è la seguente:

<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> 

E

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

Non ho provato nulla per questo caso, eccetto provare a utilizzare collection-> getSelect() -> joinLeft(). Ma non sono stato in grado di scoprire quali parametri richiede esattamente. Oltre a questo ho cercato di ottenere customer_group_id dalla tabella sales_flat_order nella griglia ordine, utilizzando joinAttribute ('order', 'main_entity.entity_id = order.entity_id', 'customer_group_id'), ma non ha funzionato neanche per me. –

+0

Vedo il messaggio "HURRAY" in /var/log/system.log –

risposta

5

Il mio primo tentativo sarebbe (per entrambi i file citato),

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

Dove $referrer_id è il valore si deve recuperare dal utente connesso. Dal momento in cui sembra essere utilizzando gli utenti di amministrazione - che sono entità separate da parte dei clienti - questo è un modo di recuperare;

$referrer_id = Mage::getSingleton('admin/session')->getUser()->getId(); 

Nota l'utente amministratore attualmente connesso non è evidente dal solo database, quindi non può essere un join di tabella.

Su un altro punto che vorrei usare il frontend per referrer invece di admin. Avrei i nuovi clienti ei loro ordini mostrati in conto cliente del referrer, simili alla loro pagina "I miei ordini". Ovviamente non so a quali altri requisiti devi partecipare.

seconda parte

Override Mage_Adminhtml_Block_Sales_Order_Grid::_prepareCollection() a guardare come questo:

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

Ciò è necessario perché la tabella originale sales/order_grid è piatta, non è una collezione di entità, e quindi non può essere unito con attributi. Quanto sopra funziona al contrario, iniziando con una collezione cliente e poi unendola al tavolo piatto dopo.

Un metodo forse più ordinato sarebbe quello di ignorare sales/order_grid_collection con la propria classe di raccolta che esegue tutto questo. Anche se segue meglio le convenzioni di codifica, è più lavoro e non più funzionale alla fine.

+0

Il precedente è stato pubblicato prima che la domanda fosse stata aggiornata con degli esempi. Vedo che hai già provato qualcosa di simile. – clockworkgeek

+0

ok, i clienti vengono filtrati correttamente ora. E, anche se sembra ovvio che le stesse due linee non funzionerebbero per filtrare la tabella degli ordini, ho già provato ad aggiungere quelle righe in Sales_Order_Grid :: _ prepareCollection. Come filtrare gli ordini effettuati dai clienti di cui customer_referrer_id = loggedin_referrer_id –

+0

Ho rimosso anche l'override di _prepareColumn, che è presente nella mia domanda originale, che serviva solo a convalidare i risultati corretti. –