2010-10-12 17 views
5

Mam rozszerzony formularz informacji o klientach Magento, aby przechowywać dodatkowy atrybut dla klienta. Nazwijmy go "customer_referrer_id".Jak uzyskać dane dla podmiotu (na przykład klienta) z tabeli eav_attribute, które będą wyświetlane w Gridzie Klienta dla administratora

Mam rolę "polecającego", który ma dostęp tylko do siatki klientów i zamówienia. Chcę jednak ograniczyć stronę odsyłającą, aby zobaczyć tylko tych klientów, którzy mają identyfikator customer_referrer_id ustawiony jako identyfikator strony odsyłającej, który się zalogował. Podobnie w przypadku zamówień, zalogowany polecający będzie mógł zobaczyć tylko te zamówienia wykonane przez klientów, którzy have customer_referrer_id = loggedin_referrer_id.

już wiem jak zastąpić moduł i że mam głównie na celu zastąpić Adminhtml/pustak/klient/GRID :: _ prepareCollection i Adminhtml/Zablokuj/sprzedaży/Zamówienie/GRID :: _ prepareCollection

Używam Magento 1.4.1.1

to jest mój plik deklaracja moduł w 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> 

i mój modułów config.xml w local/myproject/Adminhtml/etc/jest następujący:

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

I

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

Nie próbowałem niczego dla tej sprawy, z wyjątkiem próby użycia kolekcji-> getSelect() -> joinLeft(). Ale nie byłem w stanie dowiedzieć się, jakie parametry dokładnie to wymaga. Poza tym próbowałem uzyskać customer_group_id z tabeli sales_flat_order na siatkę zamówienia, przy użyciu joinAttribute ("order", "main_entity.entity_id = order.entity_id", "customer_group_id"), ale to też nie działa dla mnie. –

+0

Widzę komunikat "HURRAY" w /var/log/system.log –

Odpowiedz

5

Moja pierwsza próba będzie (dla obu plików wspomniano),

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

Gdzie $referrer_id jest wartością należy odzyskać od zalogowanego użytkownika. Ponieważ wydaje się, że używasz użytkowników adminów - które są oddzielnymi jednostkami od klientów - jest to jeden sposób pobierania;

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

Uwaga: aktualnie zalogowany administrator nie jest widoczny z samej bazy danych, więc nie może być przyłączeniem do stołu.

W innym punkcie użyłbym nakładki dla polecających zamiast administratora. Chciałbym, aby nowi klienci i ich zamówienia były widoczne na koncie klienta osoby polecającej, podobnie do ich własnej strony "Moje zamówienia". Oczywiście nie wiem, jakie inne wymagania musisz spełnić.

Druga część

Zastąp Mage_Adminhtml_Block_Sales_Order_Grid::_prepareCollection() wyglądać tak:

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

Jest to konieczne, ponieważ oryginalny stół sales/order_grid jest płaska, a nie zbiór podmiot, a więc nie mogą być łączone z atrybuty. Powyższe działa odwrotnie, zaczynając od odbioru klienta, a następnie dołączając do płaskiego stołu po.

Prawdopodobnie dokładniejszą metodą byłoby zastąpienie sales/order_grid_collection własną klasą kolekcji, która wykonuje to wszystko. Chociaż lepiej podąża za konwencjami kodowania, to jest to więcej pracy i koniec z końcem.

+0

Powyższy został opublikowany, zanim zobaczyłem, że pytanie zostało zaktualizowane przykładami. Widzę, że już próbowałeś czegoś podobnego. – clockworkgeek

+0

ok, klienci są teraz poprawnie filtrowani. I choć wydaje się oczywiste, że te same dwie linie nie będą działały dla filtrowania tabeli zamówień, próbowałem już dodać tę linię w Sales_Order_Grid :: _ prepareCollection. Jak filtrować zamówienia składane przez klientów, których customer_referrer_id = loggedin_referrer_id –

+0

Usunąłem także zastąpienie _prepareColumn, które jest tam w moim pierwotnym pytaniu, które służyło tylko do sprawdzenia poprawności wyników. –