У меня есть пользовательская таблица со ссылкой на продукт product_id
. Теперь я хотел бы показать информацию о продукте (sku, name) в своей сетке бэкэнда , но я не уверен, что лучше всего делать это?
Моя лучшая догадка SKU
заключается в следующем:
$collection->join(
'catalog/product',
'product_id=`catalog/product`.entity_id',
array('product_sku' => 'sku')
)
(код из _prepareCollection()
метода в моем классе блока сетки)
Но как насчет названия продукта? Его можно найти в catalog_product_entity_varchar. Насколько я понимаю, вы можете легко получить его, если ваша собственная модель ресурсов и коллекция основаны на том, Mage_Eav_Model_Entity_Collection_Abstract
что вы можете использовать такие методы, как joinAttribute
. Но моя модель основана на простой таблице и расширяется, Mage_Core_Model_Resource_Db_Collection_Abstract
и нет joinAttribute
доступных методов.
Так каков наилучший способ получить название продукта в этом случае?
Спасибо за ваше время и помощь :-)
Обновление: если быть более точным, я говорил о моей модели ресурсов и коллекции. Он соответствует простой плоской таблице с несколькими атрибутами, такими как
entity_id product_id created_at user_id
Мое намерение состоит в том, чтобы сделать сетку в бэкэнде, где я показываю некоторую статистику:
ProductSku Count(ProductSku) MAX(created_at)
Насколько я знаю, лучший способ сделать это - использовать класс блока сетки и метод _prepareCollection()
.
Мой метод выглядит так:
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();
}
Это хорошо работает для sku (который я называю product_sku в _prepareColums()
методе. Но что join
мне нужно вставить здесь, чтобы получить имя (и, например, производителя)?
Я делаю что-то не так, потому что я не могу использовать joinLeft()
?
источник
Mage_Core_Model_Resource_Db_Collection_Abstract
и я получаю ошибкуCall to undefined method Mycompany_Module_Model_Resource_Mymodel_Collection::joinLeft()
. Я думаю, это потому, что я не использую модель ресурсов EAV?$this->_map['fields']['sku'] = 'sku'
или подобное в этом случае. Это нужно только в том случае, если у вас есть несколько одинаковых имен полей и вам нужно выполнить перевод, чтобы избежать конфликтов. Это просто добавление накладных расходов для этого варианта использования. В другом сценарии использования вы можете использовать$this->_map['fields']['my_sku'] = 'sku'
то, что вы можете использовать с коллекцией, и_prepareColumns
:$this->addColumn('my_sku', array(…))
это поможет вам предотвратить конфликт при фильтрации или сортировке столбцов, если у вас есть поле,sku
используемое в разных таблицах БД, общих для коллекции$this->getSelect()->group('main_table.product_id');
решает проблему, но, может быть, код можно оптимизировать, чтобы дубликаты не создавались в первую очередь?Привет Celldweller Я надеюсь, у тебя все хорошо :-)
Возможно, вы ошиблись в своем объяснении о классе
Mage_Core_Model_Resource_Db_Collection_Abstract
, вы расширяете коллекцию ресурсов, а не модель, потому что вы не должны расширять модель с помощью класса коллекции, если хотите соблюдать структуру Magento. Я прав?Исходя из моей коррекции, я вижу разные подходы, в зависимости от того, как часто вы хотите получить атрибут названия продукта. В любом случае, я думаю, что сделать SQL-запрос через Magento Framework - это лучший и эффективный способ. Это быстрее, чем сделать
Mage::getModel('catalog/product')->load(1234)->getName()
для каждого загруженного элемента. Так что на самом деле это будет очень похоже на код, который вы используете дляsku
КОД НЕ ПРОВЕРЕН
Вы хотите эту информацию каждый раз, когда коллекция загружается
Вы можете в своем классе коллекции установить в
_beforeLoad
метод такой код:Вы хотите эту информацию ТОЛЬКО для сетки
В вашей
_prepareCollection
, вам нужно будет добавить метод в вашей коллекции с тем же кодом, как это было сделано выше, в_beforeLoad
затем вы могли подготовить коллекцию с помощью этого метода. Не используйте оба, я имею в виду, не используйте вместе один и тот же код_beforeLoad
иaddProductName
методы, используйте только один из них. Вот образец:В ваш
grid.php
:В ваш Collection.php:
источник
У меня была почти такая же проблема, но я не могу добавить комментарий, потому что у меня нет 50 репутации. Я потратил много времени, пытаясь выяснить, что не так (я использовал код Sylvain Rayé). Моя коллекция продуктов почему-то отфильтрована. Итак, я нашел причину.
Если вы используете некоторые инструменты импорта (magmi и т. Д.), Они часто не создают пустые атрибуты сразу. Поэтому использование
->where("product_attribute.attribute_id = ?", $productName->getId())
товаров, не имеющих этого атрибута, исчезнет из выбора.Правильный путь использует
joinLeft
вот так:Надеюсь, это кому-нибудь поможет.
источник
Отобразить пользовательский атрибут в сетке товара
Перезапишите этот блок Mage_Adminhtml_Block_Catalog_Product_Grid в своем расширении и скопируйте функции _prepareCollection и _prepareColumns в файл блока вашего расширения.
Добавьте приведенный ниже код для выбора атрибута в функции _prepareCollection сетки продуктов Mage_Adminhtml_Block_Catalog_Product_Grid перед строкой $ this-> setCollection ($ collection).
А затем ниже код для столбца в функции _prepareColumns сетки.
источник
new SomeModel()