Итератор коллекции Magento — не удается получить дополнительный атрибут

#magento #magento-1.8

#magento #magento-1.8

Вопрос:

Я не могу получить дополнительный атрибут ‘name’ из коллекции продуктов, когда я использую итератор ресурсов.

Моя коллекция продуктов:

         $productCollection = Mage::getModel('catalog/product')->getCollection();
        $productCollection->addAttributeToSelect('name')
        ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id=entity_id', null, 'left')
        ->addAttributeToFilter('category_id', array('in' => $subCategories))->addAttributeToFilter('visibility', '4')
        ->getSelect()->group('e.entity_id');
  

Итератор:

 Mage::getSingleton('core/resource_iterator')->walk($productCollection->getSelect(), array(array($this, 'generateXml')));
  

Функция generateXml:

 public function generateXml($args){
    var_dump($args['row']);
...

array(11) {
  ["entity_id"]=>
  string(5) "49335"
  ["entity_type_id"]=>
  string(1) "4"
  ["attribute_set_id"]=>
  string(2) "18"
  ["type_id"]=>
  string(6) "simple"
  ["sku"]=>
  NULL
  ["has_options"]=>
  string(1) "0"
  ["required_options"]=>
  string(1) "0"
  ["created_at"]=>
  string(19) "2014-05-28 19:18:49"
  ["updated_at"]=>
  string(19) "2014-05-28 19:20:21"
  ["category_id"]=>
  string(3) "236"
  ["visibility"]=>
  string(1) "4"
}
  

Заранее спасибо.

Ответ №1:

Вместо:

 (...)
$productCollection->addAttributeToSelect('name')
(...)
  

должно быть:

 (...)
$productCollection->addAttributeToSelect(array('name'),'inner')
(...)
  

Комментарии:

1. Наконец-то я нашел это! Все примеры, которые я нашел до сих пор, предполагают addAttributeToSelect(‘name’) или addAttributeToSelect(array(‘name’)), которые вообще не работали. Добавление типов соединения решило это для меня. Вероятно, следует быть осторожным и не добавлять слишком много соединений таким образом, иначе производительность может серьезно пострадать 🙂

2. Краткое примечание: вторым параметром является $jointype, и допустимые значения кажутся ложными, «внутренними» или «левыми».

Ответ №2:

Я не совсем уверен, чего вы хотите достичь. Однако приведенное ниже может немного помочь вам. Несмотря на то, что я не слишком знаком с resource_interator, это может помочь

 <?php
// $this-> may not work depending upon block type. However this helper is what allows you to grab other necessary values     
$_helper = $this->helper('catalog/output');  
$products = Mage::getModel('catalog/product')
    ->getCollection()
    // ->addCategoryFilter($category) If you have the category object you can filter by this
    // I'm just using the below example to grab these three attribute values. 
    ->addAttributeToSelect(array('name', 'product_url', 'small_image'))
    ->load();
?>

            <!-- Display Each product's detailed info  Granted this is not in an xml format.  Which you can alter to your needs,  but this should be a good base point I don't believe the resource  -->
        <?php foreach ($products as $product): ?>
            <li>
            <?php // Product Image ?>
            <a href="<?php echo $product->getProductUrl() ?>" title="<?php echo $this->stripTags($this->getImageLabel($product, 'small_image'), null, true) ?>" class="product-image"><img src="<?php echo $this->helper('catalog/image')->init($product, 'small_image')->resize(135); ?>" width="135" height="135" alt="<?php echo $this->stripTags($this->getImageLabel($product, 'small_image'), null, true) ?>" /></a>
            <?php // Product description ?>
            <?php $_productNameStripped = $this->stripTags($product->getName(), null, true); ?>

            <!-- Below is where the helper is needed for product name.  -->
            <h3 class="product-name"><a href="<?php echo $product->getProductUrl() ?>" title="<?php echo $productNameStripped; ?>"><?php echo $_helper->productAttribute($product, $product->getName() , 'name'); ?></a></h3>
            </li>
        <?php endforeach ; ?>
  

Комментарии:

1. Большое спасибо за помощь. Я бы не стал использовать это решение, потому что в этом случае я работаю с большой коллекцией.