Получить блок атрибутов продукта на странице категории: Magento 1.9
Вот блок атрибутов отображения кода на странице PDP,
<?php
echo $this->getLayout()->createBlock('catalog/product_view_attributes')
->setTemplate('catalog/product/view/attributes.phtml')
->toHtml();
?>
Если я помещу тот же код на страницу PLP, я получу ошибку, как я могу отобразить свой блок атрибутов на странице PLP.
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 } ?>
Надеюсь, это поможет!!!
Класс блоков 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
.