Dlaczego zmiana szablonu głównego nie działa
Obie
Mage_Cms_IndexController::indexAction()
i
Mage_Cms_IndexController::viewAction()
które są odpowiedzialne za wyświetlanie domyślnej strony głównej i strony CMS, odpowiednio wywołują pomocnika:
Mage::helper('cms/page')->renderPage($this, $pageId)
Jeśli wskoczysz do pomocnika (znajdującego się w app / code / core / Mage / Cms / Helper / Page.php) i zastosujesz renderPage()
się do chronionej metody _renderPage()
, zobaczysz, że Magento dwa razy sprawdza szablon główny (Magento CE 1.7. 0.2):
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
i
if ($page->getRootTemplate()) {
$action->getLayout()->helper('page/layout')
->applyTemplate($page->getRootTemplate());
}
Oba wywołania mają miejsce po przetworzeniu uchwytów układu, takich jak „cms_page” i podobnych, więc nie masz szczęścia.
Co możesz zrobić, aby zmienić szablon główny
Istnieje zdarzenie, cms_page_render
którego można użyć do dodania własnego uchwytu układu XML na stronach CMS. Utwórz własne rozszerzenie (oszczędzę tutaj kilku szczegółów) i skonfiguruj obserwatora zdarzeń w config.xml
:
<?xml version="1.0"?>
<config>
<modules>
<Emzee_Cms>
<version>0.0.1</version>
</Emzee_Cms>
</modules>
<global>
<events>
<cms_page_render>
<observers>
<emzee_cms_page_render>
<class>emzee_cms/observer</class>
<method>cms_page_render</method>
</emzee_cms_page_render>
</observers>
</cms_page_render>
</events>
<models>
<emzee_cms>
<class>Emzee_Cms_Model</class>
</emzee_cms>
</models>
</global>
</config>
Dodaj obserwatora wydarzeń:
<?php
class Emzee_Cms_Model_Observer
{
public function cms_page_render(Varien_Event_Observer $observer)
{
$action = $observer->getEvent()->getControllerAction();
$actionName = strtolower($action->getFullActionName());
$action->getLayout()->getUpdate()
->addHandle($actionName . '_after');
return $this;
}
}
Na koniec dodaj nowy uchwyt XML układu (np. W swoim local.xml
):
<?xml version="1.0"?>
<layout version="0.1.0">
<cms_index_index_after>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
</cms_index_index_after>
</layout>
Tej metody można również użyć do dodania cms_page_view_after
uchwytu lub utworzenia uchwytów specyficznych dla strony, cms_page_render
gdy $page
obiekt jest przekazywany do obserwatora.
Dlaczego nie możesz dodać bloku do „lewej strony”
Czy na pewno używany szablon ma lewą kolumnę? To pytanie może zabrzmieć głupio, ale domyślny układ „2 kolumn z prawym paskiem” oferuje na przykład tylko „treść” i „prawy” obszar. Mogę cms_page
bez problemu dodawać bloki do prawej kolumny , więc to może być problem.
Zasadniczo możesz łatwo dodawać bloki do referencji i wyświetlać je, jeśli
- wybrany szablon główny używa bloku, do którego się odwołujesz (patrz
app/design/frontend/base/default/template/page/*.phtml
) i
- blok, do którego się odwołujesz, jest typu
core/text_list
, wywołuje $this->getChildhtml()
bez argumentów lub robi coś innego, aby wywołać echo wszystkich bloków potomnych.
Bez dalszych szczegółów nie mogę powiedzieć, dlaczego twoje bloki nie są wyświetlane w lewej lub prawej kolumnie.
$cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier());
Jeśli ktoś zmieni adres URL strony cms, uchwyt nie będzie działał. Idealnie byłoby, gdyby na stronie CMS w systemie administracyjnym istniało pole „klucz strony”, następnie adres URL strony, nazwa itp. Mógłby zostać zmieniony, a klucz mógłby być taki sam.Jeśli chodzi o „nie można dodać bloku za pomocą
<reference name="left
/>, czy jesteś pewien, że strona CMS ma blok o nazwie po lewej stronie? Na przykład, jeśli weźmiesz pod uwagę domyślną stronę główną dostarczaną z przykładowymi danymi Magento, wydaje się , że ma on blok o nazwie lewo.Jeśli jednak spojrzysz na stronę w backendie, zobaczysz, że jest ustawiona na użycie szablonu głównego
a następnie w obszarze zawartości dodawana jest lewa kolumna za pomocą znaczników HTML (przełącz WYSIWYG w widok źródłowy)
Ten ukierunkowany wykres pokazuje, że nie ma bloku o nazwie
left
do zaczepienia ( kliknij, aby wyświetlić obraz w pełnym rozmiarze )Jeśli chodzi o ustawienie szablonu, spójrz na źródło menu rozwijanego „Układ”
Można zobaczyć, kiedy jesteś ustawienie tego pola, rzeczywista wartość zapisana coraz to coś
one_column
,two_columns_left
itd Wartości te corespond uchwytami do układu o tej samej nazwie.Kiedy Magento renderuje stronę CMS, odwołuje się do zapisanych wartości i dodaje do strony odpowiedni uchwyt układu. Ten uchwyt jest dodawany tutaj, chociaż jest styczny do pytania
Co ważniejsze, jest kolejność dodawania uchwytów układu
Jak widać na zrzucie ekranu powyżej,
page_two_columns_right
uchwyt dodaje po tymcms_index_index
uchwytem. Oznacza to, że jeśli dodasz kod aktualizacji xml układu, aby zmienić szablon wcms_index_index
kodzie, uruchomi się, ale wtedy kod xml aktualizacji układupage_two_columns_right
będzie działał po nim.Zawsze podejrzewałem, że jest to zgodne z projektem, aby upewnić się, że szablon ustawiony w interfejsie użytkownika jest zawsze poprawny. W poprzedniej wersji Magento
<action method="setIsHandle"><applied>1</applied></action>
wywołanie metody istniało z tych samych powodów.Tak więc nie ma możliwości robienia tego, co chcesz za pomocą kodu XML w czystym układzie. Jeśli nie masz nic przeciwko tworzeniu niestandardowych modułów i kodu obserwatora, zajrzyj do
cms_page_render
wydarzenia. Uruchamia się tuż przedloadLayoutUpdates
wywołaniem i pozwala na wsunięcie dodatkowej nazwy uchwytu lub usunięcie istniejących nazw uchwytów.źródło
default
uchwycie, układ ustawiony przez administratora będzie nadal wygrywał (tzn.page_two_columns_right
będzie nadal działał później). Ponadto Re: terminologia - nie zastępujesz uchwytów, twoje uchwyty zawsze współistnieją z innymi - to tylko kolejność, w jakiej się uruchamiają, wpływa na wynik końcowy.