配置
为卡片加载数据
将卡片对象传入 Booking 配置的 data 数组。有关完整的数据格式和加载方案,请参阅加载数据指南。
定义卡片结构
每张卡片的左侧显示一组固定的数据字段。要控制显示哪些字段或完全替换默认布局,请使用以下属性之一:
cardShape— 切换默认字段的可见性cardTemplate— 用自定义 HTML 替换默认布局
cardTemplate 属性通过自定义 HTML 完全自定义卡片外观,可全面控制布局、设计和内容。cardShape 属性仅隐藏或显示默认模板中的字段。如果同时使用两者,cardTemplate 会覆盖 cardShape 的设置。
切换默认卡片字段
卡片左侧默认显示以下字段:
preview— 卡片图片review— 评分信息,包含星级数(满分五星)和评价数量category— 类别名称(例如,专家的职位)title— 卡片标题(例如,专家姓名)subtitle— 卡片副标题(例如,经验详情)price— 服务价格details— 卡片的其他详情
要隐藏某个字段,将 cardShape 属性中对应的参数设置为 false。
以下示例隐藏卡片的 details 字段:
const data = [
{
id: "ee828b5d-a034-420c-889b-978840015d6a",
title: "Natalie Tyson",
category: "Allergist",
subtitle: "2 years of experience",
details: "Lexington Avenue 54\nWheatfields, Hungary",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "27 $",
review: {
stars: 4,
count: 120
},
slots: [
{
from: 9,
to: 21
}
]
}
];
const cardShape = {
details: false
};
new booking.Booking("#root", {
data,
cardShape,
// 其他参数
});
请在代码片段工具中查看示例。
应用自定义卡片模板
cardTemplate 属性将卡片左侧默认区块替换为自定义 HTML。
创建一个接收卡片对象并返回 HTML 字符串的函数,将卡片条目属性组织到带有自定义样式的 HTML 块中。
以下代码片段定义了 cardPreviewTemplate,返回包含预览图片、类别、标题和价格的卡片 HTML:
<style>
.custom-preview {
display: flex;
width: 100%;
height: 100%;
gap: 30px;
}
.preview-left {
width: auto;
display: flex;
flex-direction: column;
gap: 4px;
}
/* 其他样式 */
</style>
<script>
const { Booking, template } = booking;
function cardPreviewTemplate({ item }) {
return `
<div class="custom-preview" data-action="preview-click">
<div class="preview-left">
<div
style="background-image: url(${item.preview})"
class="card-photo"
></div>
<!-- <div class="card-photo-empty" /> -->
</div>
<div class="preview-right">
<div class="category">${item.category}</div>
<div class="title">${item.title}</div>
<div class="price">${item.price}</div>
</div>
</div>
`;
}
</script>
导入 template 辅助函数,并将自定义函数赋值给 cardTemplate 属性。
以下代码片段将 cardPreviewTemplate 接入 Booking 配置:
const { Booking, template } = booking;
const widget = new Booking("#root", {
data,
cardTemplate: template(cardPreviewTemplate),
// 其他参数
});
请在代码片段工具中查看示例。
为卡片填充时间段
时间段(slot)是可供预约的时间单元。widget 从当前日期或过滤器中选定的起始日期开始,显示六天内的可用时间段(窄屏显示四天)。
添加预约时间段
要为卡片添加预约时间段,请在 data 属性的 slots 数组中添加一个对象。
以下示例为周二和周五的 12:00 至 18:00 添加时间段,每个时间段持续 30 分钟,时间段之间间隔 10 分钟:
const data = [
{
id: "5cf364d8-9997-4d8c-9586-48f90f3cb736",
title: "Natalie Tyson",
category: "Therapist",
subtitle: "2 years of experience",
details: "Cleveland Clinic\n9500 Euclid Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "37 $",
review: {
stars: 1,
count: 40
},
slots: [
{
from: 12,
to: 18,
size: 30,
gap: 10,
days: [2, 5]
},
{...}, // 其他时间段
]
}
];
new booking.Booking("#root", {
data,
// 其他参数
});
定义时间段规则
data 属性 slots 数组中的每个对象指定:
- 时间段的开始和结束时间
- 时间段大小(持续时间,单位:分钟)
- 时间段间隔(时间段之间的间隔)
- 规则适用的星期几或具体日期
可以为卡片的所有天应用一条通用规则,也可以组合多条规则,为特定星期几或具体日期使用不同参数。
按以下优先级(从高到低)在三个层级设置时间段大小和间隔:
data的 slots 数组对象内的size和gap— 应用于该特定时间段规则data属性卡片对象内的slotSize和slotGap— 应用于该卡片的所有时间段- widget 级别的
slotSize和slotGap— 应用于所有卡片
当通用规则和特定规则混合使用时,widget 的解析规则如下:
- 针对特定星期几定义的时间段参数会覆盖适用于所有天的通用参数。
- 针对具体日期指定的时间段参数会覆盖针对特定星期几和所有天定义的参数。
- 如果多个时间段对象针对同一天,具有不同
size或gap的时间范围(from和to)不得重叠。否则,widget 将跳过这些天的所有时间段数据。
要限制显示时间段的范围,请在 widget 级别设置 start 日期和 end 日期。
对所有天应用一条规则
要为卡片的每一天添加具有相同持续时间和时间范围的时间段,在 slots 数组中添加一个对象即可。
以下代码片段定义了一条适用于所有天的通用规则:14:00 至 17:00,每个时间段 30 分钟,间隔 10 分钟:
const data = [
{
id: "5cf364d8-9997-4d8c-9586-48f90f3cb736",
title: "Natalie Tyson",
category: "Therapist",
subtitle: "2 years of experience",
details: "Cleveland Clinic\n9500 Euclid Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "37 $",
review: {
stars: 1,
count: 40
},
slots: [
{
// 适用于所有天的通用 规则
from: 14, // 时间段开始时间
to: 17, // 时间段结束时间
size: 30, // 每个时间段的持续时间(分钟)
gap: 10 // 时间段之间的间隔
}
]
}
];
new booking.Booking("#root", {
data,
// 其他参数
});
按星期几或具体日期应用不同规则
要为特定星期几或具体日期使用不同参数,在 slots 数组中添加多个对象,并为每条规则设置 days 或 dates 参数。
以下代码片段组合了三条规则——通用规则、适用于周二和周五的星期规则,以及适用于周三、周四和一个具体日期的规则:
const data = [
{
id: "5cf364d8-9997-4d8c-9586-48f90f3cb736",
title: "Natalie Tyson",
category: "Therapist",
subtitle: "2 years of experience",
details: "Cleveland Clinic\n9500 Euclid Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "37 $",
review: {
stars: 1,
count: 40
},
slots: [
{
// 适用于所有天的通用规则(下列日期除外)
from: 14,
to: 17,
size: 30,
gap: 10
},
{
// 适用于周二和周五(下一条规则中的周五除外)
from: 12,
to: 17,
size: 50,
gap: 20,
days: [2, 5]
},
{
// 适用于周三、周四和一个具体日期
from: 18,
to: 20,
size: 45,
gap: 20,
days: [3, 4],
dates: [ 1683234000000 ] // 2023 年 5 月 5 日,周五
}
]
}
];
new booking.Booking("#root", {
data,
// 其他参数
});
要了解如何为 widget 中的所有时间段设置持续时间和间隔,请打开代码片段工具。
将时间段标记为已用或可用
data 卡片对象的以下两个参数控制用户可以看到或预约哪些时间段:
usedSlots— 向用户隐藏已预约的时间段availableSlots— 显示可预约时间段的明确列表,并忽略slots数组中的规则
将时间段标记为已用
要隐藏已预约的时间段,将 usedSlots 参数设置为时间段开始时间戳的数组。
以下代码片段将一个时间段标记为已预约并隐藏:
const data = [
{
id: "5cf364d8-9997-4d8c-9586-48f90f3cb736",
title: "Natalie Tyson",
category: "Therapist",
subtitle: "2 years of experience",
details: "Cleveland Clinic\n9500 Euclid Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "37 $",
review: {
stars: 1,
count: 40
},
slots: [
{
// 适用于所有天的通用规则
from: 14, // 时间段开始时间
to: 17, // 时间段结束时间
size: 30, // 时间段持续时间(分钟)
gap: 10 // 时间段之间的间隔
}
],
usedSlots: [ 1683234000000 ] // 已预约时间段的时间戳(毫秒)
}
];
new booking.Booking("#root", {
data,
// 其他参数
});
将时间段标记为可用
要显示可预约时间段的明确列表,请使用 data 属性的 availableSlots 参数。设置 availableSlots 后,widget 将忽略 slots 数组中的所有条目。
以下代码片段将两个时间戳设为该卡片唯一可预约的时间段:
const data = [
{
id: "5cf364d8-9997-4d8c-9586-48f90f3cb736",
title: "Natalie Tyson",
category: "Therapist",
subtitle: "2 years of experience",
details: "Cleveland Clinic\n9500 Euclid Ave",
preview: "https://snippet.dhtmlx.com/codebase/data/booking/01/img/01.jpg",
price: "37 $",
review: {
stars: 1,
count: 40
},
slots: [
{
// 适用于所有天的通用规则
from: 14, // 时间段开始时间
to: 17, // 时间段结束时间
size: 30, // 时间段持续时间(分钟)
gap: 10 // 时间段之间的间 隔
}
],
availableSlots: [ 1693325145000, 1693584345000 ] // 可用时间段的时间戳(毫秒)
}
];
new booking.Booking("#root", {
data,
// 其他参数
});
配置预约对话框
预约对话框包含两个可配置部分:用户填写预约详情的表单字段,以及左侧的信息区块。使用以下属性分别控制各部分:
formShape— 配置表单字段infoShape— 切换信息区块的默认字段infoTemplate— 用自定义 HTML 模板替换信息区块
配置表单字段
将字段描述符数组传入 formShape 属性。每个描述符设置字段类型、标识符、标签以及可选的 required 标志。
以下代码片段定义了三个表单字段,其中 contact 字段标记为必填:
const formShape = [
{
comp: "text",
key: "name",
label: "Your name"
},
{
comp: "text",
key: "contact",
label: "Mobile",
required: true
},
{
comp: "textarea",
key: "description",
label: "Details"
}
];
new booking.Booking("#root", {
formShape,
// 其他参数
});
请在代码片段工具中查看示例。