Как установить макет по умолчанию в Magento 1.5 с помощью local.xml ?

#xml #layout #magento #default

#xml #Макет #magento #По умолчанию

Вопрос:

Итак, я создал несколько макетов, которые хочу использовать, и я подумал, что настройка этого в вашем local.xml файл исправит это для каждой страницы. Вот так

 <default>
<reference name="root">
    <action method="setTemplate">
      <template>page/mytheme.phtml</template>
    </action>
</reference>
</default>
  

Это, однако, ничего не делает. Вместо этого, если я перейду

 ...<customer_account_forgotpassword>
  <reference name="root">
    <action method="setTemplate"><template>page/mytheme.phtml</template></action>
  </reference>
</customer_account_forgotpassword>  

<customer_account_confirmation>
  <reference name="root">
    <action method="setTemplate"><template>page/mytheme.phtml</template></action>
  </reference>
</customer_account_confirmation>...
  

и так далее для каждого конкретного места, которое изменяется на этих конкретных страницах. Я думаю неправильно или это единственный способ сделать это?

Ответ №1:

Проблема, с которой вы (вероятно) столкнулись, заключается в том, что что-то появляется позже и снова устанавливает шаблон для корневого блока, переопределяя ваши изменения.

В более поздних версиях Magento (1.4 somethingish) появился способ предотвратить это. Если вы заглянете в 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>
    </reference>
</page_one_column>
  

Если page_one_column дескриптор будет применен к вашему запросу или вы примените его вручную с помощью

 <update handle="page_one_column" />
  

Magento изменит шаблон и вызовет setIsHandle метод в блоке.

 <action method="setIsHandle"><applied>1</applied></action>
  

В Magento есть код, который будет искать свойство IsHandle, и если оно верно, дальнейшие вызовы setTemplate будут игнорироваться. (это немного упрощает ситуацию, но это более или менее верно)

Попробуйте что-то вроде

 <default>
    <reference name="root">
        <action method="setTemplate">
          <template>page/mytheme.phtml</template>
        </action>
        <action method="setIsHandle">
            <applied>1</applied>
        </action>       
    </reference>
</default>  
  

И посмотрим, поможет ли это.

Имейте в виду, что это одна из тех серых областей, где неясно, должны ли действовать сторонние разработчики. Кроме того, изменение шаблона для всех страниц может оказать нежелательное влияние на части сайта, которые должны быть в определенном шаблоне.

Комментарии:

1. жаль, но метод setIsHandle используется для разных целей. Идея заключалась в том, чтобы просто сохранить обратную совместимость макетов страниц, потому что в предыдущих версиях была возможность устанавливать только шаблон, но позже он был изменен на handle, что является более гибким. Если свойству is_handle присвоено значение true, оно просто не установит шаблон в page / layout helper, но оно применит дескриптор страницы, который устанавливает шаблон, поэтому шаблон будет установлен в любом случае, просто способ его установки будет другим.

Ответ №2:

На самом деле, вы на правильном пути. Вы просто не указали запрос на своем local.xml . Вы также должны включить запрос, который вы переопределяете.

Вот пример кода local.xml

 <layout>
    <default>
    ....
    </default>

    <!-- Update Configuration for this request specially -->
    <customer_account_confirmation> 
      <reference name="root">
        <action method="setTemplate"><template>page/mytheme.phtml</template></action>
      </reference>
    </customer_account_confirmation>

</layout>
  

Такого количества настроек достаточно, чтобы делать то, что вам нужно.

Ответ №3:

Да, кажется, что вам нужно добавить его к некоторым отдельным дескрипторам самостоятельно. Это потому, что <default> дескриптор загружается первым. <customer_account_forgotpassword> Дескриптор будет прочитан только позже. Если вы проверите файл, design/frontend/base/default/layout/customer.xml вы увидите, что этот же дескриптор устанавливает шаблон, отличный от <default> предыдущего.

Посмотрите на этот пример порядка чтения дескрипторов макета Magento для страницы «Забыли пароль»:

 1. default
2. STORE_default
3. THEME_frontend_default_babel
4. customer_account_forgotpassword
5. customer_logged_out
  

Здесь вы можете увидеть, почему настройка шаблона <default> дескриптора переопределена.

Я рекомендую вам использовать модуль просмотра макетов для Magento от Алана Шторма: http://alanstorm.com/layouts_blocks_and_templates

Ответ №4:

У меня была похожая проблема, и я подумал, что это может сэкономить чье-то время.
Пытался установить 1column макет для страниц cms. Ни одно из решений не работало, пока я не понял:
Шаблон страницы CMS устанавливается администратором CMS > Pages > Design > Layout , а не local.xml .
Если вы установите шаблон для <default> дескриптора в local.xml , это не поможет, потому что это будет переопределено дескриптором макета, выбранным на страницах администратора для каждой конкретной страницы CMS.