2013-06-17 2 views
0

Я предполагаю, что это один из файлов макета приложения - я хочу написать крючок в своем мобильном шаблоне, чтобы вытащить другую главную страницу CMS.Где в Magento находится домашняя страница?

Редактировать: Чтобы уточнить, я хочу добиться того, чтобы другая страница cms вытащилась за узел мобильной версии магазина в сравнении с версией рабочего стола. Поскольку вы можете установить только одну страницу CMS по умолчанию в magento admin, кажется, что в файлах мобильных шаблонов должно быть какое-то пользовательское кодирование.

+1

По умолчанию я думаю, что это статическая страница, которая использует один из основных шаблонов (правый столбец, левый столбец, один столбец). Если у вас это не получилось, проверьте CMS в Magento Admin. – phpisuber01

+0

Проверьте правильность выше. Я пытаюсь вытащить другую страницу CMS для мобильной версии сайта, я думаю, что мне нужно переопределить ее где-нибудь в мобильном шаблоне. Просто не знаю, где его переопределить! – valen

+0

Вы можете создать Исключения на вкладке «Дизайн», чтобы использовать другую тему на основе пользовательского агента. Это пугающий способ сделать это. [Вот руководство по тому, как это сделать] (http://magebase.com/magento-tutorials/magent-design-exceptions-explained/) – phpisuber01

ответ

6

Одна из вещей, которые мне нравятся в Magento, - это способность выполнять множество вещей, просто играя с файлами макетов.

Я расскажу об изображении Алана Шторма, чтобы проиллюстрировать, как я выполнил эту точную задачу, не меняя кода (надеюсь, вы не возражаете против Алана).

enter image description here

Как вы можете видеть на картинке выше, полное имя Действие cms_index_index. Вы можете найти эту информацию с помощью инструментов отладки, таких как Commerce Bug.

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

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

<cms_index_index> 
     <block type="cms/block" name="cms_page"><action method="setBlockId"><block_id>mobile_home</block_id></action></block> 
</cms_index_index> 

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

Это может быть не самый лучший способ, но это не связано с изменениями кода.

+1

Ницца - я бы не подумал об этом. (Болезнь программиста) –

+0

Спасибо за решение CCBlackburn. Домашняя страница по умолчанию больше не вытягивается. Однако статический блок не извлекается из этого - раздел cms пуст (проверьте мобильное устройство на http://vapetropolis.ca). Я создал статический блок mobile_home, и я также попытался использовать существующий статический блок. – valen

+0

Что такое контент для этого блока, я не уверен, что там должно быть b, а не там. Кроме того, можете ли вы дважды проверить, что объявление cms_index_index layout в local.xml является единственным определяемым и что в cms.xml в той же папке не определено? – CCBlackburn

5

Это, вероятно, не так прямо, как хотелось бы, но вот как это работает.

Запрос на главную страницу направляется на метод indexAction класса Mage_Cms_IndexController.

enter image description here

Если вы посмотрите на метод indexAction вы можете увидеть, Magento использует renderPage метод cms/page вспомогательный объект для отображения содержимого страницы

#File: app/code/core/Mage/Cms/controllers/IndexController.php 
public function indexAction($coreRoute = null) 
{ 
    $pageId = Mage::getStoreConfig(Mage_Cms_Helper_Page::XML_PATH_HOME_PAGE); 
    if (!Mage::helper('cms/page')->renderPage($this, $pageId)) { 
     $this->_forward('defaultIndex'); 
    } 
} 

$pageId вытягивается из Magento, и является идентификатором URL страницы CMS.

Если Вы прыгаете к renderPage методе

#File: app/code/core/Mage/Cms/Helper/Page.php 
public function renderPage(Mage_Core_Controller_Front_Action $action, $pageId = null) 
{ 
    return $this->_renderPage($action, $pageId); 
} 

он оборачивает вызов защищенного _renderPage метода. Если вы воспользуетесь этим методом, код загрузки страницы будет следующими.

#File: app/code/core/Mage/Cms/Helper/Page.php 
protected function _renderPage(Mage_Core_Controller_Varien_Action $action, $pageId = null, $renderLayout = true) 
{ 
    $page = Mage::getSingleton('cms/page'); 
    //... 
    if (!$page->load($pageId)) { 
     return false; 
    } 
    //... 
} 

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

enter image description here

Значение блока HTML для страницы CMS оказано следующим кодом в Mage_Cms_Block_Page

#File: app/code/core/Mage/Cms/Helper/Page.php 
protected function _toHtml() 
{ 
    /* @var $helper Mage_Cms_Helper_Data */ 
    $helper = Mage::helper('cms'); 
    $processor = $helper->getPageTemplateProcessor(); 
    $html = $processor->filter($this->getPage()->getContent()); 
    $html = $this->getMessagesBlock()->toHtml() . $html; 
    return $html; 
} 

getPage метод создает тот же самый синглтон, о котором мы упоминали выше. Другой код - это то, что заменяет директивы CMS {{...}} с их фактическим содержанием.

Если бы я приближался к этому проекту, я бы рассмотрел переписывание класса для объекта Mage_Cms_Model_Page, который выглядит примерно так.

public function load($id, $field=null) 
{ 
    if(... is mobile site ... AND ... $id is for the home page ...) 
    { 
     $id = ... ID of the mobile site, hard coded or pulled from custom config ...; 
    } 

    return parent::load($id, $field); 
} 

Там также cms_page_render событие, которое срабатывает после загрузки страницы в методе _renderPage. Вы можете попробовать перезагрузить переданный в объекте страницы другой идентификатор в наблюдателе. Вы также можете рассмотреть что-то в событиях model_load_after или model_load_before - хотя это становится сложнее, поскольку вы не можете напрямую изменить идентификатор.

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

Ваше умение/философия может отличаться.

Удачи вам!

+0

С помощью подхода '' cms_page_render'' я попробовал '' $ observer-> getEvent() -> setPage ($ new_page) '', но он не Работа. Does '' Mage :: dispatchEvent() '' передавать аргументы по ссылке? Если да, то как мне перезагрузить один и тот же объект страницы с другим идентификатором, не теряя эту ссылку? – Vic

Смежные вопросы