Por qué no funciona cambiar la plantilla raíz
Ambos
Mage_Cms_IndexController::indexAction()
y
Mage_Cms_IndexController::viewAction()
que son responsables de mostrar la página de inicio predeterminada y una página de CMS, respectivamente, llaman a un ayudante:
Mage::helper('cms/page')->renderPage($this, $pageId)
Si salta al asistente (ubicado en app / code / core / Mage / Cms / Helper / Page.php) y sigue renderPage()
el método protegido _renderPage()
, verá que Magento está buscando dos veces una plantilla raíz (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);
}
y
if ($page->getRootTemplate()) {
$action->getLayout()->helper('page/layout')
->applyTemplate($page->getRootTemplate());
}
Ambas llamadas ocurren después de que se manejan los diseños como "cms_page" y similares, por lo que no tiene suerte aquí.
Qué puede hacer para cambiar la plantilla raíz
Hay un evento cms_page_render
que puede usar para agregar su propio controlador de diseño XML en páginas CMS. Cree su propia extensión (ahorraré algunos detalles aquí) y configure el observador de eventos en su 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>
Agregue su observador de eventos:
<?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;
}
}
Finalmente, agregue su nuevo controlador XML de diseño (por ejemplo, en su 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>
También puede usar este método para agregar un cms_page_view_after
identificador o crear identificadores específicos de página a medida que cms_page_render
pasa el $page
objeto a su observador.
¿Por qué no puede agregar un bloque a la 'referencia izquierda'?
¿Estás seguro de que la plantilla que estás usando tiene una columna izquierda? Esta pregunta puede sonar tonta, pero el diseño predeterminado de "2 columnas con barra derecha", por ejemplo, solo ofrece un área de "contenido" y "derecho". Puedo agregar bloques a la columna derecha usando cms_page
sin problemas, por lo que este podría ser el problema.
En general, solo puede agregar fácilmente bloques a las referencias y repetirlas si
- la plantilla raíz elegida usa el bloque al que hace referencia (ver
app/design/frontend/base/default/template/page/*.phtml
) y
- el bloque al que hace referencia es de tipo
core/text_list
, llama $this->getChildhtml()
sin argumentos o hace algo más para hacer eco de todos los bloques secundarios.
Sin más detalles, no puedo decirte por qué tus bloques no se repiten en la columna izquierda o derecha.
$cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier());
Si alguien cambió la URL de la página cms, el identificador no funcionará. Idealmente, existiría un campo para 'clave de página' en la página CMS en el sistema de administración, luego la URL de la página, el nombre, etc. podrían cambiarse y la clave podría mantenerse igual.Con respecto a su "no se puede agregar un bloque usando
<reference name="left
/>, ¿está seguro de que su página CMS tiene un bloque llamado izquierda? Por ejemplo, si considera la página de inicio predeterminada que se envía con los datos de muestra de Magento, parece tener un bloque llamado izquierda.Sin embargo, si mira la página en el backend, puede ver que está configurada para usar la plantilla raíz
y luego en su área de contenido, la columna izquierda se agrega usando marcado HTML (alternar el WYSIWYG a la vista de origen)
Este gráfico dirigido deja en claro que no hay ningún bloque con nombre
left
para enganchar ( haga clic para obtener una imagen a tamaño completo )Con respecto a la configuración de una plantilla, si observa el origen del menú desplegable "Diseño"
Se puede ver cuando se está configurando este campo, el valor real de ser salvo es algo así como
one_column
,two_columns_left
, etc. Estos valores coresponden a los mangos de diseño del mismo nombre.Cuando Magento representa una página CMS, hace referencia a los valores guardados y agrega el controlador de diseño apropiado a la página. Si bien es tangencial a la pregunta, ese identificador se agrega aquí
Sin embargo, lo más importante es el orden en que se agregan los controladores de diseño
Como puede ver en la captura de pantalla anterior, el
page_two_columns_right
controlador se agrega después delcms_index_index
controlador. Esto significa que si agrega el código de actualización xml de diseño para cambiar la plantilla encms_index_index
su código, se ejecutará, pero luegopage_two_columns_right
se ejecutará el código xml de actualización de diseño .Siempre sospeché que esto es así por diseño para garantizar que la plantilla establecida en la interfaz de usuario sea siempre correcta. En versiones anteriores de Magento, la
<action method="setIsHandle"><applied>1</applied></action>
llamada al método parece haber existido por las mismas razones.Por lo tanto, no hay forma de hacer lo que quiere con un código XML de diseño puro. Si se siente cómodo con la creación de módulos personalizados y código de observador, investigue el
cms_page_render
evento. Esto se activa justo antes de queloadLayoutUpdates
se llame, y le permitiría deslizar un nombre de identificador adicional o eliminar los nombres de identificador existentes.fuente
default
controlador, el diseño establecido en el administrador seguirá ganando (es decirpage_two_columns_right
, seguirá ejecutándose luego). Además, Re: terminología: no anula los identificadores, sus identificadores siempre coexisten con los demás, es solo el orden en que se ejecutan en los efectos el resultado final.