使用 JavaScript 为 Dynamics CRM 365 表单添加回历日期支持





5.00/5 (3投票s)
允许希吉里日期和公历日期字段在您的 Dynamic CRM 表单上一起使用,并根据用户输入同时更新它们。
引言
我创建这个解决方案是因为我有一个要求,允许 CRM 用户同时使用两种类型的日历(希吉里和公历)。
换句话说,他们希望让他们的用户可以灵活地添加公历日期或希吉里日期,因为他们的许多用户对希吉里日期更熟悉。无论他们填写或修改哪个日期,都应更新另一个日期。因此,您可以添加希吉里日期字段,同时仍使用公历日期。
不幸的是,在 Microsoft Dynamic CRM 中没有现成的支持两种类型日历的方法。因此,您可以将其视为满足这些需求的一种解决方法。
请注意,这是一个纯粹的 JavaScript 解决方案。因此,它可以与从 4.0 到 365 的所有 Dynamic CRM 版本一起使用,无论是云版本还是本地版本,以及任何动态 CRM 表单,如主表单和快速添加表单。
背景
您应该对 Microsoft Dynamic CRM 表单定制和 JavaScript 有基本的了解。
请注意,这并不是一个看起来很漂亮的希吉里日历小部件;它只是一个文本框。
该脚本基于给定的公历日期计算近似的希吉里日期。它基于算术计算来匹配日期。计算基于月球周期,其中农历月的长度定义为 29 天或 30 天。每两三年在年底增加一天以跟上月相。这个公式与“Umm Al-Qura”希吉里日历相符。
Using the Code
让我们通过一个场景来允许 CRM 用户根据自己的喜好输入客户的出生日期(公历或希吉里日期)。然后,两个日期将相应地更新。
- 创建一个新的非托管解决方案,选择设置,然后选择解决方案。
- 将客户实体添加到您的解决方案中
- 添加客户表单并打开它。
- 为公历出生日期创建一个新字段,类型为“仅日期”。
- 为希吉里出生日期创建一个新字段,类型为“单行文本”。
- 将新字段添加到客户姓名下的客户表单中。
- 下载附加的 JavaScript 文件并将其作为 JavaScript Web 资源添加到表单属性库中。
- 为公历出生日期字段添加一个 onchange 事件处理程序。并将两个参数传递给 JavaScript 函数。第一个参数是公历日期字段的名称,第二个参数是相关的希吉里日期字段。
function onGregorianDateFieldChange(gregorianDateFieldName, HijriDateFieldName) { if (Xrm.Page.getAttribute(gregorianDateFieldName).getValue() != null) { var dateGregValue = Xrm.Page.getAttribute(gregorianDateFieldName).getValue(); var year = dateGregValue.getFullYear(); var month = dateGregValue.getMonth(); var day = dateGregValue.getDate(); Xrm.Page.getAttribute(HijriDateFieldName).setValue (convertToHijri(day, month, year)); } }
- 为希吉里出生日期字段添加一个 onchange 事件处理程序。并将两个参数传递给 JavaScript 函数。第一个参数是希吉里日期字段的名称,第二个参数是相关的公历日期字段。
function onHijriDateFieldChange(HijriDateFieldName, gregorianDateFieldName ) { if (Xrm.Page.getAttribute(HijriDateFieldName).getValue() != null) { if (isValidHijriDate(Xrm.Page.getAttribute (HijriDateFieldName).getValue())) { var dateHijriValue = Xrm.Page.getAttribute (HijriDateFieldName).getValue(); // Parse the date parts to integers var parts = dateHijriValue.split("/"); var day = parseInt(parts[0], 10); var month = parseInt(parts[1], 10); var year = parseInt(parts[2], 10); var strGregDate = convertToGreg(day, month, year); var gregDate = new Date(strGregDate); Xrm.Page.getAttribute(gregorianDateFieldName).setValue(gregDate); } } }
- 保存并发布。
验证
由于我将希吉里字段定义为文本,因为无法将其定义为日期,因此我应用了多重检查以确保用户输入正确的日期格式和有效数字,如下所示
// Validates that the input string is a valid date formatted as "dd/MM/yyyy"
function isValidHijriDate(dateString) {
// Parse the date parts to integers
var parts = dateString.split("/");
if (parts.length != 3) {
OpenAlert("OK", "Enter date in dd/MM/yyyy format ONLY",
"Date Format Notification");
return false;
}
var day = parts[0];
var month = parts[1];
var year = parts[2];
// Check the range of the day
if (!isPositiveInteger(day) || day <= 0 || day > 30) {
OpenAlert("OK", "Hijri Days should be between 1 and 30",
"Date Format Notification");
return false;
}
// Check the ranges of months
if (!isPositiveInteger(month) || month <= 0 || month > 12) {
OpenAlert("OK", "Hijri months should be between 1 and 12",
"Date Format Notification");
return false;
}
// Check the ranges of month and year
if (!isPositiveInteger(year) || year < 1000 || year > 3000) {
OpenAlert("OK", "Allowed Hijri years between 1000 and 3000");
return false;
}
return true;
}
关注点
- 正如您在上面的场景中看到的,无需触及或更新 JavaScript Web 资源,因为如果我们将字段名称作为参数传递,它将像即插即用一样工作。此外,这样做的好处是,对于多个日期字段,您无需创建新的 JavaScript 函数。
- 您可以在任何 HTML 页面上使用此代码;您只需要将日期字段作为参数传递。
参考文献
- https://www.al-habib.info/islamic-calendar/hijricalendartext.htm
历史
- 2022 年 10 月 11 日:版本 1.0