Нацеливание на несколько дескрипторов макета в 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?

-- редактировать -- Для будьте ясны, на самом деле это сторонний модуль.

 22
Author: pspahn, 2013-01-24

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
    }
 18
Author: Kristof at Fooman, 2013-01-24 19:06:11

Алан Шторм ответил примерно так:

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';
    }
}

Непроверенный

 14
Author: Rick Kuipers, 2017-05-23 12:37:13

Недавно мне понадобилась такая функциональность, и мне стало сложно добавлять все больше и больше дескрипторов макета для всех различных комбинаций существующих дескрипторов макета, поэтому я создал расширение 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.

 6
Author: Mridul Aggarwal, 2014-02-12 23:02:38