0

我知道以前有人问过这个问题,但我似乎在绕圈子

在 magento 文件结构中,HTML 文件显示了 Anashrias 凉鞋(以及 Magento 夏末特卖等)。

我已将示例应用程序安装到 Magento CE V1.7.0.2

我可以在 CMS->Pages->Home Page->2 Columns with Left Bar 下看到 Magento/Admin 中的定义,但我想知道整个文件系统。PHTML 指定了熟悉的 echo $this->getChildHtml('content')

但我似乎找不到任何“内容”可以解决显示 Anashrias 优雅的脚和凉鞋

Content.phtml 只是陈述

获取页面内容();?>

啊啊啊啊

即使打开调试也会在每个块周围添加红色虚线,除了内容页面

可悲的是,那些精心修剪的脚趾必须离开

...但是如何

4

1 回答 1

0

我只是想发表评论,但要彻底解释,我需要更多空间;)

要直接回答您的评论,您看到的内容不一定在某个文件中,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/communityapp/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。

于 2013-08-14T23:16:25.853 回答