Как получить данные для сущности (например, клиента) из таблицы eav_attribute, которая будет показана в таблице клиентов для администратора - PullRequest
5 голосов
/ 12 октября 2010

Я расширил форму информации о клиенте Magento, чтобы сохранить дополнительный атрибут для клиента.Давайте назовем его «customer_referrer_id».

У меня есть роль «реферер», которая имеет доступ только к сетке клиентов и сетке заказов.Но я хочу ограничить реферера, чтобы видеть только тех клиентов в сетке, у которых в качестве идентификатора реферера установлен идентификатор customer_referrer_id, который вошел в систему. Аналогично для заказов, реферер, вошедший в систему, сможет видеть только те заказы, которые сделаны клиентами, которыеhave customer_referrer_id = loggedin_referrer_id.

Я уже знаю, как переопределить модуль, и что мне нужно в основном переопределить Adminhtml / Block / Customer / Grid :: _ prepareCollection и Adminhtml / Block / Sales / Order / Grid :: _ prepareCollection

Я использую Magento 1.4.1.1

Это мой файл декларации модуля в 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>

И мои модули config.xml в локальном /Мой проект / Adminhtml / etc / выглядит следующим образом:

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

И

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

1 Ответ

5 голосов
/ 12 октября 2010

Моя первая попытка будет (для обоих упомянутых файлов),

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

Где $referrer_id - это значение, которое вы должны получить от зарегистрированного пользователя.Поскольку вы, похоже, используете пользователей-администраторов, которые являются отдельными объектами от клиентов, это один из способов получения;

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

Обратите внимание, что зарегистрированный в настоящее время пользователь-администратор не виден из одной базы данных, поэтому он не может бытьобъединение таблиц.

В другом месте я бы использовал внешний интерфейс для рефереров, а не администратора.Я хотел бы, чтобы новые клиенты и их заказы отображались в учетной записи реферера, как и на их странице "Мои заказы".Конечно, я не знаю, какие еще требования вы должны выполнить.

Вторая часть

Переопределите Mage_Adminhtml_Block_Sales_Order_Grid::_prepareCollection(), чтобы выглядеть так:

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

Это необходимо, поскольку исходная таблица sales/order_grid является плоской, а не набором сущностей и поэтому не может быть объединена с атрибутами.Вышеописанное работает в обратном порядке, начиная с коллекции клиентов, а затем присоединяясь к плоской таблице после.

Возможно, более точным методом будет переопределение sales/order_grid_collection с вашим собственным классом коллекции, который выполняет все это.Хотя он лучше следует соглашениям по кодированию, в конце концов, он больше работает и больше не работает.

...