我只是想发表评论,但要彻底解释,我需要更多空间;)
要直接回答您的评论,您看到的内容不一定在某个文件中,CMS 页面的“内容”在您的数据库中。通过更改 CMS 页面上的内容字段(Magento Admin -> CMS -> 页面 -> 从列表中选择一个页面),您可以更改该页面的中心内容。Magento 有许多不同的页面“类型”(xml 中标签的每个父级(稍后解释)是表示页面类型的布局句柄),常见的示例是 cms、类别、产品、结帐、购物车、客户帐户等。
因此,当您看到 时$this->getChildHtml('content');
,您看到的是对系统的调用以从 XML 中提取名为“content”的子块。这取决于您所在的页面,如 XML 和 Magento 核心代码所规定的那样。
布局文件
让我们看一下“内容”这个名称的来源。我们当前的工作目录是/app/design/frontend/base/default/layout/
. 在此文件夹中,您将看到 .xml 文件的列表,这些文件指示页面如何组合在一起。名为“content”的块最初是在 page.xml 的第 91 行左右定义的:
<block type="core/text_list" name="content" as="content" translate="label">
<label>Main Content Area</label>
</block>
另外,请注意,此部分“嵌套”在<default></default>
标签中。这些标签就是我所说的布局句柄,这表明默认情况下所有页面都应该使用这个 xml 布局加载。所以这是我们的“内容”块,在它的所有荣耀中。它实际上只是一个命名空间。其他布局页面将分别从内容块中加载他们需要的内容。
现在,让我们看一下第 45 行附近的另一个相关布局文件 cms.xml:
<cms_page translate="label">
<label>CMS Pages (All)</label>
<reference name="content">
<block type="core/template" name="page_content_heading" template="cms/content_heading.phtml"/>
<block type="page/html_wrapper" name="cms.wrapper" translate="label">
<label>CMS Content Wrapper</label>
<action method="setElementClass"><value>std</value></action>
<block type="cms/page" name="cms_page"/>
</block>
</reference>
</cms_page>
在这里,<reference name="content">
表示嵌套在这里的所有内容都是“内容”块的子项。我们不需要这样称呼它,<block name="content"/>
因为我们知道它已经在 page.xml 中定义。
从那里,他们有“cms.wrapper”块,它基本上只是设置了“包裹”其余cms内容的div。嵌套在包装器中的是我们的<block type="cms/page" name="cms_page"/>
. 这是将我们的模板工作外包给 cms/page 块类的坏小子,位于app/code/core/Mage/cms/page.php
. 从那里,基本上该类将从数据库中获取我们的 CMS 页面详细信息并将其呈现给所有人查看。
因此,简而言之,没有包含 cms 页面内容的文件,它是从数据库中提取并根据页面请求生成的。
块标记解释
块具有各种属性,我将介绍基础知识。
type="core/template"
:类型表示它是什么类型的块类。这指的是嵌套在“app/code/core/Mage/”文件夹中的文件夹(通常有例外*)。这里我们指的是app/code/core/Mage/Core/Block/Template.php
。您在此处设置的类将附加到您的模板中。这负责$this->doSomething()
在您的模板文件中大量使用。基本上,模板文件正在调用类对象来完成这项工作。在添加自定义模板文件时,“core/template”是一个很好的通用类,尽管在某些情况下您可能需要选择其他东西。
name="content"
: 在这里我们给我们的区块起一个名字。这将是块的标识名称,它用于在任何地方引用该块。<reference name="blockName">
对于 xml 引用 ( ) 和从父 phtml 模板文件 () 中调用块等内容,需要块名称<?php echo $this->getChildHtml('blockName'); ?>
。请注意,所有在没有参数 ( $this->getChildHtml('');
) 的情况下调用它的模板都意味着调用所有子块而不被显式调用。
as="content"
:这表示别名标识符。您可以使用与上述名称相同的别名。
template="page/html/callouts.phtml"
:这会设置块的模板。Magento 将寻找app/design/frontend/your_package/your_theme/template/page/html/callouts.phtml
并使用它作为块的布局。
*例外:第三方扩展通常使用app/code/community
或app/code/local
文件夹。如果您必须覆盖核心类,请将目录结构复制到本地文件夹,然后对该类的本地版本进行编辑。
类按以下顺序加载:/local/
> /community/
> /core/
。如果找到本地版本,它将首先使用该版本,然后是社区和核心,并采用找到的第一个具有该名称的类文件。
本地.xml
让我向您介绍修改布局的正确方法。local.xml
在这里,在您的目录中创建一个名为的文件app/design/frontend/your_package/your_theme/layout/
。这个文件将包含您所有的布局更新,以防止在您开始编辑基本布局时可能出现的任何冲突。此外,它将所有自定义更改保存在一个整洁的文件中。
我们将删除演示商店放入的一些并不真正需要的东西。您的布局应如下所示:
<?xml version="1.0"?>
<layout version="0.1.0">
<!-- Layout Handle -->
<default>
<!-- Block Reference -->
<reference name="left">
<!-- Remove by Reference Name -->
<remove name="left.permanent.callout"/>
</reference>
<reference name="right">
<remove name="right.permanent.callout"/>
</reference>
</default>
</layout>
那里不是很多,但这将删除左右侧栏上的标注广告。在进行布局 xml 更改时,您需要刷新缓存。
阅读我的另一个答案,了解您可以使用 local.xml 做的更多事情:
Magento Sidebar Customization
2013 年 8 月 16 日编辑:
我轻描淡写了 Magento 设计指南(我有过一次,这是很好的入门资源,但是当我第一次阅读它时,我已经了解了它所提供的一切)。它所说的后备结构是关于代码/模板/布局/皮肤/翻译文件。
要使用的包部分由您在 System->Configuration->Design 中设置。如果未找到,则返回默认值。如果 default 没有它要找的东西,它会抓取基本文件。Magento 天生就是通过设计做到这一点的。
不幸的是,我没有看到任何用于回退数据库内容的内置机制。cms内容由4个表组成,cms_block、cms_block_store、cms_page和cms_page_store。cms_block_store 和 cms_page_store 每个只包含页面/块 id 和存储 id。两个 id 都是主键。这是为了将页面/块 ID 与它所属的商店相关联。
我想您可以尝试通过让 cms 内容搜索具有商店 ID 的页面来发起对 cms 内容的回退,如果没有,则回退到来自不同商店的相同页面 ID。或者也许制作一个仅用作后备商店 ID 的“基本”商店记录。不过,我不确定如何实现其中任何一个。
供您参考,这些是 cms_block 和 cms_page 表:
cms_block 表
[block_id] //Internal Id, Auto Increments and is Primary Key
[title] //Block Title as User Defined
[identifier] //Block Identifier, also User Defined
[content] //Block Content Stored Here
[creation_time] //Date-Time the Block was Created (ex. 2013-07-22 17:21:18)
[update_time] //Date-Time the Block was Last Updated
[is_active] //Show(1) or Hide(0) Block.
cms_page 表
[page_id] //Internal Id, Auto Increment, Primary Key
[title] //Page Title
[root_template] //Template Layout (one_column, two_columns_left, etc)
[meta_keywords] //Meta Keywords
[meta_description] //Meta Description
[identifier] //User Defined Page Identifier
[content_heading] //Content Heading to be Displayed
[content] //Page Content
[creation_time] //Date-Time Page Created
[update_time] //Date-Time Page Last Updated
[is_active] //Show(1) or Hide(0) Page (0 = 404 error)
[sort_order] //Legacy(?) Page Sorting Order**
[layout_update_xml] //XML Layout Changes***
[custom_theme] //Override Page w/ Different Theme
[custom_root_template] //Override Page w/ Different Layout than Set Above
[custom_layout_update_xml] //Override Page Layout w/ Different XML***
[custom_theme_from] //Set Date to Start Overriding Page w/ Custom Layout
[custom_theme_to] //Set Date to End Overriding Page w/ Custom Layout
/*
/**I don't see anywhere to set via Admin Back-End. All mine are set to (0),
/ my best guess is it was used to sort page link order in a menu. Either
/ they removed this feature somewhere along the way or I somehow removed
/ it and forgot.
/
/***Think local.xml without the need to use the layout handle. In other words:
/ You can modify specific pages with the same xml styling as used between
/ the <default></default> tags above. Don't actually put <?xml>, <layout>
/ or <default> (the update handle) tags.
*/
这就是数据库的 cms 部分中的全部内容。
倒退
正确配置后,Magento 将按以下顺序回退:
<!-- Front End Package/Theme Template and Layout Files -->
app/design/frontend/yourPackage/yourTheme/
app/design/frontend/yourPackage/default/
app/design/frontend/default/default/
app/design/frontend/base/default/
<!-- Admin Package/Theme Template and Layout Files -->
app/design/adminhtml/yourPackage/yourTheme/
app/design/adminhtml/yourPackage/default/
app/design/adminhtml/default/default/
<!-- Front End Package/Theme Skin (JS/CSS/Images) Files -->
skin/frontend/yourPackage/yourTheme/
skin/frontend/yourPackage/default/
skin/frontend/default/default/
skin/frontend/base/default/
<!-- Admin Package/Theme Skin (JS/CSS/Images) Files -->
skin/adminhtml/yourPackage/yourTheme/
skin/adminhtml/yourPackage/default/
skin/adminhtml/default/default/
<!-- Magento Code Pool -->
app/code/local/**
app/code/community/***
app/code/core/
/*
/**Magento will, by default, only look within local folders that currently
/ exist in the core directory, community directory*** OR if an active
/ module has codePool*** set to local.
/
/***Third-Party modules have to set which codePool they are using, which
/ specifies the default working directory for that module's code.
/ This is defined in the xml located at /app/etc/modules/*. If a module
/ has its codepool set to community, you can override the extension's
/ code by copying it to local.
/*
据说“社区”代码池是由于遗留原因而存在的,并且应该进行新的扩展以仅使用“本地”。我个人不同意,每个第三方扩展使用社区代码池并保留从“本地”覆盖原始扩展代码而不修改原始代码的能力会更有意义。
好的,我想我已经完成了这个问题,因为这里的任何更多信息都会超载。如果我错过了什么,请提出一个新问题并将我链接到它;D。