Как отобразить шаблон только для определенных страниц продукта в Magento?

У меня есть конфигуратор деталей, который я хочу видеть только для определенного продукта SKU. В моем каталоге /product/view.html файле я включил следующий код:

<!--?php 
if ($_product--->getSku() == '10007-') {
 echo $this->getLayout()->createBlock('cms/block')->setBlockId('partfinder_selector')->toHtml();
}
?>

Затем в файле xml для конфигуратора:

<catalog_product_view>
<reference name="content">
 </reference> 
</catalog_product_view>

Проблема заключается в том, что с этой настройкой конфигуратор появляется на всех страницах продукта. У меня что-то не так в моем коде, или есть лучший метод для того, что я пытаюсь выполнить. Любая помощь будет оценена по достоинству.

3 ответа

Обратите внимание: это решение не требует никакого "конфигуратора xml", поэтому вы можете оставить это. Вы сможете использовать оператор if, как в вашем примере, для выбора только того, что вы хотите.

Создание каталогов:

app/code/local/Partfinder/Selector/Block
app/code/local/Partfinder/Selector/etc

Для вашего приложения /etc/modules как Partfinder_Selector.xml:

<config>
 <modules>
 <partfinder_selector>
 <active>true</active>
 <codepool>local</codepool>
 </partfinder_selector>
 </modules>
</config>

В вашем приложении/коде/локальном /Partfinder/Selector/etc в файле config.xml:

<!--?xml version="1.0"?-->
<config>
 <modules>
 <partfinder_selector>
 <version>0.1.0</version>
 </partfinder_selector>
 </modules>
 <global>
 <blocks>
 <partfinderselector>
 <class>Partfinder_Selector_Block</class>
 </partfinderselector>
 </blocks>
 </global>
</config>

В вашем приложении/коде/локальном /Partfinder/Selector/Block, как Menu.php:

В вашем приложении /design/pkgname/themename/template/Partfinder сохраните файл с именем selector.phtml, содержащий ваш блок-код.

В каталоге /product/view.phtml:

<!--?php if ($_product--->getSku() == "10007-"): ?> 
 <!--?php echo $this--->getLayout()->createBlock('partfinderselector/menu')->setTemplate('partfinder/selector.phtml')->toHtml(); ?>
<!--?php endif; ?-->


Для этого вам необходимо выполнить следующие действия:

1). В /Namespace/Module/etc/config.xml вы должны написать следующее:

<config>
 <modules>
 <namespace_module>
 <version>0.1.0</version>
 </namespace_module>
 </modules>
 <global>
 <helpers>
 <module>
 <class>>Namespace_Module_Helper</class>
 </module>
 <catalog>
 <rewrite>
 <product_view>Namespace_Module_Helper_View</product_view>
 </rewrite>
 </catalog>
 </helpers>
 </global>
</config>

2) - зарегистрировать модуль в списке модулей magento в приложении /etc/modules/Namespace_Module.xml

<config>
 <modules>
 <namespace_module>
 <active>true</active>
 <codepool>local</codepool>
 <depends>
 </depends></namespace_module>
 </modules>
 </config>

3). Вы должны создать свой файл в /Namespace/Module/Helper/view.php.

Ниже приведен код

class KNamespace_Module _Helper_View extends Mage_Catalog_Helper_Product_View
{

 public function initProductLayout($product, $controller)
 {
 $design = Mage::getSingleton('catalog/design');
 $settings = $design->getDesignSettings($product);

 if ($settings->getCustomDesign()) {
 $design->applyCustomDesign($settings->getCustomDesign());
 }

 $update = $controller->getLayout()->getUpdate();
 $update->addHandle('default');
 $controller->addActionLayoutHandles(); 
 $update->addHandle('PRODUCT_TYPE_' . $product->getTypeId());
 $update->addHandle('PRODUCT_' . $product->getId());
 //update code 

 if(preg_match('/10007-/',$product->getSku())){$update->addHandle('PRODUCT_NEWLAYOUT');}

 $controller->loadLayoutUpdates();
 // Apply custom layout update once layout is loaded
 $layoutUpdates = $settings->getLayoutUpdates();
 if ($layoutUpdates) {
 if (is_array($layoutUpdates)) {
 foreach($layoutUpdates as $layoutUpdate) {
 $update->addUpdate($layoutUpdate);
 }
 }
 }

 $controller->generateLayoutXml()->generateLayoutBlocks();

 // Apply custom layout (page) template once the blocks are generated
 if ($settings->getPageLayout()) {
 $controller->getLayout()->helper('page/layout')->applyTemplate($settings->getPageLayout());
 }

 $currentCategory = Mage::registry('current_category');
 $root = $controller->getLayout()->getBlock('root');
 if ($root) {
 $controllerClass = $controller->getFullActionName();
 if ($controllerClass != 'catalog-product-view') {
 $root->addBodyClass('catalog-product-view');
 }
 $root->addBodyClass('product-' . $product->getUrlKey());
 if ($currentCategory instanceof Mage_Catalog_Model_Category) {
 $root->addBodyClass('categorypath-' . $currentCategory->getUrlPath())
 ->addBodyClass('category-' . $currentCategory->getUrlKey());
 }
 }

 return $this;
 }
}
  1. добавьте код в catalog.xml: -

    partfinder/selector.phtml

Надеюсь, это сработает для вас. :) Удачи. Джитендра Падмашали, Кришинк


Во-первых, когда вы используете echo $this->getLayout()->createBlock('cms/block')--setBlockId('partfinder_selector')->toHtml() Magento пытается вывести статический блок с помощью id partfinder_selector.

Во-вторых, относится к блоку контента, который является "core/text_list", который автоматически выводит своих дочерних элементов, поэтому ваш блок будет автоматически выводиться блоком содержимого.

Решение будет в вашем XML файле использовать

<reference name="product.info"> instead of "content"</reference>

и используйте $this->getChildHtml('partfinder_selector') в каталоге /product/view.html

licensed under cc by-sa 3.0 with attribution.