2010-10-16 12 views
8

Quiero pre-filtrar * datos en la cuadrícula de factura visible en el panel de administración de Magento.Cómo seleccionar campos específicos con alias usando joinTable o joinField en Magento

Here es una pregunta que hice antes, y esta está relacionada con la solución presentada para eso, por lo tanto, podría ser una buena explicación.

Por lo tanto, estoy modificando el método Mage_Adminhtml_Block_Sales_Invoice_Grid :: _ prepareCollection para que primero obtenga el cliente referido por el administrador registrado. Luego obtendrá pedidos de estos clientes, idealmente solo los ID de la orden. Luego, una esta colección al ventas/order_invoice_grid, para obtener las facturas que se enumerarán para este administrador.

Sobre la base de la última respuesta y el uso de these documentos, después de 3 maneras que he intentado unirse a esta información: (Código de ejemplo 1)

$collection = Mage::getResourceModel('customer/customer_collection');   
$collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('*')); 
$collection->joinTable('sales/invoice_grid', 'order_id=main_table.entity_id', array('*')); 

Cuando yo lo anterior, veo el siguiente error:

A joint field with this alias (0) is already declared. 

#0 /var/www/magento/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(706): Mage::exception('Mage_Eav', 'A joint field w...') 
#1 /var/www/magento/app/code/local/Myproject/Adminhtml/Block/Sales/Invoice/Grid.php(41): Mage_Eav_Model_Entity_Collection_Abstract->joinTable('sales/invoice_g...', 'order_id=main_t...', Array) 
#2 /var/www/magento/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(576): Myproject_Adminhtml_Block_Sales_Invoice_Grid->_prepareCollection() 
#3 /var/www/magento/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(582): Mage_Adminhtml_Block_Widget_Grid->_prepareGrid() 

Si elimino la segunda llamada a joinTable, el código anterior funciona, pero no es lo que quiero.

El otro método es Probé con este código:

$collection = Mage::getResourceModel('customer/customer_collection');   
$collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('entity_id as order_entity_id')); 
$collection->joinTable('sales/invoice_grid', 'order_id=main_table.entity_id', array('*')); 

Aquí aparece el error en la segunda línea, donde en realidad estoy tratando de poner un alias para el order.entity_id campo para que no entre en conflicto con la factura tablas entity_id. Sin embargo, eso produce un error como:

Item (Mage_Customer_Model_Customer) with the same id "1" already exist

solo me falta ordenar el de ID para que puedo conseguir las facturas relacionadas, lo que sugiere que también puedo utilizar la función joinField, que trataba de la siguiente manera:

$collection = Mage::getResourceModel('customer/customer_collection'); 
$collection->joinField('order_entity_id', 'sales/order_grid', 'entity_id', 'customer_id=entity_id' , null, 'left'); 

pero me da el siguiente error:

artículo (Mage_Customer_Model_Customer) con el mismo id "1" ya existe

Busco a una solución que une personalizada er-> facturas.


Por prefiltro quiero decir que los datos que figuran en la red se filtra incluso antes de que algo se presenta en la red.


Ok, ahora mi código es el siguiente:

$collection = 
Mage::getResourceModel('customer/customer_collection'); 
$collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('entity_id' => 'order_entity_id')); 

Y el error que consigo es:

SELECT `e`.*, `sales_flat_order_grid`.`order_entity_id` AS `entity_id` FROM `customer_entity` AS `e` 
INNER JOIN `sales_flat_order_grid` ON (sales_flat_order_grid.customer_id=e.entity_id) WHERE (e.entity_type_id = '1') ORDER BY `e`.`created_at` desc, `e`.`created_at` desc LIMIT 20 

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sales_flat_order_grid.order_entity_id' in 'field list' 

Respuesta

8

Aquí está el total de mi secuencia de comandos de prueba. Para utilizarlo, póngalo en un archivo en la raíz de Magento y escriba su URL directamente en su navegador, no es manejado por los controladores de Magento. Esta es una buena manera de experimentar, ya que no está tan influenciada por otros módulos, diseños de página, etc.

<pre><?php 

require 'app/Mage.php'; 
Mage::app(); 

$collection = Mage::getResourceModel('customer/customer_collection'); 
$collection->getSelect()->reset('columns');   
$collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('order_entity_id' => 'entity_id')); 
$collection->joinTable('sales/invoice_grid', 'order_id=order_entity_id', array('*')); 

foreach ($collection as $invoice) 
    print_r($invoice->debug()); 

?></pre> 

Al igual que con su pregunta anterior elijo para restablecer las columnas iniciales porque no creo en dar la base de datos más trabajo de lo necesario. Sin embargo, no es esencial, la prueba aún tiene éxito sin ella.

Si esto no funciona en su instalación, entonces debemos considerar qué influencia externa podría tener.

1

Se le da este error "Artículo (Mage_Customer_Model_Customer) con el mismo ID "1" ya existe "porque un cliente puede tener múltiples pedidos y así podría tener dos o más Entradas con el mismo ID de cliente: está creando una colección de clientes y debe tener entradas únicas en la colección. Tiene que comenzar con las facturas y unirlas con los clientes.

+0

he intentado con su sugerencia, de la siguiente manera: "$ = colección Mago :: getResourceModel ($ this -> _ getCollectionClass()); $ colección-> joinTable ('ventas/fin', 'entity_id = order_id', array ('*'));" Y esta vez el error es: Fatal error: Llamada a Mage_Sales_Model_Mysql4_Order_Invoice_Grid_Collection método no definido :: joinTable () en /var/www/magento/app/code/local/Myproject/Adminhtml/Block/Sales/Invoice/Grid.php en la línea 41 –

+0

Es porque Mage_Sales_Model_Mysql4_Order_Grid_Collection hereda de Mage_Core_Model_Mysql4_Collection_Abstract, no usa el modelo eav; usted tiene para usar join ($ table, $ cond, $ cols = '*'). La colección de clientes hereda de Mage_Eav_Model_Entity_Collection_Abstract y utiliza joinTable –

2

El error "Un campo de unión con este alias (0) ya está declarado." se produce porque utiliza claves de matriz como alias. Como tiene dos llamadas joinTable(), cada una con una matriz, está intentando utilizar el índice basado en cero de ambas y, evidentemente, tiene un conflicto.
Así que en lugar de

array('entity_id as order_entity_id') 

tratar

array('entity_id' => 'order_entity_id') 

para evitar el conflicto.

+0

He agregado una sección en mi pregunta debajo de la segunda partición horizontal. Entiendo el error en sí, pero desafortunadamente, no conozco bien el ORM de Magento y no puedo encontrar una solución. –

+0

Vaya, tengo la clave y el valor al revés.Debería haber dicho array '('order_entity_id' => 'ENTITY_ID')' – clockworkgeek

+0

que ya trató de esa manera, y el error es: "Artículo (Mage_Customer_Model_Customer) con el mismo id "1" ya existen # 0/var/www/magento/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php (236): Varien_Data_Collection-> addItem (Object (Mage_Customer_Model_Customer)) # 1/var/www/magento/app /code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(963): Mage_Eav_Model_Entity_Collection_Abstract-> addItem (Object (Mage_Customer_Model_Customer)) " –

2

Finalmente lo logré yendo de factura-> pedido-> cliente como 'Anda B' sugerido. Solo estoy pegando mi solución aquí como referencia, pero usaré la solución this de clockworkgeek, ya que parece mucho más limpia. Y mi solución todavía tiene que ser hecho más limpio por conseguir el 'id' del eav_attribute (id_agente) a partir de la base de datos en tiempo de ejecución, en lugar de codificar duro, como pegado aquí:

class Myproject_Adminhtml_Block_Sales_Invoice_Grid extends Mage_Adminhtml_Block_Sales_Invoice_Grid 
{ 
    const AGENT_ID_ATTRIBUTE_ID = 118; 

    protected function _prepareCollection() 
    { 

$collection = Mage::getResourceModel($this->_getCollectionClass()); 

     $collection->join('order_grid', 'order_id = order_grid.entity_id', array ('order_entity_id' => 'order_grid.entity_id')); 
     $collection->getSelect()->join('customer_entity', 'customer_id = customer_entity.entity_id', array('customer_entity_id' => 'entity_id', 'email')); 
     $collection->getSelect()->joinLeft('customer_entity_int', 'customer_entity_int.entity_id = customer_entity.entity_id AND attribute_id = ' . Myproject_Adminhtml_Block_Sales_Invoice_Grid::AGENT_ID_ATTRIBUTE_ID, 
             array('attribute_entity_id' => 'customer_entity_int.entity_id', 'attribute_id' , 'value')); 

//Apply Desired Data Filters here 

$this->setCollection($collection); 

return $collection; 
1

La forma más sencilla de lo supe por el foro de Magento,

En el

protected function _prepareCollection() 
{ 
    $collection = Mage::getResourceModel('customer/customer_collection') 

podemos utilizar consultas personalizadas como

$collection->getSelect()->columns(array('filename' => new Zend_Db_Expr ("(SELECT filename FROM cat WHERE customer_id =e.entity_id)"))); 

y funciona

$this->setCollection($collection); 
var_dump($collection); 
Cuestiones relacionadas