shopfiy 的 product 在添加产品时,如果要将产品详情页面与购物车关联,就是在详情页里面直接下单,而不是从详情页通过点击购买按钮,跳到 shopfy stroe ,再从这个位置再跳转到下单页。为了改变这种不停的跳转,且如果网络不好的情况下,很容易流失客户。

操作方法可以简单描述成这样:先在 Product 中添加一个产品模板,在当前产品模板中,关联 Product template 中的 自定义模板,这个自定义模板来自 Online Store 的 Templates:

建立自义定义模板:product.customize.liquid

//这个自定义模板包含通用的产品模板页中的内容,主要是通用的css / js / 布局以及购物车相关的代码块

<link rel="prefetch prerender stylesheet" type="text/css" href="{{ 'swiper.css' | asset_url }}"/>
<link rel="prefetch prerender stylesheet" type="text/css" href="{{ 'bolt.css' | asset_url "}}" />
<link rel="prefetch prerender stylesheet" type="text/css" href="{{ 'ulbolt-font.css' | asset_url }}"/>
<!--ubolt-pro-animation-->
<link rel="prefetch prerender stylesheet" type="text/css" href="{{ 'ubolt-pro-animation.css' | asset_url }}"/>
<link rel="prefetch prerender stylesheet" type="text/css" href="{{ 'bolt.css' | asset_url "}}" />
<script>
$(function() {
$(".opendivbtn").click(function() {
$(".opendiv.video iframe").attr("src", $(this).attr("href"));
$(".opendiv.video,.opendivmask").addClass("active");
return false;
});
$(".opendivmask").click(function() {
$(".opendiv.video iframe").attr("src", "");
$(".opendiv.video,.opendivmask").removeClass("active");
});
$(".ul3_feature_new_1").hover(function() {
$(this)
.children(".compare.compareshow")
.toggleClass("hover");
});
$(".compareshow").click(function() {
$(".opendiv.comparedivwrap,.opendivmask").addClass("active");
$("html,body").css("overflow", "hidden");
});
$(".opendivmask").click(function() {
$(".opendiv,.opendivmask").removeClass("active");
$("html,body").css("overflow", "auto");
});
$(".opendiv .closediv").click(function() {
$(".opendivmask").trigger("click");
});
});
</script> <!-- 通过 assign 定义的这个变量是获取当前产品已经选中的默认属性值,比如购物车中默认选中的第一个属性:颜色,大小,材质等 -->
{% assign selectedVariant = product.selected_or_first_available_variant | default: product %}
//通用的 video 弹层
<div class="opendiv video">
<div class="fluid-width-video-wrapper">
<iframe src="" frameborder="0" allowfullscreen=""></iframe>
</div>
</div>
<div class="opendivmask"></div>
//这是通用描述插入方法
{% if product.description.size > 0 %}
<div class="product-description rte" itemprop="description">
{{ product.description }}
</div>
{% endif %}
//通用的 产品价格插入,这样写的目的是如果 shopfiy 的后台将该产品改掉后,详情页也会一起改掉
//product.compare_at_price 原价
//product.price 售价
//需要了解 shopfiy 模板语言的使用方法 {{ 变量名称 | 变量单位 }}
<script>
jQuery(function(){
jQuery('.insertPrice .sellingPrice').text("{{ product.price | money }}");
{% if product.compare_at_price > product.price %}
jQuery('.insertPrice .remove-line').removeClass("remove-line");
jQuery('.insertPrice .originalPrice').text("{{ product.compare_at_price | money }}");
{% endif %}
});
</script> //产品购物车内容是以 json 格式存在的,不同产品,json 内容不同,而购物车的json是根据 id="product-json" 进行关联的,而 购物车的 json 名称定义为 buyingOptions,为数组
<script>
window.productJSON = {{ product | json }};
</script>
<script type="application/json" id="product-json"> </script> //下面这个方法,是调取不同产品详情页定义的关于购物车的 json
<script>
var productCart = {
title: {{ product.title | json }},
buyingOptions: []
};

if (productOption) {
jQuery.each(productOption, function(i, row){
if(row.colorOptions){
var colorOptions = [];
jQuery.each(row.colorOptions, function(j, col){
var _option = {
colorOptionName: col.colorOptionName,
color: col.color,
imageUrl: col.imageUrl,
variant: window.productJSON.variants[col.id]
};
colorOptions.push(_option);
});
} var buyingOptions = {
buyingOptionName: row.buyingOptionName,
colorOptions: colorOptions
}; productCart.buyingOptions.push(buyingOptions)
});
}
//购物车内容关联的 id 为 product-json,这个很重要
var productElement = document.getElementById("product-json");
productElement.innerHTML = JSON.stringify({product:productCart});
</script>

关联自义定义模板:product.customize.liquid

在 product 中新建一个产品,在它的 Description 的 代码块中添加 productOption 相关内容以及产品页面布局

//这个代码块中的 productOption 的内容都是写死的,是根据销售自己定义的不同名称(buyingOptionName),但是 colorOptions 的内容是根据 Variants 中设置的颜色来定义的:
//通过查看 Variants 中设置好的颜色 4个, 可以自定义 名称为 BBkey 可以关联前两种颜色,而名称为 BBkey + wifi 可以关联后两种颜色
//每种颜色可以定义它的 id / colorOptionName / color / imageUrl
<script>// <![CDATA[
var productOption = [
{
"buyingOptionName": "BBkey",
"colorOptions":
[
{
"id":0,
"colorOptionName": "White",
"color": "#b5b6b5",
"imageUrl": "https://cdn.shopify.com/s/files/1/0795/7689/products/2_grande.jpg?v=1552017922"
},
{
"id":1,
"colorOptionName": "Black",
"color": "#000000",
"imageUrl": "https://cdn.shopify.com/s/files/1/0795/7689/products/2_grande.jpg?v=1552017922"
}
]
},
{
"buyingOptionName": "BBkey + wifi",
"colorOptions":
[
{
"id":2,
"colorOptionName": "White",
"color": "#b5b6b5",
"imageUrl": "https://cdn.shopify.com/s/files/1/0795/7689/products/2_grande.jpg?v=1552017922"
},
{
"id":3,
"colorOptionName": "Black",
"color": "#000000",
"imageUrl": "https://cdn.shopify.com/s/files/1/0795/7689/products/2_grande.jpg?v=1552017922"
}
]
}
]
// ]]></script>

Variants设置产品属性及不同价格

通过以上的关联与操作,就可以在当前产品的详情页中点击购买按钮,会有一个下面这样的弹层出现,可以直接添加购物车进行购买。

附shopfiy 相关教程供参考:

Liquid 文档: https://liquid.bootcss.com/
shopfiy 中文文档: https://help.shopify.com/zh-CN
 
{% assign product = all_products['bbk'] %}

{% assign selectedVariant = product.selected_or_first_available_variant | default: product %}

//selectedVariant  默认选中的第一个产品属性,比如默认选择为 黑色

//从 all_products 中获取 combo 的名称并赋值给变量 product,每个产品都必须获取对应的产品名称,用这个产品名称来获取以下几种数据:
1. 不同产品对应的售价与原价
2. 不同产品对应的 selectedVariant ,选择到购物车的产品属性列表 相关属性为:
"title": {{ product.title | json }},
"price": {{ product.price | money }},
"compare_at_price": {{product.compare_at_price | money}}

获取Liquid对象的属性

{{ pages.about-us.content }}
{{ pages["about-us"].title }}

标记符

{% ... %}
{% for i in (1..5) %}
{% if i == 4 %}
{% break %}
{% else %}
{{ i }}
{% endif %}
{% endfor %}

用于插入某片段,使用with赋值,使用 include

例如有一片段 color.liquid
color: '{{ color }}' shape: '{{ shape }}' 将 color.liquid 插入到 theme.liquid 中
{% include 'color' %}
{% include 'color' with 'red' %}
{% include 'color' with 'blue' %}
Cart 对象属性:
* cart.total_discount
* cart.original_total_price 订单商品属性:
* line_item.discounts
* line_item.message
* line_item.original_price
* line_item.original_line_price
* line_item.total_discount * line_item.total_discount 返回已应用于订单商品的折扣金额
* line_item.original_line_price 返回应用折扣前的订单项目价格
* line_item.message 返回用于描述应用于订单项目的折扣的消息。
shopfiy Ajax Api
所有请求网址都是以 js 结尾

使用 shopfiy 模板语言,创建产品模板以搭配购物车实现一键购买的更多相关文章

  1. Django之模板语言

    一.模板语言介绍 模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数 二.模板语言的语法 模板中也有自己的语言,该语言可以实现数据展示 # 业务请求处理做的页面 ...

  2. [Python自学] Flask框架 (1) (Flask介绍、配置、Session、路由、请求和响应、Jinjia2模板语言、视图装饰器)

    oldboy:s9day114 参考博客:https://www.cnblogs.com/wupeiqi/articles/7552008.html 一.Flask简介 1.安装Flask pip i ...

  3. 模板语言变量,js变量,js自执行函数之前嵌套调用

    1.模板语言变量 前端html页面中展示 {{ nodeIp }} 2.js变量引用模板语言变量 把模板语言变量传递给js,js去执行页面操作(变量的转换,只适用于字符串) var IP = &quo ...

  4. (9)模板层 - templates(模板语言、语法、取值、过滤器、变量的使用)

    django的模板语言:DTL 模板语言的变量传入 这个是标签 {{ 变量名 }} {{ 变量名 }}   #模板语言的替换可以在模板中的任意位置生效 PS:通过 . 可以做深度查询 模板语言的过滤器 ...

  5. tornado 路由、模板语言、session

    一:tornado路由系统: 1.面向资源编程: 场景:当我们给别人提供api的时候,往往提供url.比如:电影票api: http://movie.jd.com/book_ticket:预订电影票. ...

  6. Django 模板语言 变量名称

    Django 模板语言 变量名称 模板语言中已变量形式显示 # view 文件内 def func(request): return render(request,"index.html&q ...

  7. django框架基础-django模板语言-长期维护

    ##################     常用的模板语言       ####################### # django的模板语言, # # 只需要记两种特殊符号: # # {{ } ...

  8. Django(十五)模板详解:模板标签、过滤器、模板注释、模板继承、html转义

    一.模板的基础配置及使用 [参考]https://docs.djangoproject.com/zh-hans/3.0/topics/templates/ 作为Web框架,Django提供了模板,用于 ...

  9. url路由、模板语言、ajax、用django框架创建表

    1.后台管理的左侧菜单,默认只有第一个页签下面的选项是显示的,点了别的页签再显示别的页签下面的选项,问题是:点了任何菜单的选项后,左侧菜单又成了第一个页签的选项显示,别的页签隐藏,也就是左侧的菜单刷新 ...

随机推荐

  1. 031.[转] 从类状态看Java多线程安全并发

    从类状态看Java多线程安全并发 pphh发布于2018年9月16日 对于Java开发人员来说,i++的并发不安全是人所共知,但是它真的有那么不安全么? 在开发Java代码时,如何能够避免多线程并发出 ...

  2. 8. java 面向对象

    一.面向对象特征 1. 封装 方法就是一种封装 关键字private也是一种封装 封装就是讲一些逻辑细节信息隐藏起来,对于外界不可见:外界只需调用我即可: 一旦使用了private进行修饰,那么本类当 ...

  3. WinFrom和WebFrom的区别

    原文链接:https://blog.csdn.net/sloder/article/details/6145169 一是Winform的定位机制没有Webform丰富,web里有table,div(浮 ...

  4. 16.输入密码查看 flag

    直接进行burpsuite 的 intruder 爆破模块进行爆破, 得到密码为 13579. 输入进去得到flag

  5. SQL查询--内连接、外连接、自连接查询

    先创建2个表:学生表和教师表   1.内连接: 在每个表中找出符合条件的共有记录.[x inner join y on...] 第一种写法:只用where SELECT t.TEACHER_NAME, ...

  6. 《转》sql处理百万级以上的数据提高查询速度的方法

    处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考 ...

  7. sqoop的详细使用及原理

    转自:https://blog.csdn.net/zhusiqing6/article/details/95680185 1.sqoop简介sqoop是一个用来将hadoop中hdfs和关系型数据库中 ...

  8. SpringBoot系列之配置文件加载位置

    SpringBoot系列之配置文件加载位置 SpringBoot启动会自动扫描如下位置的application.properties或者application.yml文件作为Springboot的默认 ...

  9. Ansible快速开始-指挥集群

    Ansible可以集中地控制多个节点,批量地执行ssh命令.由于其使用ssh进行操作,因此远端服务器除了安装openssh-server(一般服务器已经内置)之外,不需要安装额外的软件,因此使用非常简 ...

  10. 最全各种系统版本的XPosed框架资料下载整理

    由于XPosed在不同安卓系统版本中对应的版本不同,给很多新手造成极大困扰,本文作者经过几番努力,给大家整理了各个版本对应的xposed框架版本以及相关资料,并附上相关下载链接,希望对大伙有所帮助. ...