// 1. mac安装程序
brew tap shopify
brew install themekit // 类似于 node.js
// 2. 注册shopify
// 3. shopify设置成中文
==> 后台页面左下角设置 ==> store language ==> 当前语言设置成简体中文
// 4. 设置专用应用
应用-创建专有应用 ==> 权限 ==> 选择模版(允许读取和写入)
// 4. 下载主题
// 5。 添加主题,
将准备好的主题压缩成zip文件 ==> 目录:在线商店-模版-添加模版 ==> 添加成功后在操作中发布
// 6. vscode准备
打开解压好的主题 ==>
在页面中创建 config.yml文件,内容如下 :
development:
password: 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
theme_id: "124534685867"
store: shy-boys.myshopify.com
//说明 : 密码位置 : shopify后台==> 应用 ==》 管理专有应用 ==> 点开专有应用名称 ==> 找到密码
// theme_id 位置 : shopify后台 ==> 在线商店 ==> 模版 ==> 自定义 ==> url上的数字就是主题id
// store :当前url的链接, 不要http, 内容如上
// 7. 命令启动本地和远程连接
// theme get 拉取shopify店铺主题最新代码
// theme watch --allow-live 动态监听代码变更及上传
// 说明 :当在后台手动修改了配置后, 本地需要更新代码使用 theme get来获取最新的代码
// 当本地修改了代码, 代码会自动提交到远程, 不需要像git一样进行远程push
和vue结构一样, 存放一些静态文件的地方, 比如img, 字体图标, 公共js, js插件等
当前保存的主题配置
当前已经选好的所有数据,最好不要动这里
“current”: 当前已选择了的所有 sections
“presets”: 能在 Add section 目录中看到的预设的 section
列出全局主题设置, 注意是全局的, 使用 settings.xxxx来获取设置的值
默认下是theme.liquid, 类似于vue中的html文件
可复用模块, 说简单点就是组件存放的地方(普通组件)
注意事项 :
{%- section 'prime-banner' -%}
小模块,比section更小的模块, 通常是静态的
导入使用 include或者reder,用法如sections
路由模块
通过 page.xxxx.liquid的文件命名格式就可以作为shopify的后面页面开使用
本地开发与远程数据修改的桥梁
学习地址 : https://liquid.bootcss.com/filters/escape/
总结 :是一门不太好用的语言
// 单行
{%- assign natural_height = false -%}
// 内容内为变量
{% capture my_variable %}I am being captured.{% endcapture %}
// 多行
{% liquid
assign product_img = block.settings.top_products_img
assign product_sale_percent = product_price_sale | divided_by: product_price_virtual | times: 100 | minus: 100 | abs | round | append: '%'
%}
== 相等
!= 不相等
大于
< 小于
= 大于或等于
<= 小于或等于
or 逻辑或
and 逻辑与
{% if product.type == "Shirt" or product.type == "Shoes" %}
This is a shirt or a pair of shoes.
{% endif %}
// contains 包含
{% if product.title contains 'Pack' %}
This product's title contains the word Pack.
{% endif %}
// if/else
{% assign username = "John G. Chalmers-Smith" %}
{% if username and username.size > 10 %}
Wow, {{ username }}, you have a long name!
{% else %}
Hello there!
{% endif %}
input :
{% for product in collections.frontpage.products %}
{% if forloop.first == true %}
First time through!
{% else %}
Not the first time.
{% endif %}
{% endfor %}
output :
First time through!
Not the first time.
Not the first time.
Not the first time.
Not the first time.
input :
{% for product in collections.frontpage.products %}
{{ forloop.index }}
{% else %}
// no products in your frontpage collection
{% endfor %}
output :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
- index0
```javascript
input :
{% for product in collections.frontpage.products %}
{{ forloop.index0 }}
{% endfor %}
output :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- last
```javascript
input :
{% for product in collections.frontpage.products %}
{% if forloop.last == true %}
This is the last iteration!
{% else %}
Keep going...
{% endif %}
{% endfor %}
output :
Keep going...
Keep going...
Keep going...
Keep going...
Keep going...
This is the last iteration!
- length
```javascript
input :
<!-- if collections.frontpage.products contains 4 products -->
{% for product in collections.frontpage.products %}
{% if forloop.first %}
<p>This collection has {{ forloop.length }} products:</p>
{% endif %}
<p>{{ product.title }}</p>
{% endfor %}
output :
This collection has 4 products:
Apple
Orange
Peach
Plum
- rindex0
```javascript
input :
{% for product in collections.frontpage.products %}
{{ forloop.rindex0 }}
{% endfor %}
output :
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
<div class="prime_day">
{%- section 'prime-banner' -%}
{%- section 'prime-top-products' -%}
{%- section 'prime-featured-products' -%}
</div>
<style>
.prime_day [data-animate_images=true] .lazyload {
opacity:0
}
.prime_day [data-animate_images=true] .lazyloaded {
opacity:1;
animation:0.5s cubic-bezier(0.26, 0.54, 0.32, 1) 0s forwards;
animation-name:zoom-fade-small;
transition:none;
}
.prime_day [data-animate_text=true] {
opacity: 0;
}
.prime_day .lazyloaded [data-animate_text=true]{
opacity: 1;
animation: 0.8s cubic-bezier(0.26, 0.54, 0.32, 1) 0.3s forwards;
animation-name: rise-up;
}
</style>
{% for block in section.blocks %}
{% liquid
assign product_img = block.settings.top_products_img
assign product_img_mobile = block.settings.top_products_img_mobile
assign product_image = block.settings.top_products_image
assign product_image_mobile = block.settings.top_products_image_mobile
assign voice_control = block.settings.assistantable
assign product_title = block.settings.top_products_title
assign product_sub_title = block.settings.top_products_sub_title
assign product_price_sale = block.settings.top_products_price_sale
assign product_price_virtual = block.settings.top_products_price_virtual
assign product_url = block.settings.top_products_url
assign product_sale_percent = product_price_sale | divided_by: product_price_virtual | times: 100 | minus: 100 | abs | round | append: '%'
%}
<a href="{{ product_url }}" target="_blank" rel="nofollow" class="top_product_wrap">
</a>
{% endfor %}
{% liquid
assign discount_bg = 'https://cdn.shopifycdn.net/s/files/1/0556/4203/0246/files/265_2x_1e877f82-e25a-45de-863d-fce15adeda91.png?v=1623512350'
assign voice_bg = 'https://cdn.shopifycdn.net/s/files/1/0556/4203/0246/files/195_2x_831e54fd-1076-47c0-a70d-2e9768ba9b44.png?v=1623512350'
assign star_bg = 'https://cdn.shopifycdn.net/s/files/1/0556/4203/0246/files/27_2x_f8989dcf-e752-4200-af30-532a69d4aa9a.jpg?v=1623514323'
assign header = section.settings.top_header
%}
image
<img data-src="{{ product_image | img_url: 'master' }}" alt="{{ product_image.alt }}" class="lazyload mobile-hide">
checkbox
<div class="top_voice_wrap {% unless voice_control %} hide {% endunless %}">
<img src="{{ voice_bg }}" alt="" class="lazyload">
</div>
range
select
{%- if section.settings.section_height == 'natural' or section.settings.mobile_height == 'auto' -%}
{%- endif -%}
textarea
url
<a href="{{ product_url }}" target="_blank" rel="nofollow" class="top_product_wrap">
</a>
{
"name": "Slideshow",
"class": "index-section--hero",
"max_blocks": 5,
"settings": [
{
"type": "select",
"id": "section_height",
"label": "Desktop height",
"default": "650px",
"options": [
{
"label": "Natural",
"value": "natural"
},
{
"label": "450px",
"value": "450px"
},
{
"label": "550px",
"value": "550px"
},
{
"label": "650px",
"value": "650px"
},
{
"label": "750px",
"value": "750px"
},
{
"label": "Full screen",
"value": "100vh"
}
]
},
{
"type": "select",
"id": "mobile_height",
"label": "Mobile height",
"default": "auto",
"options": [
{
"label": "Auto",
"value": "auto"
},
{
"label": "250px",
"value": "250px"
},
{
"label": "300px",
"value": "300px"
},
{
"label": "400px",
"value": "400px"
},
{
"label": "500px",
"value": "500px"
},
{
"label": "Full screen",
"value": "100vh"
}
]
},
{
"type": "checkbox",
"id": "parallax",
"label": "Enable parallax",
"default": true
},
{
"type": "select",
"id": "style",
"label": "Slide navigation style",
"default": "minimal",
"options": [
{
"value": "minimal",
"label": "Minimal"
},
{
"value": "arrows",
"label": "Arrows"
},
{
"value": "dots",
"label": "Dots"
}
]
},
{
"type": "checkbox",
"id": "autoplay",
"label": "Auto-change slides",
"default": true
},
{
"type": "range",
"id": "autoplay_speed",
"label": "Change images every",
"default": 7,
"min": 5,
"max": 10,
"step": 1,
"unit": "s"
}
],
"blocks": [
{
"type": "image",
"name": "Slide",
"settings": [
{
"type": "checkbox",
"id": "sign_form_valiable",
"label": "Append Sign Up Form",
"default": false
},
{
"type": "textarea",
"id": "title",
"label": "Heading",
"default": "Two line\nslide title."
},
{
"type": "range",
"id": "title_size",
"label": "Heading text size",
"default": 80,
"min": 40,
"max": 100,
"unit": "px"
},
{
"type": "text",
"id": "subheading",
"label": "Subheading",
"default": "And an optional subheading"
},
{
"type": "url",
"id": "link",
"label": "Slide link"
},
{
"type": "text",
"id": "link_text",
"label": "Slide link text",
"default": "Optional button"
},
{
"type": "select",
"id": "text_align",
"label": "Text alignment",
"default": "vertical-bottom horizontal-left",
"options": [
{
"value": "vertical-center horizontal-left",
"label": "Center left"
},
{
"value": "vertical-center horizontal-center",
"label": "Center"
},
{
"value": "vertical-center horizontal-right",
"label": "Center right"
},
{
"value": "vertical-bottom horizontal-left",
"label": "Bottom left"
},
{
"value": "vertical-bottom horizontal-center",
"label": "Bottom center"
},
{
"value": "vertical-bottom horizontal-right",
"label": "Bottom right"
}
]
},
{
"type": "image_picker",
"id": "image",
"label": "Image"
},
{
"type": "image_picker",
"id": "image_mobile",
"label": "Mobile image"
},
{
"type": "range",
"id": "overlay_opacity",
"label": "Text protection",
"info": "Darkens your image to ensure your text is readable",
"default": 0,
"min": 0,
"max": 100,
"step": 2,
"unit": "%"
},
{
"type": "select",
"id": "focal_point",
"label": "Image focal point",
"info": "Used to keep the subject of your photo in view.",
"default": "center center",
"options": [
{
"value": "20% 0",
"label": "Top left"
},
{
"value": "top center",
"label": "Top center"
},
{
"value": "80% 0",
"label": "Top right"
},
{
"value": "20% 50%",
"label": "Left"
},
{
"value": "center center",
"label": "Center"
},
{
"value": "80% 50%",
"label": "Right"
},
{
"value": "20% 100%",
"label": "Bottom left"
},
{
"value": "bottom center",
"label": "Bottom center"
},
{
"value": "80% 100%",
"label": "Bottom right"
}
]
}
]
}
],
"presets": [{
"name": "Slideshow",
"category": "Image",
"settings": {
"autoplay": true,
"autoplay_speed": 5
},
"blocks": [
{
"type": "image",
"settings": {
"title": "Endless\npossibilities.",
"subheading": "Bring your brand to life"
}
},
{
"type": "image",
"settings": {
"title": "Two line\nslide titles.",
"subheading": "And big, beautiful imagery"
}
}
]
}]
}