Получить блок атрибутов продукта на странице категории: Magento 1.9


Вот блок атрибутов отображения кода на странице PDP,

    <?php
       echo $this->getLayout()->createBlock('catalog/product_view_attributes')
       ->setTemplate('catalog/product/view/attributes.phtml')
       ->toHtml(); 
   ?>

Если я помещу тот же код на страницу PLP, я получу ошибку, как я могу отобразить свой блок атрибутов на странице PLP.

Author: Sumit, 2019-09-21

2 answers

Вы можете использовать приведенный ниже код в файле list.phtml, чтобы получить данные атрибутов продукта.

<?php
    $attributes = $_product->getAttributes();
    foreach ($attributes as $attribute) {
        if ($attribute->getIsVisibleOnFront() && !in_array($attribute->getAttributeCode(), $excludeAttr)) {
            $value = $attribute->getFrontend()->getValue($_product);

            if (!$_product->hasData($attribute->getAttributeCode())) {
                $value = Mage::helper('catalog')->__('N/A');
            } elseif ((string)$value == '') {
                $value = Mage::helper('catalog')->__('No');
            } elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) {
                $value = Mage::app()->getStore()->convertPrice($value, true);
            }

            if (is_string($value) && strlen($value)) {
                $data[$attribute->getAttributeCode()] = array(
                    'label' => $attribute->getStoreLabel(),
                    'value' => $value,
                    'code'  => $attribute->getAttributeCode()
                );
            }
        }
    }
?>
<?php if ($data) { ?>
    <?php 
        $_helper = $this->helper('catalog/output');
        $_category = null;
    ?>
    <table class="data-table" id="product-attribute-specs-table">
        <col width="25%" />
        <col />
        <tbody>
            <?php foreach ($data as $_data): ?>
                    <?php if($_helper->productAttribute($_product, $_data['value'], $_data['code'])=="No" || $_helper->productAttribute($_product, $_data['value'], $_data['code']) =="Ei" | $_helper->productAttribute($_product, $_data['value'], $_data['code'])=="???"): ?>
                    <?php else: ?> 
                        <?php if(strtolower($this->htmlEscape($this->__($_data['label']))) == 'manufacturer'): ?>
                            <?php $_category = Mage::getModel('catalog/category')->loadByAttribute('name', $_helper->productAttribute($_product, $_data['value'], $_data['code'])); ?>
                        <?php endif; ?>
                        <tr>
                            <th class="label"><?php echo $this->htmlEscape($this->__($_data['label'])) ?></th>
                            <td class="data">
                                <?php if($_category && $_category->getUrl() && strtolower($this->htmlEscape($this->__($_data['label']))) == 'manufacturer'): ?>
                                    <a href="<?php echo $_category->getUrl(); ?>" title="<?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']); ?>">
                                <?php endif; ?>
                                <?php echo $_helper->productAttribute($_product, $_data['value'], $_data['code']) ?>
                                <?php if($_category && $_category->getUrl() && strtolower($this->htmlEscape($this->__($_data['label']))) == 'manufacturer'): ?>
                                    </a>
                                <?php endif; ?>
                            </td>
                        </tr>
                <?php endif; ?> 
            <?php endforeach; ?>
        </tbody>
    </table>
<?php } ?>

Надеюсь, это поможет!!!

 2
Author: Sumit, 2019-09-23 06:38:40

Класс блоков Mage_Catalog_Block_Product_View_Attributes ожидает получить объект продукта из реестра:

    function getProduct()
    {
        if (!$this->_product) {
            $this->_product = Mage::registry('product');
        }
        return $this->_product;
    }

PLP не регистрирует продукт (так как их много), поэтому в блоке атрибутов нет данных для работы.

Я попытался установить продукт в createBlock call, но, похоже, Mage_Catalog_Block_Product_View_Attributes написано не так, чтобы это было возможно. Это код, который не работает для меня.

<?php
        echo $this->getLayout()->createBlock('catalog/product_view_attributes')
       ->setProduct($_product->load($_product->getId()))
       ->setTemplate('catalog/product/view/attributes.phtml')
       ->toHtml(); 
?>

Обратите внимание, что $_product здесь происходит из основного цикла в catalog/product/list.phtml. С тех пор как это является членом коллекции, а не непосредственно загруженным объектом продукта, мне пришлось загрузить его явно. Это сопровождается значительным снижением производительности.

Возможно, вы сможете настроить свой Magento так, чтобы это работало, но я не думаю, что это лучший подход. Было бы лучше загрузить атрибуты, которые вы хотите видеть, с коллекцией продуктов PLP, т. Е. через их настройку "Используется в списке продуктов". Затем адаптируйте каталог/продукт/представление/атрибуты.содержимое шаблона phtml для используйте в своем шаблоне PLP, используя доступный объект $_product.

 2
Author: jiheison, 2019-09-23 14:24:24