Націлювання на кілька макетів ручок у макеті XML


22

У мене є власний контролер, доступ до /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ручку макета?

- редагувати - Щоб зрозуміти, це насправді сторонній модуль.

Відповіді:


18

Оскільки ви використовуєте власний контролер, вам не потрібно використовувати лише ручки за замовчуванням. На основі статусу, який ви ввійшли, ви можете додати свій метод infoAction

 $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>

- додавання після редагування нижче -

Бачачи, що ви не хочете редагувати контролер (оскільки це розширення сторонніх розробників), я створив би окреме розширення, яке дотримується лише контролера washing_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
    }

Запаморочливий. Це не ідеально, але є відносно чистим рішенням. Як я вже згадував у своєму іншому коментарі нижче, я б краще не міняв сторонній модуль, але, схоже, тут не так вже й багато вибору. Сором, бо customer_logged_in/outручки можуть бути настільки потужними, але вони обмежуються через це обмеження.
pspahn

14

Алан Шторм відповів на щось подібне:

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

Неперевірений


У мене теж була така думка, але я сподівався лише покластися на макет модуля XML, щоб виконати це, не покладаючись на додаткові класи в модулі - філософія "якщо це можна зробити в XML, зробіть це" у XML не створюйте додаткових ресурсів модуля, якщо це не потрібно ".
pspahn

@pspahn Звичайно, мета полягає в тому, щоб спробувати це зробити за допомогою системи макета XML, яку пропонує Magento, на жаль, у неї є свої обмеження, і я вважаю, що це одна з них. Хоча я все ще думаю, що це цілком життєздатне рішення, незважаючи на додатковий ресурс модуля.
Рік Куйперс

@pspahn Fooman має гарне альтернативне рішення, яке я рекомендував би над своїм. Це вимагає менше кодування!
Рік Куйперс

У цьому випадку я фактично маю справу зі стороннім модулем. Я б краще не редагував їх модуль (оскільки оновлення можуть порушити його), і я краще не розміщую це в окремому класі допоміжних модулів (оскільки це зв'язує їх модуль і модуль разом у стегні).
pspahn

6

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.