Pregunta

He añadido campo "Empresa" en la red de cliente de administración, pero el rostro problema que es la clasificación no está trabajando.

Tengo anular Mage_Adminhtml_Block_Customer_Grid Clase y añadió a continuación código:

 protected function _prepareCollection()
    {
        parent::_prepareCollection();

        $collection = Mage::getResourceModel('customer/customer_collection')
            ->addNameToSelect()
            ->addAttributeToSelect('email')
            ->addAttributeToSelect('created_at')
            ->addAttributeToSelect('group_id')
            ->addAttributeToSelect('company')
            ->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_company', 'customer_address/company', 'default_billing', null, 'left')
            ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left'); 

        $this->setCollection($collection); 

        return $this;
    }
    protected function _prepareColumns()
    {


        $this->addColumn('company', array(
            'header'    =>  Mage::helper('customer')->__('Company'),
            'width'     =>  '150',
            'index'     =>  'billing_company',

        )); 
        $this->addColumnsOrder('billing_company', 'email');
        return parent::_prepareColumns();
    }

Puede alguien tiene solución para problema anterior?

¿Fue útil?

Solución

El problema es que Magento hace un montón de trabajo que se requiere en la colección en Mage_Adminhtml_Block_Widget_Grid::_prepareCollection(), es decir, cuando se llama parent::_prepareCollection() al comienzo de su método sobrescrito.
Lo que pasa es

  1. Se llama a la _prepareCollection() parental original
  2. La colección original se inicializa
    en Mage_Adminhtml_Block_Customer_Grid::_prepareCollection()
  3. La colección se asigna a la red
    $this->setCollection()
  4. El _prepareCollection() rejilla de matriz abstracta se llama.
  5. Durante esta llamada a un método, se aplica la orden, que en este punto en el tiempo es el orden predeterminado ya que la colección no tiene el atributo company o billing_company en su lista de selección todavía.
    $this->_setCollectionOrder($this->_columns[$columnId]);
  6. Después de que el método de los padres _prepareCollection() terminado, se instancia una nueva colección al cliente, y añadir todos los atributos que desea visualizar, y asignarlo a la red.
  7. La orden no se vuelve a aplicar, ya que no se llama a las rejillas abstractos _prepareCollection de nuevo.

Lo que no se puede, ya que llamar parent::_prepareCollection() sería una vez más anular su colección con la original.

Una posible solución sería duplicar la lógica del método _prepareCollection() de la red abstracta, pero copiando el código es siempre malo para el mantenimiento.

Una mejor solución es buscar un método gancho adecuado, que le brinda la oportunidad de añadir su columna nueva compañía a la existente colección antes de el orden de clasificación y filtrado se aplica.

En cuanto a las primeras líneas de Mage_Adminhtml_Block_Widget_Grid::_prepareCollection() podemos ver justo lo que necesitamos:

protected function _prepareCollection()
{
    if ($this->getCollection()) {

        $this->_preparePage();

Así que, en lugar de sobrescribir el protected function _prepareCollection() en su bloque, prueba este lugar:

protected function _preparePage()
{
    $this->getCollection()
        ->joinAttribute('billing_company', 'customer_address/company', 'default_billing', null, 'left');
    return parent::_preparePage();
}

Es todo una cuestión de tiempo y la inserción de la lógica personalizada en el momento adecuado durante el flujo del proceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top