Kierowanie na wiele uchwytów układu w układzie XML

22

Mam niestandardowy kontroler dostępny na ścieżce, /custommodule/customer/infoktóra ładuje 2columns-left.phtmlszablon do rootwęzła w następujący sposób:

<custommodule_customer_info>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>
</custommodule_customer_info>

Chciałbym zaktualizować szablon główny dla klientów, którzy nie są zalogowani, na przykład:

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

Rozumiem, że nie mogę celować w wiele uchwytów układu w ten sposób, ale cel powinien być jasny; zaktualizuj szablon główny dla tego uchwytu układu, gdy klienci nie są zalogowani.

Myślałem, że mogę celować w uchwyt mojego kontrolera za pomocą:

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

To rzeczywiście aktualizuje szablon główny o 1column.phtmlszablon, ale robi to na czymś, co wydaje się być wszystkimi stronami, a nie tylko stroną docelową w moim referencewęźle.

Próbowałem kilku permutacji tej aktualizacji układu, ale wydaje się, że żadna nie działa. Jak mogę celować w ten jeden uchwyt układu, jednocześnie korzystając z customer_logged_outuchwytu układu?

- edytuj - aby było jasne, w rzeczywistości jest to moduł innej firmy.

pspahn
źródło

Odpowiedzi:

18

Ponieważ używasz własnego kontrolera, nie musisz używać tylko domyślnych uchwytów. Na podstawie statusu zalogowania możesz dodać metodę infoAction

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

lub

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

a następnie użyj pliku layout.xml

<mymodule_customer_info_logged_in>

i

<mymodule_customer_info_logged_out>

- dodanie po edycji poniżej -

Widząc, że nie chcesz edytować kontrolera (ponieważ jest to rozszerzenie innej firmy), utworzyłbym osobne rozszerzenie, które będzie obserwować tylko kontroler

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }
Kristof w Fooman
źródło
Odlotowy. To nie jest idealne, ale jest stosunkowo czystym rozwiązaniem. Jak wspomniałem w innym komentarzu poniżej, wolałbym nie modyfikować modułu innej firmy, ale wygląda na to, że nie ma tutaj dużego wyboru. Szkoda, bo customer_logged_in/outuchwyty mogą być tak potężne, ale z powodu tego ograniczenia dają się nabrać.
pspahn 24.01.2013
14

Alan Storm odpowiedział na coś podobnego:

/programming//a/5601579/1157493

Możesz użyć pomocnika do wykonania logiki sprawdzania, czy zalogowany użytkownik jest zalogowany.

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

Zadzwoni Mage::helper('mymodule/myhelper')->switchTemplateIf(); W tym pomocniku, możesz zdecydować o zmianie szablonu lub po prostu zachować go w ten sposób.

Wierzę, że ustawia szablon na cokolwiek returnw tej funkcji.

Wyglądałoby to tak:

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

Niesprawdzone

Rick Kuipers
źródło
Też tak myślałem, ale miałem nadzieję, że będę musiał polegać tylko na układzie XML modułu, aby to wykonać bez konieczności polegania na dodatkowych klasach w module - filozofii „jeśli można to zrobić w XML, zrób to w XML, nie twórz dodatkowych zasobów modułu, jeśli nie jest to konieczne ".
pspahn
@pspahn Oczywiście celem jest próba zrobienia tego za pomocą systemu układu XML zapewnianego przez Magento, niestety ma on swoje ograniczenia i uważam, że jest to jeden z nich. Chociaż nadal uważam, że jest to całkowicie wykonalne rozwiązanie, pomimo dodatkowego zasobu modułu.
Rick Kuipers
@pspahn Fooman ma dobre alternatywne rozwiązanie, które poleciłbym ponad moje. Wymaga mniej kodowania!
Rick Kuipers
W takim przypadku mam do czynienia z modułem innej firmy. Wolałbym nie edytować ich modułu (ponieważ aktualizacje mogą go zepsuć) i wolałbym nie umieszczać tego w osobnej klasie pomocniczej modułu (ponieważ łączy to moduł i moduł razem w biodrze).
pspahn
6

Ostatnio potrzebowałem tego rodzaju funkcjonalności i było coraz trudniej dodawać coraz więcej uchwytów układu dla wszystkich różnych kombinacji istniejących uchwytów układu, więc stworzyłem rozszerzenie magento, aby dodać możliwość celowania w wiele uchwytów układu bezpośrednio z xml układu.

Oto link do rozszerzenia- https://github.com/mridul89/MultipleHandles.git

Użyłbyś tego w ten sposób

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

Spowoduje to, że magento będzie używać tego konkretnego customer_logged_outuchwytu custommodule_customer_infoukładu tylko wtedy, gdy uchwyt układu jest również obecny.

Mridul Aggarwal
źródło