Mizanpaj Güncellemeleri için CMS XML tanıtıcıları


13

Bir cms sayfasının düzenini güncellemek için cms tutamaçlarını kullanmaya çalıştığım birkaç senaryo yaşadım. Örneğin, cms_index_index tanıtıcı kök başvuru ve sayfa şablonu ayarlama kullanmaya çalışıyordum. Bu başarısız oldu ve ben bu düzeni güncelleme doğrudan ana sayfa cms sayfa görüntüleme ayarları yönetici sistemi üzerinden yapmak zorunda kaldı.

Ayrıca sol blok cms_page tanıtıcısını kullanarak referans eklemek için denedim. Yine bu başarısız oldu ve düzen güncellemesi yönetici sistemi üzerinden uygulamak zorunda kaldı.

Cms sayfalarına bir kök şablon atayamayacağınızı okudum. Bu doğru mu ve kimse nedenini açıklayabilir mi?

Ayrıca sol, sağ, kök vb standart referansları kullanmak için cms tanıtıcıları etkinleştirmek için bir yolu olup olmadığını merak ettim? Baş ve içerik gibi şeylere referans verebilirim.

Yanıtlar:


20

Kök şablonunu değiştirmek neden çalışmıyor?

Her ikisi de

Mage_Cms_IndexController::indexAction()

ve

Mage_Cms_IndexController::viewAction()

varsayılan ana sayfayı ve bir CMS sayfasını görüntülemekten sorumlu olan bir yardımcı çağırır:

Mage::helper('cms/page')->renderPage($this, $pageId)

Yardımcıya atlarsanız (app / code / core / Mage / Cms / Helper / Page.php konumunda bulunur) ve renderPage()korumalı yöntemi _renderPage()izlerseniz Magento'nun bir kök şablonu (Magento CE 1.7) iki kez kontrol ettiğini görürsünüz. 0.2):

if ($page->getRootTemplate()) {
    $handle = ($page->getCustomRootTemplate()
                && $page->getCustomRootTemplate() != 'empty'
                && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
    $action->getLayout()->helper('page/layout')->applyHandle($handle);     
}

ve

if ($page->getRootTemplate()) {
    $action->getLayout()->helper('page/layout')
        ->applyTemplate($page->getRootTemplate());
}

Her iki çağrı da "cms_page" ve benzerleri gibi mizanpaj işlendikten sonra gerçekleşir, dolayısıyla burada şansınız kalmaz.

Kök şablonunu değiştirmek için yapabilecekleriniz

cms_page_renderCMS sayfalarına kendi XML mizanpaj tutamacınızı eklemek için kullanabileceğiniz bir etkinlik var. Kendi uzantınızı oluşturun (burada bazı ayrıntıları yedekleyeceğim) ve etkinlik gözlemcisini aşağıdakiler içinde yapılandırın 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>

Etkinlik gözlemcinizi ekleyin:

<?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;
    }
}

Son olarak, (Gözlerinde farklı örn Yeni Düzen XML kolu eklemek 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>

Bir cms_page_view_aftertanıtıcı eklemek veya nesneyi gözlemcinize cms_page_renderiletirken sayfaya özgü tanıtıcılar oluşturmak için de bu yöntemi kullanabilirsiniz $page.

'Referans soluna' neden bir blok ekleyemiyorsunuz?

Kullandığınız şablonun sol sütununa sahip olduğundan emin misiniz? Bu soru saçma gelebilir, ancak varsayılan "sağ çubuklu 2 sütun" düzeni yalnızca bir 'içerik' ve 'sağ' alan sunar. cms_pageBu sorun olabilir bu yüzden sorunsuz kullanarak doğru sütuna bloklar ekleyebilirsiniz .

Genel olarak, yalnızca referanslara kolayca blok ekleyebilir ve

  • seçilen kök şablonu referansta bulunduğunuz bloğu kullanır (bkz. app/design/frontend/base/default/template/page/*.phtml) ve
  • referansta bulunduğunuz blok ya tiptir core/text_list, $this->getChildhtml()argümansız çağrılar yapar ya da tüm alt blokları yankılamak için başka bir şey yapar.

Daha fazla ayrıntı olmadan, bloklarınızın neden sol veya sağ sütunda yankılamadığını söyleyemem.


Merhaba Matthias. Etkinlik gözlemcisi ekleme önerisi için teşekkürler, geliştiricilerimizden birine bir göz atacağım ve bunun işe yarayıp yaramadığını görün. Bu cevap olabilir! @Alan, cms sayfaları için doğru varsayılan şablonun ayarlanması ve tanıtıcıların geçersiz kılınması konusunda da benzer bir noktaya değindi. Bilgi için de teşekkürler, sanırım şimdi anladım.
Mark Weston

Selam. Bunu test etti ve işe yarıyor. Ayrıca, sayfaya özgü tutamaçlar için test edildi ve çalışıyor, ancak değiştirilmeyecek sayfalar için bir tanımlayıcıya ihtiyaç duyduğum için en iyi çözüm değil. Bir test olarak Sayfa tanımlayıcısını kullandım $cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier()); Birisi cms sayfasının URL'sini değiştirdiyse, tanıtıcı işlevi olmaz. İdeal olarak, yönetici sistemindeki CMS sayfasında 'sayfa anahtarı' için bir alan bulunacak, ardından sayfa URL'si, adı vb. Değiştirilebilir ve anahtar aynı tutulabilir.
Mark Weston

14

<reference name="left/> Kullanarak bir blok ekleyemiyorsanız , CMS sayfanızda sol adlı bir blok bulunduğundan emin misiniz? Örneğin, Magento örnek verileriyle birlikte gelen varsayılan giriş sayfasını düşünüyorsanız, adında bir blok var gibi görünüyor ayrıldı.

bu sol sütun mu?

Ancak, arka uçtaki sayfaya bakarsanız, kök şablonu kullanmak üzere ayarlandığını görebilirsiniz

`2 columns with right bar`    

ve ardından içerik alanına HTML sütunu kullanılarak sol sütun eklenir (WYSIWYG'yi kaynak görünümüne geçirir)

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

Bu yönlendirilmiş grafik, leftiçine takılmak üzere adlandırılmış bir blok olmadığını netleştirir ( tam boyutlu resim için tıklayın )

Commerce Bug ile oluşturulan yönlendirilmiş grafik

Bir şablon ayarlamayla ilgili olarak, "Düzen" açılır menüsünün kaynağına bakarsanız

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

Bu alanı belirlerken, görebilirsiniz, kaydedildi alma gerçek değeri gibi bir şey one_column, two_columns_leftaynı adı taşıyan düzen kolları Bu değerler corespond vb.

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

Magento bir CMS sayfası oluştururken kaydedilen değerlere başvurur ve sayfaya uygun mizanpaj tutamacını ekler. Soruya teğet olmakla birlikte, bu tutamaç buraya eklenir

#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);
    }  
    //...
}

Daha da önemlisi olsa sipariş düzeni kolları eklenir

İşlemler Sekmesi Ticaret Hatası

Yukarıdaki ekran görüntüsünde de görebileceğiniz gibi, page_two_columns_rightsap eklenir sonracms_index_index sap. Bu, kodunuzdaki şablonu değiştirmek için düzen xml güncelleme kodu eklerseniz cms_index_index, ancak düzen güncelleme xml kodunun page_two_columns_rightardından çalıştırılacağı anlamına gelir.

Her zaman bunun kullanıcı arayüzünde ayarlanan şablonun her zaman doğru olmasını sağlamak için tasarımdan şüphelendim . Magento'nun önceki sürümünde <action method="setIsHandle"><applied>1</applied></action>yöntem çağrısı aynı nedenlerle varmış gibi görünüyor.

Yani, saf düzen xml kodunu kullanarak istediğinizi yapmanın bir yolu yoktur. Özel modüller ve gözlemci kodu oluşturmaktan memnunsanız, cms_page_renderetkinliğe bakın. Bu hemen önce loadLayoutUpdatesçağrılır ve ek bir tanıtıcı adını kaydırmanıza veya mevcut tanıtıcı adlarını kaldırmanıza izin verir.


Teşekkürler Alan, bir cms sayfasına blok ekleme hakkındaki yorumlarınız tam anlamıyla. Genellikle Magento'nun sağladığı çeşitli xml tutamaçlarını kullanarak farklı sayfalar için şablonlar ayarlarım. Cms sayfalarını biraz daha iyi anladım, neden cms sayfaları için referanslar kullanırken sorun yaşadığımı daha net hale getirdi. Benim page.xml varsayılan tanıtıcı cms sayfaları için doğru düzen olduğundan emin olmak gerekir. Görünen o ki bu sapın üzerinde parladım, çünkü genellikle başka bir yerde geçersiz kılıyorum. Bu doğru mu? Grafiği nasıl ürettiğinizi ve belirli bir isteğin tutamaçlarını görüntülemek için hangi aracı kullandığınızı sorabilir miyim?
Mark Weston

2
@MarkWeston Diyagramlar ve kullanıcı arayüzü, yarattığım ve sattığım ticari bir hata ayıklama aracı olan Commerce Bug'un bazılarını ele alıyor. ( ayrıntılar için alanstorm.com/find_magento_block_name adresine bakın) Kollar hakkındaki sorunuzu anladığımdan emin değilim, ancak tutamaçta bir şablon defaultayarlıyorsanız, yöneticide ayarlanan düzen hala kazanacak (yani page_two_columns_rightyine de çalışacak) sonra). Ayrıca, Re: terminoloji - kulpları geçersiz kılmazsınız, kulplarınız her zaman diğerleriyle birlikte bulunur - bu sadece sonuçta çalıştıkları sıradır.
Alan Storm

Şerefe Alan. Bir şablonu geçersiz kılma - iyi bir nokta olmayacak şekilde ayarlamak için tanıtıcı kullanımı çağrısında ne demek istediğinizi görüyorum. Commerce Bug hakkında bilgi için teşekkürler.
Mark Weston
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.