Нацеливание на несколько дескрипторов макета в XML-формате макета
У меня есть пользовательский контроллер, доступ к которому осуществляется по пути /custommodule/customer/info
, который загружает шаблон 2columns-left.phtml
на узел root
следующим образом:
<custommodule_customer_info>
<reference name="root">
<action method="setTemplate"><template>page/2columns-left.phtml</template></action>
</reference>
</custommodule_customer_info>
Что я хотел бы сделать, так это обновить корневой шаблон для клиентов, которые не вошли в систему, например:
<customer_logged_out>
<custommodule_customer_info>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
</custommodule_customer_info>
</customer_logged_out>
Я понимаю, что я не могу настроить таргетинг на несколько дескрипторов макета таким образом, но намерение должно быть ясным; обновите корневой шаблон для этого дескриптора макета, пока клиенты не вошли в систему в.
Я думал, что смогу настроить дескриптор моего контроллера следующим образом:
<customer_logged_out>
<reference name="custommodule_customer_info">
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
</reference>
</customer_logged_out>
Это действительно обновляет корневой шаблон с помощью шаблона 1column.phtml
, но он делает это на том, что кажется всеми страницами, а не только на странице, предназначенной для моего узла reference
.
Я попробовал несколько перестановок этого обновления макета, но, похоже, ни одна из них не работает. Как я могу настроить таргетинг на этот один дескриптор макета, одновременно используя дескриптор макета customer_logged_out
?
-- редактировать -- Для будьте ясны, на самом деле это сторонний модуль.
3 answers
Поскольку вы используете свой собственный контроллер, вам не нужно использовать только дескрипторы по умолчанию. Основываясь на статусе входа в систему, вы можете добавить в свой метод информационного воздействия
$this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');
Или
$this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');
А затем в вашем layout.xml использование файла
<mymodule_customer_info_logged_in>
И
<mymodule_customer_info_logged_out>
-- добавление после вашего редактирования ниже --
Видя, что вы не хотите редактировать контроллер (поскольку это стороннее расширение), я бы создал отдельное расширение, которое только наблюдает controller_action_layout_load_before
контролер_активный_загрузка_перед $update = $observer->getEvent()->getLayout()->getUpdate();
$handles = $update->getHandles();
if (in_array('custommodule_customer_info', $handles)) {
//code to add the custom handles based on login
}
Алан Шторм ответил примерно так:
Https://stackoverflow.com/a/5601579/1157493
Вы можете использовать помощника, чтобы выполнить свою логику проверки того, вошел ли пользователь в систему.
<action method="setTemplate">
<template helper="mymodule/myhelper/switchTemplateIf"/>
</action>
Он вызовет Mage::helper('mymodule/myhelper')->switchTemplateIf();
В этом помощнике вы можете решить сменить шаблон или просто оставить его в таком виде.
Я полагаю, что он устанавливает шаблон на все, что вы return
в этой функции.
Это выглядело бы примерно так это:
public function switchTemplateIf() {
if (Mage::helper('customer')->isLoggedIn()) {
return 'page/1column.phtml';
} else {
return 'page/2column-right.phtml';
}
}
Непроверенный
Недавно мне понадобилась такая функциональность, и мне стало сложно добавлять все больше и больше дескрипторов макета для всех различных комбинаций существующих дескрипторов макета, поэтому я создал расширение magento, чтобы добавить возможность нацеливания на несколько дескрипторов макета непосредственно из xml макета.
Вот ссылка на расширение- https://github.com/mridul89/MultipleHandles.git
Вы бы использовали его так -
<customer_logged_out ifhandle="custommodule_customer_info">
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
</customer_logged_out>
Это подскажет magento использовать только этот конкретный дескриптор макета customer_logged_out
, если также присутствует дескриптор макета custommodule_customer_info
.