2. Getting started with Shopware templating / Shopware模板入门

2.1 Introduction

本章节会通过一个实例,一步步地为开发者介绍Shopware5的模板创建。本章内容适合初学者,讲述了Shopware模板的基本创建和样式。它介绍了如何创建一个新主题,如何使用Smarty模板为Shopware主题创建 / 添加元素。

2.2 Preview of the guide / 预览

改教程主要讲述如何给网店添加新主题,如何为模板添加新元素,如何使用LESS编辑外观。
Step 1:给网店添加新主题,并选择它
Step 2:在网店的导航中添加一个按钮并添加合适的外观 ==> 使它能自适应任何设备
Step 3:为"加入购物车"按钮修修改颜色,做成渐变的样式

2.3 Bare and responsive / Bare和responsive

用户可以在根目录下的themes文件夹中看到Bare和responsive这两个默认的Shopware5主题。

  • Bare为Shopware网页前端基础。包含了网页基本结构。
  • responsive包含了Shopware5默认的响应式主题,是以Bar为基础的样式主题。

注意:不要修改这两个主题的代码,否则可能会影响到将来Shopware的升级

2.4 Custom themes / 自定义主题

2.4.1 Creating a theme with the Theme Manager / 使用主题管理器新建主题


通过Theme manager ==> Create theme可以新建主题,输入主题名(比如TutorialTheme)并且填写必要信息。它会自动在themes文件夹中创建该主题文件夹,并添加所需要的文件结构。
这样,themes文件夹中就有了一下三个主题:

  • Bare
  • Responsive
  • TutorialTheme

2.4.2 Creating a theme with the Shopware CLI tools / 通过命令行新建主题
当然,开发者也可用通过命令行用sw:theme:create语句新建主题:

sw:theme:create --description="Text" --author="shopware AG" --license="MIT" Responsive TutorialThemeDirectory TutorialTheme```
更多关于命令行的信息请点击这里:[Shopware 5 CLI commands article](https://developers.shopware.com/developers-guide/shopware-5-cli-commands/).

##2.5 Selecting themes / 选择主题
![](http://upload-images.jianshu.io/upload_images/2662224-12ece68a33767eae.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在你对自己的主题进行人和编辑之前,你需要先选择该主题。
Refresh themes ==> 点击TutorialTheme主题 ==> Select theme   完成主体的选择

##2.6 Directory structure / 目录结构
Shopware的目录结构位于Bare/Frontend下,这里的子目录都以controller命名,以不同的前段区域区分模板文件。

frontend
├── _includes
├── account
├── blog
│ └── comment
├── campaign
├── checkout
│ └── items
├── compare
├── custom
├── detail
│ ├── comment
│ └── tabs
├── error
├── forms
├── home
├── index
├── listing
│ ├── actions
│ ├── filter
│ └── product-box
├── newsletter
├── note
├── paypal
├── plugins
│ ├── compare
│ ├── index
│ ├── notification
│ ├── payment
│ └── seo
├── register
├── robots_txt
├── search
├── sitemap
├── sitemap_xml
└── tellafriend

##2.7 Template inheritance / 主题的继承
当开发者新建自定义主题时,可以选择是否继承已存在的主题。在本例中,我们选择继承`Responsive`主题。换句话来说,新建的主题是以`Responsive`为基础,而`Responsive`继承了`Bare`。

Bare => Responsive => TutorialTheme

>如果开发者想要主题拥有更多自己的特点,可以选择直接继承`Bare`。==> 自定义主题需要与`Bare`主题的文件结构相同。

举例来说,如果开发者要修改`header`,就要创建某个特定的文件路径,以重写从Responsive继承过来的`header`。`header`位于`Frontend/Index路径`下的`shop-navigation.tpl`模板中(被`index.tpl`引用 / include)==> 文件路径如下:

TutorialTheme
├── frontend
│ └── index
│ └── shop-navigation.tpl```
TutorialThemeshop-navigation.tpl模板扩展(extends)了Bare主题的shop-navigation.tpl。这里的扩展功能用函数extends实现。该函数使我们在保留Bare主题中原有元素的基础下,可以自由地对它们进行添加或重写。extends函数中文件路径为Bare主题的shop-navigation.tpl,如下:

{extends file="parent:frontend/index/shop-navigation.tpl"}```
如果我们选择使用`extends`函数,则父主题`shop-navigation.tpl`中的内容会被忽视,只有`TutorialTheme`中的`shop-navigation.tpl`会被渲染(render)。
更多关于模板继承的内容请看 [第三章的3.3.2](http://www.jianshu.com/p/465568e7a706)

##2.8 Template blocks / 模板代码块 blocks
`Bare`主题的HTML结构都被包括在Smarty的`{Block}`中。这些 block 元素将前端组件(frontend components)分割成小且独立的代码块,方便进行编辑 / 重写。想要编辑`Bare`主题下的代码,你**不能**简单的只写代码,你需要调用相对应的 block 名。
比如,开发者想要重写继承的block:

{block name='frontend_index_checkout_actions'}
// place your new element here
{/block}```
{$smarty.block.parent}变量包含了继承block的内容。我们可以使用它来添加原 block 的初始内容。
例一:在初试内容之后 添加自定义代码

{block name='frontend_index_checkout_actions'}
    {$smarty.block.parent}
    // place your new element here
{/block}

例二:在初试内容之前 添加自定义代码

{block name='frontend_index_checkout_actions'}
    // place your new element here
    {$smarty.block.parent}
{/block}

实例:为了在导航栏(navigation menu)中添加新按钮,我们需要找到对应的block,并在其中插入新元素,从而实现新按钮出现在原始内容之前 / 之后。

{extends file="parent:frontend/index/shop-navigation.tpl"}

{block name='frontend_index_checkout_actions'}
    <li class="navigation--entry">
        <a href="" class="btn starButton"> {* Add an URL to the href attribute to make your link work *}
            <i class="icon--star"></i>
        </a>
    </li>
    
    {$smarty.block.parent}
{/block}

注:导航目录放在<li>元素中

注: 推荐使用block参数appendprepend{$smarty.block.parent}使模板或插件重写同一个block而不出现bug

2.9 Add Less files /添加Less文件

我们可参照添加模板文件的方法添加less文件。文件路径要与Responsive中的相同。如下:

TutorialTheme
 ├── frontend
 │   └── index
 │      └── shop-navigation.tpl
 │   └── _public
 │      └── src
 │          └── less
 │              └── all.less```
为了添加Less文件, 首先需要创建一个`all.less`。该文件是必须的且极其重要的,它用于导入(import)用户自定义的less文件。`all.less`中,用户自定义的Less文件通过函数`@import`被导入。如果用户需要大幅度地修改网页样式,我们更推荐直接从Responsive处复制less文件到`TutorialTheme`进行改编,这样结构更加清晰。但本例中,我们只需要创建一个名为`navigation.less`的less文件:

//inside the all.less file
@import 'navigation';```
navigation.less文件中,我们为 button 添加了样式,并在 button 中间放了一个图标。
在Less文件中,开发者可以使用Shopware提供的Less的mixinsvariables(例如,unitze帮助完成px到相对单位rem的转换)

.starButton i.icon--star {
    .unitize(font-size, 18);
}

a.btn.starButton {
    .unitize(padding-top, 5);
}```
此外,我们还需要修改button的代码,使之适应移动设备。为了解决所有问题,必须减小搜索框的宽度,并在移动端时隐藏菜单文本,以避免出现元素的重叠。
为了隐藏菜单,我们在`shop-navigation.tpl`中调用`offcanvas_left_trigger`代码块,并***完全重写*** 它(不加append或prepend),新的block中没有任何文字。

{block name='frontend_index_offcanvas_left_trigger'}
<li class="navigation--entry entry--menu-left" role="menuitem">
<a class="entry--link entry--trigger btn is--icon-left" href="#offcanvas--left" data-offcanvas="true" data-offCanvasSelector=".sidebar-main">
<i class="icon--menu"></i>
</a>
</li>
{/block}

为了调整搜索框的宽度,我们要用百分比重写一些media query:

.starButton i.icon--star {
.unitize(font-size, 18);
}

a.btn.starButton {
.unitize(padding-top, 5);
}

@media screen and (min-width: 30em) {
.entry--search {
width: 30%;
}
}

最后一步,修改购物车按钮的颜色。正如之前所说,我们可以在less中使用mixins和variables。为了创建默认颜色的渐变,我们需要将`@brand-primary`, `@brand-primary-light`和`.linear-gradient` Less mixin一起使用

.starButton i.icon--star {
.unitize(font-size, 18);
}

a.btn.starButton {
.unitize(padding-top, 5);
}

@media screen and (min-width: 30em) {
.entry--search {
width: 30%;
}
}

@media screen and (min-width: 64em) {
.navigation--list .entry--cart .cart--link .cart--amount {
color: #fff;
}
}

a.btn.is--icon-left.cart--link {
.linear-gradient(@brand-primary-light, @brand-primary);
border-color: @brand-primary;
color: #fff;
}


##2.10 Result
![](http://upload-images.jianshu.io/upload_images/2662224-8a7aa83358459d97.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容