Tengo una tabla personalizada con una referencia de producto product_id
. Ahora me gustaría mostrar información del producto (sku, nombre) en mi cuadrícula de back-end , pero no estoy seguro de cuál es la mejor práctica para hacer esto.
Mi mejor conjetura SKU
es la siguiente:
$collection->join(
'catalog/product',
'product_id=`catalog/product`.entity_id',
array('product_sku' => 'sku')
)
(código del _prepareCollection()
método en mi clase de bloque de cuadrícula)
¿Pero qué hay del nombre del producto? Se puede encontrar en catalog_product_entity_varchar. Tengo entendido que puede obtenerlo fácilmente si su propio modelo y colección de recursos se basa en Mage_Eav_Model_Entity_Collection_Abstract
porque puede usar métodos como joinAttribute
. Pero mi modelo se basa en una tabla simple y se extiende desde Mage_Core_Model_Resource_Db_Collection_Abstract
y no hay ningún joinAttribute
método disponible.
Entonces, ¿cuál es la mejor manera de obtener el nombre del producto en este caso?
Gracias por tu tiempo y ayuda :-)
Actualización: para ser más precisos, estaba hablando de mi modelo de recursos y mi colección. Coincide con una tabla plana simple con solo algunos atributos como
entity_id product_id created_at user_id
Mi intención es cuadricular en el backend donde muestro algunas estadísticas:
ProductSku Count(ProductSku) MAX(created_at)
Hasta donde sé, la mejor forma de hacerlo es a través de la clase de bloque de cuadrícula y el método a seguir es _prepareCollection()
.
Mi método se ve así:
protected function _prepareCollection()
{
// Get and set our collection for the grid
$collection = Mage::getResourceModel($this->_getCollectionClass());
$collection
->join(
'catalog/product',
'product_id=`catalog/product`.entity_id',
array('product_sku' => 'sku')
)
->addExpressionFieldToSelect('product_count', 'COUNT({{product_id}})', 'product_id')
->addExpressionFieldToSelect('newest', 'MAX({{created_at}})', array('created_at'=>'main_table.created_at'))
->getSelect()->group('product_id');
$this->setCollection($collection);
return parent::_prepareCollection();
}
Esto funciona bien para el sku (al que me refiero como product_sku en el _prepareColums()
método. Pero, ¿ join
qué necesito insertar aquí para obtener el nombre (y, por ejemplo, el fabricante)?
¿Estoy haciendo algo mal porque no puedo usar joinLeft()
?
fuente
Mage_Core_Model_Resource_Db_Collection_Abstract
y recibo un errorCall to undefined method Mycompany_Module_Model_Resource_Mymodel_Collection::joinLeft()
. ¿Supongo que esto se debe a que no uso un modelo de recursos EAV?$this->_map['fields']['sku'] = 'sku'
o similar en este caso. Solo lo necesita si tiene varios nombres de campos idénticos y necesita hacer una traducción para evitar conflictos. Simplemente agrega gastos generales para este caso de uso. En un caso de uso diferente, puede usarlo$this->_map['fields']['my_sku'] = 'sku'
, puede usarlo con la colección y_prepareColumns
:$this->addColumn('my_sku', array(…))
le ayudará a evitar conflictos para el filtrado o la clasificación de columnas si tiene un camposku
usado en diferentes tablas de base de datos comunes a la colección$this->getSelect()->group('main_table.product_id');
resuelve el problema, pero tal vez el código se puede optimizar, de modo que los duplicados no se crean en primer lugar.Hola Celldweller, espero que estés bien :-)
Tal vez se equivocó en su explicación sobre la clase
Mage_Core_Model_Resource_Db_Collection_Abstract
, extendió una colección de recursos, no el modelo, porque no debe extender un modelo con una clase de colección si desea respetar la estructura de Magento. Estoy en lo cierto?Según mi corrección, veo un tipo diferente de enfoque, según la frecuencia con la que desee obtener el atributo de nombre del producto. En cualquier caso, creo que hacer una consulta sql a través del Magento Framework es la mejor manera y eficiente. Es más rápido que hacer un
Mage::getModel('catalog/product')->load(1234)->getName()
para cada artículo cargado. De hecho, será muy similar al código que usa parasku
CÓDIGO NO PROBADO
Desea esa información cada vez que se carga una colección
Puede en su clase de colección establecer un
_beforeLoad
método como un código:Desea esa información SOLO para la cuadrícula
En su
_prepareCollection
, tendrá que agregar un método en su colección con el mismo código que se hizo anteriormente para_beforeLoad
poder preparar la colección utilizando este método. No use ambos, quiero decir, no use juntos el mismo código_beforeLoad
yaddProductName
métodos, use solo uno de ellos. Aquí hay una muestra:En tu
grid.php
:Into your Collection.php:
fuente
Tuve casi el mismo problema, pero no puedo agregar un comentario, porque no tengo 50 reputación. Pasé mucho tiempo tratando de descubrir qué está mal (usé el código de Sylvain Rayé). Mi colección de productos por alguna razón filtrada. Entonces encontré una razón.
Si utiliza algunas herramientas de importación (magmi, etc.), a menudo no crean atributos vacíos a la vez. Por lo tanto, el uso de
->where("product_attribute.attribute_id = ?", $productName->getId())
productos que no tengan este atributo desaparecerá de la selección.La forma correcta es usar
joinLeft
así:Espero que esto ayude a alguien.
fuente
Mostrar atributo personalizado en la cuadrícula del producto.
Sobrescriba este bloque Mage_Adminhtml_Block_Catalog_Product_Grid en su extensión y copie las funciones _prepareCollection y _prepareColumns en el archivo de bloque de su extensión.
Agregue el código a continuación para seleccionar el atributo en la función _prepareCollection de la cuadrícula del producto Mage_Adminhtml_Block_Catalog_Product_Grid antes de la línea $ this-> setCollection ($ collection).
Y luego debajo del código para la columna en la función _prepareColumns de la cuadrícula.
fuente
new SomeModel()