3.0主题快速开发组件

1. 安装开发工具

1.1. 安装 SHOPLINE CLI

在 Windows、macOS 上安装 SHOPLINE CLI,这里提供了 npm 和 yarn 两种安装方法进行安装。

npm install --global @shoplineos/cli

或者

yarn global add @shoplineos/cli

cli使用教程点击:backhand_index_pointing_right:使用教程查看。

1.2. 安装 3.0 开发插件

VS Code 开发者插件,点击:backhand_index_pointing_right:扩展安装包进行下载安装。详细使用教程点击:backhand_index_pointing_right:使用教程查看。

2. 获取 3.0 主题代码

2.1. 添加 3.0 主题

如想在已发布的 3.0 主题进行开发,可忽略此添加 3.0 主题步骤。
点击【在线商店】>【店铺设计】>【主题商城】。

选择需要的 3.0 主题。

添加对应的 3.0 主题。

添加完成效果:

2.2. 拉取 3.0 主题代码进行开发

桌面创建空白文件夹

进入该文件夹的终端输入以下命令,登录店铺。

sl login --store 店铺handle.myshopline.com

以下是通过此命令,登录到店铺 handle 为 zhenghaonan 的示例:


输入完命令并回车,浏览器自动跳转至登录页面。

登录完成。

再输入以下命令,显示店铺所有的主题代码。

sl theme pull

以下是通过此命令,显示 zhenghaonan 店铺所有的主题代码的示例:
如您想对已发布的主题进行开发,选择带 [live] 符号的主题。


按键盘上下健,选择对应的 3.0 主题,再按回车键即可拉取。

再输入以下命令,进行实时预览开发。

sl theme serve

以下是通过此命令返回的信息:

  1. 本地预览链接:http://127.0.0.1:8282 此链接指向你的开发主题的链接。此 URL 可以热重新加载对本地文件的更改,或在文件更改时刷新整个页面,允许你使用店铺的数据实时预览更改。无法使用此链接预览结账页。
  2. SHOPLINE 后台中主题编辑器的链接:Shopline Editor
  3. 你可以与其他开发人员共享的预览链接:https://zhenghaonan.myshopline.com/?preview=1&themeId=690978b35ad5f3fc52297292&dev_mode=1。

2.3. 查看 3.0 主题目录

├─ blocks          		# 可复用的区块
├─ components      		# 公有代码片段
├─ i18n            		# 多语言配置文件
├─ layout          		# 页面布局模板
├─ public          		# 静态资源(图片/CSS/JS/字体)
├─ sections        		# 页面组件与组件集
├─ templates       		# 页面模板
├─ theme.config.json  # 主题全局配置数据
└─ theme.schema.json  # 主题信息与主题全局配置定义

3. 开发 3.0 组件

3.1. 添加组件文件

Sections 目录下新建一个 组件名 的文件夹,新建一个同名的 .html 文件,可选择性新建 .css js 文件。

3.2. 定义组件 schema 配置

schema 是定义主题的全局控件配置、组件控件配置和区块控件配置的一套协议,可以供商家在主题编辑器中通过定义的控件来对主题进行设计。

你可以在以下对应的主题文件中添加 schema:

位置 描述
theme.schema.json 全局控件配置
sections 目录下的组件文件 组件控件配置
blocks 目录下的区块文件 区块控件配置

在组件目录同名的 .html 文件中,添加代码:backhand_index_pointing_down:

{{#component "stylesheet" src="./show-video-product.css" | asset_url() /}}    引入组件相关 CSS 文件
{{#component "script" src="./show-video-product.js" | asset_url() /}}         引入组件相关 JS 文件
<div class="text-div">
  {{section.settings.titleId}}      拿取 section 配置项的值,格式:section.settings. 配置项的id
</div>
{{#blocks}}							                渲染当前 section 下的所有子级 block
  {{#block titleId=block.settings.titleId /}}       传 Section 的控件配置项给所有子级 blocks
{{/blocks}}

**表示必填项**

{{#schema}}
{
"name": "视频推荐商品",           		name--组件名:在主题编辑器中查找并使用
"max_blocks": 1,                		max_blocks--添加区块的最大数量:该组件子级最多添加数量,删除该值则不限制
"class":"Shop-Show-Video-Product",	    class--组件 class 属性值
"icon":"icon-video", 				    icon--组件图标:该组件在主题编辑器显示的图标
"settings": [						    settings--组件控件合集:该组件所有的控件合集
    {
        "type": "text",             type--控件类型:text为文本框类型
        "id": "titleId",            id--控件Id:用于在组件内取值 Id ,Id 在 settings 内必须唯一
        "label": "标题",             label--控件标题
        "info": "请在👇填写文字",     info--控件正文
        "default": "My Blog Title"  default--控件默认值
    }
],
"blocks": [							blocks--子级区块合集:该组件所有子级区块合集
    {
        "type":"$float-video",      type--控件类型:blocks 下的 type 传"$ + 私有区块文件名",$ 为私有区块,其他 Section 不能引用
                                          同个私有区块 blocks 文件夹下的 block 可以相互引用
    },
    {
      "type": "@app"         				type--传"@app"可使用插件组件
    },
    {
      "type": "$collection"         
    },
    {
      "type": "article/date_author" type--可直接引用主题 blocks 文件夹下的公有区块
    }
],
"presets":[							presets--用于定义在可视化编辑器中,点击添加组件时,该组件的预设配置
  {												
  "name": "视频推荐商品",				name--组件名:在主题编辑器中查找并使用, presets 下的 name 重量级高于 section 下的 name
    	"settings": {               settings--预设的配置合集,控件的 default 重量级高于 presets 的预设值
      	"titleId": "My Blog Title"  格式:"该settingId":"该 setting 预设值"
      },
      "blocks": [		            	blocks--预设的区块合集
        {
          "type": "article/date_author"  type--预设的区块类型
                                         格式:"type":"该区块的 type 值"
        },
        {
          "type": "$collection",
          "settings": {				 settings--预设区块的配置合集
            "title":"商品推荐展示"     格式:"该settingId":"该 setting 预设值"
          },
          "blocks": [				 blocks--预设区块下的区块合集
                      {
                        "type": "$product-card",
                          "blocks": [
                            {
                                "type": "$image"
                            },
                            {
                                "type": "$title"
                            },
                            {
                                "type": "$price"
                            },
                            {
                                "type": "$quick_add"
                            }
                        ]       
                    }
                 ]
        }
    ]
}
]
}
{{/schema}}

type – 3.0 控件类型 :backhand_index_pointing_right: 3.0 编辑器控件类型库

icon – 3.0 组件图标 :backhand_index_pointing_right: 3.0 编辑器组件图标库

Sline – 3.0 语法教程:backhand_index_pointing_right:3.0Sline语法详细教程

3.0 组件中的区块block只支持创建私有区块及公有区块

暂不支持如 3.0 以下主题,在 Section 中直接创建

3.3. 在 Section / Block 中对子级 blocks 进行处理:

3.3.1. 渲染当前 section / block 下的所有子级 block

{{#content "blocks" /}}
{{#blocks}}
	{{#block /}}
{{/blocks}}

3.3.2. Section / Block 传值给子级 blocks

:one: 传 Section 的控件配置项/特定的值给子级 blocks

{{#blocks}}
	  {{#block video=section.settings.titleId isBigBox=true /}}
{{/blocks}}

格式:

{{#blocks}}

{{#block 自定义传值名称=section.settings.控件id /}}

{{/blocks}}

:two: 传 Block 的控件配置项/特定的值给子级 blocks

{{#blocks}}
	  {{#block video=block.settings.titleId isBigBox=true /}}
{{/blocks}}

格式:

{{#blocks}}

{{#block 自定义传值名称=block.settings.控件id /}}

{{/blocks}}

:three: 传 Section / Block 中定义的变量给子级 blocks

{{#var isBox /}}        					
{{#set isBox = true /}}	  				
{{#blocks}}
    {{#block isBigBox=isBox /}}
{{/blocks}}

格式:

{{#var 变量名 /}} 定义变量

{{#set 变量名 = 变量值 /}} 赋值变量

{{#blocks}}

{{#block 自定义传值名称=变量名 /}} 使用变量

{{/blocks}}

:four: 子级 Block 接收 Section / 父级 Block 的值

{{ props.isBigBox }}

格式:

{{ props.自定义传值名称 }}

3.3.3. Section / Block 拿取子级 blocks 的值

{{#blocks}}
{{ forblock.settings.poster_image /}}
{{/blocks}}

格式:

{{#blocks}}

{{ forblock.settings.block配置项的控件Id /}}

{{/blocks}}

3.3.4. 特定区域引用特定的 blocks

在特定区域只显示私有区块 float-video

{{#blocks}}
  {{#if forblock.type == "$float-video" }}
    {{#block /}}
  {{/if}}
{{/blocks}}

可结合 section 传值给 blocks 一起使用

section 传入的值仅对指定 forblock.type 有效,其他区块接收不到

{{#blocks}}
  {{#if forblock.type == "$float-video" }}
    {{#block video=section.settings.video isBigBox=true /}}
  {{/if}}
{{/blocks}}

同一 Section 下,同一区块 block 在不同地方引用,相同自定义传值名称可传不同的值,显示不同效果。

<div class="show-video-product-main-box-one">
  {{#blocks}}
      {{#if forblock.type == "$float-video" }}
         {{#block video=section.settings.video isBigBox=false /}}
      {{/if}}
  {{/blocks}}
</div>
<div class="show-video-product-main-box-two">
  {{#blocks}}
      {{#if forblock.type == "$float-video" }}
         {{#block video=section.settings.video isBigBox=true /}}
      {{/if}}
  {{/blocks}}
</div>
{{#if props.isBigBox }}
   {{#video_tag block.settings.video class="show-video-product-video-one" /}}
{{#else/}}
   {{#video_tag block.settings.video class="show-video-product-video-two" /}}
{{/if}}

3.4. 创建私有区块

组件名 的目录下,新建一个名为"blocks "文件夹, blocks 私有区块文件夹下新建私有区块的 html css js 文件。

私有区块之间不能相互引用,可引用公有区块。

{{#component "stylesheet" src="./show-video-product.css" | asset_url() /}}    引入组件相关 CSS 文件
{{#component "script" src="./show-video-product.js" | asset_url() /}}         引入组件相关 JS 文件
<div class="text-div">
  {{block.settings.richtext}}      	拿取 block 配置项的值,格式:block.settings.配置项的id
</div>
{{#content "blocks" /}}             渲染当前 block 下的所有子 block
{{ props.titleId }}									子级 Block 接收 Section /父级 Block 的值
      表示必填项
{{#schema}}
{
    "name": "商品推荐展示",						name--组件名:在主题编辑器中查找并使用
    "tag":"",												tag--外层元素代码:不写 tag 字段默认个 div 包裹,tag 传空值则去除默认父级元素,
                                                     传 button ,则父级元素为 <button> </button>                 
    "limit": 1											limit--可添加个数:该区块最多使用数量,删除该值则不限制
    "settings": [										settings--组件控件合集:该组件所有的控件合集
        {
            "type": "richtext",			type--控件类型:richtext 为富文本框类型
            "id": "richtext",				id--控件Id:用于在组件内取值 Id,Id 在 settings 内必须唯一
            "label": "商品列表标题"		label--控件标题
        }
    ],
    "blocks": [											blocks--子级组件合集:该组件所有子级组件合集
        {
            "type":"$product-card", type--控件类型:blocks 下的 type 传"$ + 私有区块文件名",$ 为私有区块,其他 Section 不能引用
                                                  同个私有区块 blocks 文件夹下的 block 可以相互引用
        }
    ],
    "presets": [										presets--用于定义在可视化编辑器中,点击添加组件时,该组件的预设配置
        {
            "blocks": [							blocks--预设的区块合集
                {
                    "type": "$product-card", type--预设的区块类型
                                             格式:"type":"该区块的 type 值"
                    "blocks": [							 blocks--预设区块下的区块合集
                        {
                            "type": "$image"
                        },
                        {
                            "type": "$title"
                        },
                        {
                            "type": "$price"
                        },
                        {
                            "type": "$quick_add"
                        }
                    ]
                }
            ]
        }
    ]
}
{{/schema}}

3.5. 创建公有区块

在 blocks 目录下新建一个 组件名 的文件夹,组件名 文件夹下新增 组件名html 文件,可选择性新建 css js 文件/直接新增 组件名html 文件。

公有区块之间可相互引用,不能引用私有区块。

{{#component "stylesheet" src="./show-video-product.css" | asset_url() /}}    引入组件相关 CSS 文件
{{#component "script" src="./show-video-product.js" | asset_url() /}}         引入组件相关 JS 文件
<div class="text-div">
  {{block.settings.richtext}}      	拿取 block 配置项的值,格式:block.settings.配置项的id
</div>
{{#content "blocks" /}}             渲染当前 block 下的所有子 block
{{ props.titleId }}									子级 Block 接收 Section / 父级 Block 的值
      表示必填项
{{#schema}}
{
    "name": "商品图文展示",						name--组件名:在主题编辑器中查找并使用
    "tag":"",												tag--外层元素代码:不写 tag 字段默认个div包裹,tag 传空值则去除默认父级元素,
                                                     传 button ,则父级元素为 <button> </button>                 
    "limit": 1											limit--可添加个数:该区块最多使用数量,删除该值则不限制
    "settings": [										settings--组件控件合集:该组件所有的控件合集
        {
            "type": "richtext",			type--控件类型:richtext 为富文本框类型
            "id": "richtext",				id--控件Id:用于在组件内取值 Id ,Id 在 settings 内必须唯一
            "label": "商品正文"			label--控件标题
        }
    ],
    "blocks": [											blocks--子级组件合集:该组件所有子级组件合集
        {
            "type":"image/image", 	type--控件类型:image / image 为引用公有区块,image 文件夹下的 image.html 文件
        }
    ],
    "presets": [										presets--用于定义在可视化编辑器中,点击添加组件时,该组件的预设配置
        {
            "blocks": [							blocks--预设的区块合集
                {
                    "type": "image/image",   type--预设的区块类型,格式:"type":"该区块的 type 值"
                }
            ]
        }
    ]
}
{{/schema}}

显示效果: