Pergunta

Estou tentando adicionar uma coluna "Empresa" na Grade do Cliente.A empresa é um atributo do cliente que adicionei programaticamente e armazenei no banco de dados na tabela customer_entity_varchar.

Eu reescrevi a grade assim:

class MyCompany_MyModule_Block_Adminhtml_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid
{
protected function _prepareColumns()
{
    $this->addColumnAfter('company_name', array(
        'header' => 'Company Name',
        'type' => 'text',
        'index' => 'company_name',
    ), 'email');  

    parent::_prepareColumns();
}

protected function _prepareCollection()
{
    $collection = Mage::getResourceModel('customer/customer_collection')
        ->addNameToSelect()
        ->addAttributeToSelect('email')
        ->addAttributeToSelect('created_at')
        ->addAttributeToSelect('group_id')
        ->addAttributeToSelect('company_name')
        ->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);

    return parent::_prepareCollection();
}
}

Não há nada exibido, exceto quando eu classifico ou filtro com esta nova coluna da empresa.Por exemplo, se eu classificar com ID, nenhuma empresa será exibida, se eu classificar com Empresa, tudo estará perfeito.

Eu tentei substituir o "Return Parent :: _ Preparecollection ();" por "retornar $ this;" :tudo é exibido conforme o esperado, mas não há nenhum filtro ou classificação disponível.

Onde está o meu problema?

Obrigado.

Foi útil?

Solução

Aqui está a solução do meu problema:Eu estava estendendo a aula errada.Em vez de Mage_Adminhtml_Block_Customer_Grid, estendo agora Mage_Adminhtml_Block_Widget_Grid.O problema aqui é que preciso adicionar todas as funções em Mage_Adminhtml_Block_Customer_Grid na minha classe reescrita.

Observe que esta é a mesma classe que Mage_Adminhtml_Block_Customer_Grid, mas com apenas 2 modificações:

  • addAttributeToSelect na função _prepareCollection()

  • addColumn na função _prepareColumns()

Assim :

class Mycompany_Mymodule_Block_Adminhtml_Customer_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
public function __construct()
{
    parent::__construct();
    $this->setId('customerGrid');
    $this->setUseAjax(true);
    $this->setDefaultSort('entity_id');
    $this->setSaveParametersInSession(true);
}

protected function _prepareCollection()
{
    $collection = Mage::getResourceModel('customer/customer_collection')
        ->addNameToSelect()
        ->addAttributeToSelect('email')
        ->addAttributeToSelect('created_at')
        ->addAttributeToSelect('group_id')
        ->addAttributeToSelect('company_name')
        ->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);

    return parent::_prepareCollection();
}

protected function _prepareColumns()
{
    $this->addColumn('entity_id', array(
        'header'    => Mage::helper('customer')->__('ID'),
        'width'     => '50px',
        'index'     => 'entity_id',
        'type'  => 'number',
    ));
    /*$this->addColumn('firstname', array(
        'header'    => Mage::helper('customer')->__('First Name'),
        'index'     => 'firstname'
    ));
    $this->addColumn('lastname', array(
        'header'    => Mage::helper('customer')->__('Last Name'),
        'index'     => 'lastname'
    ));*/
    $this->addColumn('name', array(
        'header'    => Mage::helper('customer')->__('Name'),
        'index'     => 'name'
    ));
    $this->addColumn('email', array(
        'header'    => Mage::helper('customer')->__('Email'),
        'width'     => '150',
        'index'     => 'email'
    ));

    $this->addColumn('company_name', array(
        'header' => 'Company Name',
        'type' => 'text',
        'index' => 'company_name',
    ));

    $groups = Mage::getResourceModel('customer/group_collection')
        ->addFieldToFilter('customer_group_id', array('gt'=> 0))
        ->load()
        ->toOptionHash();

    $this->addColumn('group', array(
        'header'    =>  Mage::helper('customer')->__('Group'),
        'width'     =>  '100',
        'index'     =>  'group_id',
        'type'      =>  'options',
        'options'   =>  $groups,
    ));

    $this->addColumn('Telephone', array(
        'header'    => Mage::helper('customer')->__('Telephone'),
        'width'     => '100',
        'index'     => 'billing_telephone'
    ));

    $this->addColumn('billing_postcode', array(
        'header'    => Mage::helper('customer')->__('ZIP'),
        'width'     => '90',
        'index'     => 'billing_postcode',
    ));

    $this->addColumn('billing_country_id', array(
        'header'    => Mage::helper('customer')->__('Country'),
        'width'     => '100',
        'type'      => 'country',
        'index'     => 'billing_country_id',
    ));

    $this->addColumn('billing_region', array(
        'header'    => Mage::helper('customer')->__('State/Province'),
        'width'     => '100',
        'index'     => 'billing_region',
    ));

    $this->addColumn('customer_since', array(
        'header'    => Mage::helper('customer')->__('Customer Since'),
        'type'      => 'datetime',
        'align'     => 'center',
        'index'     => 'created_at',
        'gmtoffset' => true
    ));

    if (!Mage::app()->isSingleStoreMode()) {
        $this->addColumn('website_id', array(
            'header'    => Mage::helper('customer')->__('Website'),
            'align'     => 'center',
            'width'     => '80px',
            'type'      => 'options',
            'options'   => Mage::getSingleton('adminhtml/system_store')->getWebsiteOptionHash(true),
            'index'     => 'website_id',
        ));
    }

    $this->addColumn('action',
        array(
            'header'    =>  Mage::helper('customer')->__('Action'),
            'width'     => '100',
            'type'      => 'action',
            'getter'    => 'getId',
            'actions'   => array(
                array(
                    'caption'   => Mage::helper('customer')->__('Edit'),
                    'url'       => array('base'=> '*/*/edit'),
                    'field'     => 'id'
                )
            ),
            'filter'    => false,
            'sortable'  => false,
            'index'     => 'stores',
            'is_system' => true,
    ));

    $this->addExportType('*/*/exportCsv', Mage::helper('customer')->__('CSV'));
    $this->addExportType('*/*/exportXml', Mage::helper('customer')->__('Excel XML'));
    return parent::_prepareColumns();
}

protected function _prepareMassaction()
{
    $this->setMassactionIdField('entity_id');
    $this->getMassactionBlock()->setFormFieldName('customer');

    $this->getMassactionBlock()->addItem('delete', array(
         'label'    => Mage::helper('customer')->__('Delete'),
         'url'      => $this->getUrl('*/*/massDelete'),
         'confirm'  => Mage::helper('customer')->__('Are you sure?')
    ));

    $this->getMassactionBlock()->addItem('newsletter_subscribe', array(
         'label'    => Mage::helper('customer')->__('Subscribe to Newsletter'),
         'url'      => $this->getUrl('*/*/massSubscribe')
    ));

    $this->getMassactionBlock()->addItem('newsletter_unsubscribe', array(
         'label'    => Mage::helper('customer')->__('Unsubscribe from Newsletter'),
         'url'      => $this->getUrl('*/*/massUnsubscribe')
    ));

    $groups = $this->helper('customer')->getGroups()->toOptionArray();

    array_unshift($groups, array('label'=> '', 'value'=> ''));
    $this->getMassactionBlock()->addItem('assign_group', array(
         'label'        => Mage::helper('customer')->__('Assign a Customer Group'),
         'url'          => $this->getUrl('*/*/massAssignGroup'),
         'additional'   => array(
            'visibility'    => array(
                 'name'     => 'group',
                 'type'     => 'select',
                 'class'    => 'required-entry',
                 'label'    => Mage::helper('customer')->__('Group'),
                 'values'   => $groups
             )
        )
    ));

    return $this;
}

public function getGridUrl()
{
    return $this->getUrl('*/*/grid', array('_current'=> true));
}

public function getRowUrl($row)
{
    return $this->getUrl('*/*/edit', array('id'=>$row->getId()));
}
}

Outras dicas

deve nome do campo para company de company_name E

é um campo de endereço e você precisa adicionar a função ->joinAttribute()

 class MyCompany_MyModule_Block_Adminhtml_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid
 {
    protected function _prepareColumns()
    {

        $this->addColumnAfter('company', array(
            ...  
        parent::_prepareColumns();
        //see http://stackoverflow.com/questions/8941460/magento-grid-column-position    

    }

    protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel('customer/customer_collection')
            ...
            ->addAttributeToSelect('company')
            ..

        $this->setCollection($collection);

        return parent::_prepareCollection();
    }
  }

A melhor maneira de conseguir isso (sem reescrever) seria usar um observador

Dê uma olhada Adicionando uma coluna à grade de clientes no administrador do Magento.Caminho alternativo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top