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
`2 columns with right bar`
a następnie w obszarze zawartości dodawana jest lewa kolumna za pomocą znaczników HTML (przełącz WYSIWYG w widok źródłowy)
<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>
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”
<select id="page_root_template" name="root_template" class=" required-entry select">
<option value="empty">Empty</option>
<option value="one_column">1 column</option>
<option value="two_columns_left">2 columns with left bar</option>
<option value="two_columns_right" selected="selected">2 columns with right bar</option>
<option value="three_columns">3 columns</option>
</select>
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.
#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
<label>All One-Column Layout Pages</label>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>one_column</name></action>
</reference>
</page_one_column>
...
<page_two_columns_left translate="label">
<label>All Two-Column Layout Pages (Left Column)</label>
<reference name="root">
<action method="setTemplate"><template>page/2columns-left.phtml</template></action>
<!-- Mark root page block that template is applied -->
<action method="setIsHandle"><applied>1</applied></action>
<action method="setLayoutCode"><name>two_columns_left</name></action>
</reference>
</page_two_columns_left>
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
#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action $action, $pageId = null, $renderLayout = true)
{
//...
$action->addActionLayoutHandles();
if ($page->getRootTemplate()) {
$handle = ($page->getCustomRootTemplate()
&& $page->getCustomRootTemplate() != 'empty'
&& $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
$action->getLayout()->helper('page/layout')->applyHandle($handle);
}
//...
}
Co ważniejsze, jest kolejność dodawania uchwytów układu
Jak widać na zrzucie ekranu powyżej, page_two_columns_right
uchwyt dodaje po tym cms_index_index
uchwytem. Oznacza to, że jeśli dodasz kod aktualizacji xml układu, aby zmienić szablon w cms_index_index
kodzie, uruchomi się, ale wtedy kod xml aktualizacji układu page_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ż przed loadLayoutUpdates
wywołaniem i pozwala na wsunięcie dodatkowej nazwy uchwytu lub usunięcie istniejących nazw uchwytów.