2015-01-18 3 views
0

Я пытался показать информацию о продукте на главной странице. После долгих часов поиска на Google и StackOverflow, я пришел с этим решением:Magento: как загрузить информацию о продукте на домашнюю страницу

Mage::register('product',Mage::getModel('catalog/product')->load('17')); 
$block = Mage::app()->getLayout() 
    ->createBlock('catalog/product_view') 
    ->setData('area','frontend') 
    ->setTemplate('catalog/product/view.phtml'); 
echo $block->toHtml(); 

Это делает визуализацию блока каталога/product_view, но нет своих детей, я хотел бы понять, как сделать ребенок тоже?

Примечание: моя домашняя страница как макет «myviewer.phtml», а код выше находится в «myviewer.phtml».

ответ

0

Magento создает свою иерархию блоков на основе конфигурации XML-макета. Например, блок catalog/product_view используется в файле макета catalog.xml (обычно находится в app/design/frontend/base/default/layout/catalog.xml). Этот файл также определяет все дочерние блоки блока catalog/product_view.

Magento решает, какие инструкции макета выполнять в зависимости от активных макетов. Например, файл catalog.xml ссылается на дескриптор макета catalog_product_view, который соответствует модулю каталога, контроллеру продукта, действию просмотра. Всякий раз, когда вызывается это конкретное действие контроллера, этот макет применяется.

В вашем случае домашняя страница, вероятно, является страницей CMS, которая не применяет дескриптор макета catalog_product_view (он обычно применяет дескриптор cms_page). Таким образом, иерархия блоков не определена правильно для использования блока catalog/product_view.

Существует много способов решения этой проблемы, но сначала вам нужно подумать о том, что именно вы пытаетесь сделать. Если вы попытаетесь использовать блок catalog/product_view, ваша домашняя страница будет выглядеть почти точно как обычная страница продукта, которая может быть или не быть тем, что вы хотите. Один из способов достижения этого - использовать тег <update/>, который принимает другой дескриптор компоновки и объединяет его с текущим дескриптором макета.

Я рекомендую прочитать еще немного в системе XML макета Magento. У Алана Шторма есть некоторые большие ресурсы по теме, такие как this blog post (предупреждение, это немного устарело) и his book on Magento's layout system.

2

В настоящее время вы вручную создаете блок просмотра продукта и не используете стандартный макет xml, так что вы не получаете ни одного из дочерних блоков по умолчанию, которые будут загружены на странице продукта с помощью дескриптора макета страницы продукта;

catalog_product_view 

Просмотр этого макета дескриптора в файле catalog.xml покажет вам, какие блоки будут загружены, и главное, которые дочерние блоки добавляются в блок под названием «product.info», который обычно используется в разделе шаблона вы пытаетесь визуализировать.

Если вы просматриваете шаблон страницы «catalog/product/view.phtml», который вы представляете, вы увидите, что он вызывает блоки, которые не будут доступны, например;

<?php echo $this->getChildHtml('addtocart') ?> 

Так, чтобы исправить это у вас есть два варианта,

вручную инициализировать и добавить каждый из дочерних блоков в блок продукта, который вы создаете, используя() метод Append.

Или

Обновление действия контроллера, который используется для загрузки и отображения страницы, чтобы включить макет ручки страницу продукта.Вызов следующего в контроллере,

$update = $this->getLayout()->getUpdate(); 
$update->addHandle('catalog_product_view'); 

Это заставит макет включать все правильные дочерние блоки страниц продукта, то в шаблоне просто позвонить;

$_product = Mage::getModel('catalog/product')->load('17');  
Mage::register('product',$_product); 
Mage::register('current_product',$_product); 
$block = Mage::app()->getLayout()->getBlock('product.info'); 
echo $block->toHtml(); 

Добавление ручки может быть сделана в контроллере, который необходимо будет отвергнуто, используя переписанный в пользовательском модуле (уже есть много статей по этому вопросу). Используйте наблюдателя событий для любого события, запускаемого перед действием контроллера.

+0

Во-первых, спасибо за все эти объяснения. К сожалению, мне ничего не удалось сделать. – live4fun

+0

Что касается кода для записи в шаблоне, я получил следующую ошибку: Неустранимая ошибка: вызов функции-члена toHtml() для не-объекта в .../public_html/app/design/frontend/default/modern/template/page/myviewer.phtml on line 63 Что касается части контроллера, я попытался изменить/public_html/app/code/core/Mage/Cms/controllers с моей домашней страницы в CMS. Правильно ли я понял? Я знаю, что я не должен напрямую редактировать основные файлы, но на данный момент я пытаюсь сделать это простым. – live4fun

+0

Пожалуйста, не редактируйте "/ public_html/app/code/core/Mage/Cms/controllers" прямо, никогда! Взгляните на это сообщение, где есть статья о том, как это сделать, http://www.amitbera.com/how-to-override-a-controller-in-magento. Если блок пуст, вы получите эту ошибку, проверьте, что ваш layout.xml имеет блок с именем «product.info» в дескрипторе макета catalog_product_view –

-1

вы можете сделать это, вставив в CMS> Страницы> Главная

{{block type="catalog/product_list" name="home.catalog.product.list" alias="products_homepage" LATEST="0" template="catalog/product/list.phtml"}} 

В этом случае вы должны изменить в шаблоне/каталог/продукта/list.phtml Найти этот код вокруг в строках 74, 133 и 180

<?php 
$_nameAfterChildren = $this->getChild('name.after')->getSortedChildren(); 
    foreach($_nameAfterChildren as $_nameAfterChildName): 

Заменить добавление, если заявление, должно быть что-то вроде этого:

<?php 

$_nameAfter = $this->getChild('name.after'); 
// New if here 
if($_nameAfter): 
$_afterChildren = $this->getChild('name.after')->getSortedChildren(); 
    foreach($_afterChildren as $_afterChildName): 
Смежные вопросы