65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2022 年 10 月 11 日

CPOL

3分钟阅读

viewsIcon

5757

downloadIcon

107

允许希吉里日期和公历日期字段在您的 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 用户根据自己的喜好输入客户的出生日期(公历或希吉里日期)。然后,两个日期将相应地更新。

  1. 创建一个新的非托管解决方案,选择设置,然后选择解决方案

  2. 客户实体添加到您的解决方案中

  3. 添加客户表单并打开它。

  4. 为公历出生日期创建一个新字段,类型为“仅日期”。

  5. 为希吉里出生日期创建一个新字段,类型为“单行文本”。

  6. 将新字段添加到客户姓名下的客户表单中。

  7. 下载附加的 JavaScript 文件并将其作为 JavaScript Web 资源添加到表单属性库中。

  8. 为公历出生日期字段添加一个 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));
        }
    }
    
  9. 为希吉里出生日期字段添加一个 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);
            }
        }
    }
    
  10. 保存并发布。

验证

由于我将希吉里字段定义为文本,因为无法将其定义为日期,因此我应用了多重检查以确保用户输入正确的日期格式和有效数字,如下所示

// 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
© . All rights reserved.