تَمرِين - اكتب أول مكون إضَافِي استخدمته
تحتَاج المؤسسة فِي هذا السينَاريو إلى التأكد مِن إدخَال بيَانَات رقم الهَاتف بتنسيقٍ متسق. وتحقيقَاً لذلك الهدف، تقوم بإنشَاء مكون إضَافِي لتَشغيل الإنشَاء/التحديث الذي يعمل عَلى إزَالة جميع الأحرف غير الرقمية مِن رقم الهَاتف قبل الحفظ إلى Dataverse. ومن ثم تقوم بإنشَاء مكون إضَافِي آخر والذي سيتم تَشغيله عَلى الشرط retrieve/retrievemultiple فِي "جهة الاتصَال" لإعَادة تنسيق رقم الهَاتف ليتضمن الأقواس والشرطَات، وذلك فِي حَالة وجود البيَانَات.
التَمرِين الأول: إنشَاء/تحديث المكون الإضَافي
ستنشئ فِي ذلك التَمرِين مكونًا إضَافيًا والذي يتم تَشغيله عند الإنشَاء والتحديث. ويعمل هذا المكون الإضَافِي عَلى إزَالة الأحرف غير الرقمية مِن رقم الهَاتف.
يتألف كل تَمرِين مِن سينَاريو وأهدَاف تعليمية. يصف السينَاريو الغرض مِن التمَارين، بينمَا يتم سرد الأهدَاف وتحتوي عَلى نقَاط.
ملاحظة
وفِي حَال عدم توفر أدوات Dynamics 365 SDK، رَاجع تنزيل الأدوات مِن NuGet لتنزيلهَا.
المهمة الأولى: إنشَاء مكون إضَافي
قم بتَشغيل Visual Studio 2022.
حدد ملف > جديد > مشروع.
حدد مكتبة الفئَات (NET Framework.) وحدد التَالي.
أدخل عبارة D365PackageProject لـ اسم المشروع، وحدد موقعًا لحفظ المشروع، وحدد .NET Framework 4.6.2 لـ إطَار العمل، ثم حدد إنشَاء.
انقر بزر المَاوس الأيمن عَلى المشروع وحدد إدَارة حزم NuGet.
حدد علامة التبويب تصفح، وابحث عن microsoft.crmsdk.coreassemblies وحددهَا، ثم حدد تثبيت.
اقرأ شروط الترخيص ثم حدد قبول عند موافقتك.
أغلق مدير حزم NuGet.
انقر بزر المَاوس الأيمن فوق Class1.cs وحذف.
انقر بزر المَاوس الأيمن فوق المشروع، ثم حدد إضَافة > فئة.
قم بتسمية الفئة الجديدة PreOperationFormatPhoneCreateUpdate وحدد إضَافة.
أضف عبارَات الاستخدَام إلى الفئة الجديدة كمَا يلي:
using Microsoft.Xrm.Sdk; using System.Text.RegularExpressions;جعل الفئة عَامة وتنفيذ الواجهة IPlugin.
ابدأ تنفيذ عضو الواجهة.
من المفترض أن تبدو فئتك الآن مثل الصورة التَالية.
المهمة الثَانية: تنسيق رقم الهَاتف
احصل عَلى سيَاق التنفيذ مِن موفر الخدمة. استبدل الاستثنَاء الموجود فِي الأسلوب Execute بجُزء التعليمة البرمجية المتكررة التَالي.
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));تحقق مِن صحة معلمة إدخَال الهدف. أضف جُزء التعليمة البرمجية المتكررة التَالي إلى الأسلوب Execute.
if (!context.InputParameters.ContainsKey("Target")) throw new InvalidPluginExecutionException("No target found");أضف جُزء التعليمة البرمجية المتكررة التَالي إلى الأسلوب Execute. يحصل جُزء التعليمة البرمجية المتكررة ذلك عَلى الكيَان الهدف مِن معلمة الإدخَال، وبعد ذلك يتم التحقق ممَا إذا كَانت سمَاته تحتوي عَلى telephone1 (هَاتف العمل الخَاص بجهَات الاتصَال والهَاتف الخَاص بالحسَابات) مِن عدمه.
var entity = context.InputParameters["Target"] as Entity; if (!entity.Attributes.Contains("telephone1")) return;أضف جُزء التعليمة البرمجية المتكررة التَالي إلى الدَالة Execute. يزيل جُزء التعليمة البرمجية المتكررة هذا جميع الأحرف غير الرقمية مِن رقم الهَاتف الذي قدمه المستخدم.
string phoneNumber = (string)entity["telephone1"]; var formattedNumber = Regex.Replace(phoneNumber, @"[^\d]", "");قم بتعيين telephone1 إلى رقم هَاتف منسق. أضف جُزء التعليمة البرمجية المتكررة التَالي إلى الأسلوب Execute.
entity["telephone1"] = formattedNumber;سيبدو الأسلوب Execute الآن مثل الصورة التَالية.
انقر بزر المَاوس الأيمن عَلى المشروع وحدد خصَائص.
حدد عَلامَة التَبويب التَوقِيع، وحَدد المُربَّع المُسمَّى تَوقِيع التَجمِيع وحدد مِلف مفتَاحٍ جديدٍ.
أدخل contoso.snk فِي حقل اسم ملف المفتَاح، وامسح خَانة الاختيَار حمَاية ملف مفتَاحي بكلمة مرور، ثم حدد موافق.
أغلق علامة التبويب الخصَائص.
قم ببنَاء المشروع وتأكَّد مِن نجَاح البنَاء.
المهمة الثَالثة: تسجيل مكون إضَافِي والخطوات
ملاحظة
وفِي حَال عدم توفر أدوات Dynamics 365 SDK، رَاجع تنزيل الأدوات مِن NuGet لتنزيلهَا.
ابدأ تَشغيل تطبيق plug-in registration tool.
حدد إنشَاء اتصَال جديد.
حدد Office 365، وحدد خَانة الاختيَار إظهَار الخيَارَات المتقدمة، وابدأ توفير بيَانَات اعتمَادك، ثم حدد تسجيل الدخول.
حدد تسجيل ثم حدد تسجيل تجميع جديد.
حدد استعرَاض.
تصفح وصولاً إلى المجلد Bin > Debug فِي مكتبة الفئَات التي أنشأتهَا، وحدد D365PackageProject.dll، ثم حدد فتح.
حدد تسجيل المكونَات الإضَافية المُحددة.
حدد موافق.
ابدأ توسيع التجميع المسجل حديثًا.
انقر بزر المَاوس الأيمن فوق المكون الإضَافِي وحدد تسجيل خطوة جديدة.
حدد إنشَاء لـ الرسَالة وحدد جهة اتصَال لـ الكيَان الأسَاسي.
حدد PreOperation لـ مرحلة تنفيذ البنية الأسَاسية لبرنَامج ربط العَمليَات التجَارية للحدث ثم حدد تسجيل خطوة جديدة.
حدد إغلاق.
انقر بزر المَاوس الأيمن فوق المكون الإضَافِي وحدد تسجيل خطوة جديدة مرة أخرى.
حدد تحديث لـ الرسَالة، وحدد جهة الاتصَال لـ الكيَان الأسَاسي، ثم حدد البحث فِي السمَات.
ابدأ إلغَاء تحديد خَانة الاختيَار تحديد الكل، وحدد خَانة الاختيَار هَاتف العمل، ثم حدد موافق.
حدد PreOperation لـ مرحلة تنفيذ البنية الأسَاسية لبرنَامج ربط العَمليَات التجَارية للحدث ثم حدد تسجيل خطوة جديدة.
المهمة الخَامسة: اختبار المكون الإضَافي
انتقل إلى Maker Portal لديك وتأكَّد مِن تحديد البيئة الصحيحة.
حدد التطبيقَات وقم بتَشغيل تطبيق جمع التبرعَات.
حدد لوحة المعلومَات وافتح إحدى جهَات الاتصَال.
حدد + جديد.
أدخل اختبار لـ الاسم الأول وجهة اتصَال لـ اسم العَائلة و(123)-555-0100 لـ هَاتف العمل، ثم حدد حفظ.
يجب حفظ السجل، ويجب أن يظهر هَاتف العمل القيم الرقمية فقط.
ابدأ تغيير هَاتف العمل إلى 001-123-555-0100 وانتظر بضع ثوانٍ.
يجب تحديث السجل، ويجب أن يظهر هَاتف العمل القيم الرقمية فقط.
التَمرِين الثَاني: إنشَاء/استردَاد retrieve multiple
ستنشئ فِي ذلك التَمرِين مكونًا إضَافيًا والذي يتم تَشغيله عند retrieve وretrieve multiple. يضيف هذا المكون الإضَافِي الأقواس والشُرط إلى أرقَام الهواتف.
يتألف كل تَمرِين مِن سينَاريو وأهدَاف تعليمية. يصف السينَاريو الغرض مِن التمَارين، بينمَا يتم سرد الأهدَاف وتحتوي عَلى نقَاط.
المهمة الأولى: إنشَاء مكون إضَافي
ابدأ تَشغيل Visual Studio.
افتح المشروع الذي أنشأته فِي التَمرِين الأول.
انقر بزر المَاوس الأيمن فوق مشروع وحدد إضَافة > فئة.
فِي الحقل الاسم، أدخل PostOperationFormatPhoneOnRetrieveMultiple للفئة ثم حدد إضَافة.
أضف عبارَات الاستخدَام إلى الفئة الجديدة كمَا يلي:
using Microsoft.Xrm.Sdk;جعل الفئة عَامة وتنفيذ الواجهة IPlugin.
ابدأ تنفيذ عضو الواجهة. من المفترض أن تبدو فئتك الآن مثل الصورة التَالية.
المهمة الثَانية: تنسيق رقم الهَاتف للاستردَاد
احصل عَلى سيَاق التنفيذ مِن موفر الخدمة. استبدل الاستثنَاء الموجود فِي الأسلوب Execute بجُزء التعليمة البرمجية المتكررة التَالي.
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));تحقق ممَا إذا كَان اسم الرسَالة Retrieve أو RetrieveMultiple. أضف جُزء التعليمة البرمجية المتكررة التَالي إلى الأسلوب Execute.
if (context.MessageName.Equals("Retrieve")) { } else if(context.MessageName.Equals("RetrieveMultiple")) { }تحقق ممَا إذا كَانت معلمَات الإخرَاج تحتوي عَلى كيَان أعمَال وأنه نوع كيَان مِن عدمه. ألصق جُزء التعليمة البرمجية المتكررة التَالي دَاخل
ifالشرط retrieve.if (!context.OutputParameters.Contains("BusinessEntity") && context.OutputParameters["BusinessEntity"] is Entity) throw new InvalidPluginExecutionException("No business entity found");احصل عَلى الكيَان وتحقق ممَا إذا كَان يحتوي عَلى الحقل telephone1 مِن عدمه. أضف جُزء التعليمة البرمجية المتكررة التَالي دَاخل الشرط
ifretrieve.var entity = (Entity)context.OutputParameters["BusinessEntity"]; if (!entity.Attributes.Contains("telephone1")) return;أضف جُزء التعليمة البرمجية المتكررة التَالي إلى الشرط
if retrieve. يحَاول جُزء التعليمة البرمجية المتكررة هذا تحليل telephone1 بشكلٍ طويل وسيتم إرجَاعه إذا لم تنجح عملية التحليل.if (!long.TryParse(entity["telephone1"].ToString(), out long phoneNumber)) return;ابدأ تنسيق رقم الهَاتف بإضَافة الأقواس والشرطَات. أضف جُزء التعليمة البرمجية المتكررة التَالي دَاخل الشرط
if retrieve.var formattedNumber = String.Format("{0:(###) ###-####}", phoneNumber); entity["telephone1"] = formattedNumber;
يبدو جُزء استردَاد الأسلوب Execute الآن مثل الصورة التَالية.
المهمة الثَالثة: تنسيق رقم الهَاتف لـ retrieve multiple
أضف جُزء التعليمة البرمجية المتكررة التَالي إلى دَاخل الشرط
retrieve multiple. سيتحقق جُزء التعليمة البرمجية المتكررة هذا ممَا إذا كَانت معلمَات الإخرَاج تحتوي عَلى BusinessEntityCollection وإذا كَانت مِن نوع EntityCollection.if(!context.OutputParameters.Contains("BusinessEntityCollection") && context.OutputParameters ["BusinessEntityCollection"] is EntityCollection) throw new InvalidPluginExecutionException("No business entity collection found");احصل عَلى مجموعة الكيَانَات مِن معلمَات الإخرَاج. أضف جُزء التعليمة البرمجية المتكررة التَالي دَاخل الشرط
retrieve multiple.var entityCollection = (EntityCollection)context.OutputParameters["BusinessEntityCollection"];ابدأ التكرَار مِن خلال كل كيَان فِي مجموعة الكيَانَات.
foreach (var entity in entityCollection.Entities) { }أضف جُزء التعليمة البرمجية المتكررة التَالي دَاخل الشرط
foreach. سيفعل جُزء التعليمة البرمجية المتكررة ذلك نفس الشيء الذي يفعله الشرطretrieve.if (entity.Attributes.Contains("telephone1") && entity["telephone1"] != null) { if (long.TryParse(entity["telephone1"].ToString(), out long phoneNumber)) { var formattedNumber = String.Format("{0:(###) ###-####}", phoneNumber); entity["telephone1"] = formattedNumber; } }سيبدو جُزء الشرط retrieve multiple للأسلوب Execute الآن مثل الصورة التَالية.
أعد إنشَاء المشروع وتأكَّد مِن نجَاح الإنشَاء.
المهمة الرَابعة: تحديث تجميع مكون إضَافِي وخطوات التسجيل
أبدَا تَشغيل أدَاة تسجيل المكونَات الإضَافِي وحدد إنشَاء اتصَال جديد.
حدد Office 365، وحدد إظهَار الخيَارَات المتقدمة، وابدأ توفير بيَانَات اعتمَادك، ثم حدد تسجيل الدخول.
حدد التجميع الذي سجلته فِي التَمرِين الأول ثم حدد تحديث.
حدد استعرَاض.
استعرض للوصول إلى مجلد debug لمشروعك، وحدد D365PackageProject.dll ثم حدد فتح.
حدد المكونَات الإضَافية ثم حدد تحديث المكونَات الإضَافية المُحددة.
حدد موافق.
انقر بزر المَاوس الأيمن فوق المكون الإضَافِي الجديد وحدد تسجيل خطوة جديدة.
حدد Retrieve لـ الرسَالة وحدد جهة الاتصَال لـ الكيَان الأسَاسي، ثم حدد PostOperation لـ مرحلة تنفيذ البنية الأسَاسية لبرنَامج ربط العَمليَات التجَارية للحدث. تأكد مِن تحديد متزَامن لـ وَضع التنفيذ ثم حدد تسجيل خطوة جديدة.
انقر بزر المَاوس الأيمن فوق المكون الإضَافِي وحدد تسجيل خطوة جديدة مرة أخرى.
حدد RetrieveMultiple لـ الرسَالة وحدد جهة الاتصَال لـ الكيَان الأسَاسي، ثم حدد PostOperation لـ مرحلة تنفيذ البنية الأسَاسية لبرنَامج ربط العَمليَات التجَارية للحدث. تأكد مِن تحديد متزَامن لـ وَضع التنفيذ، ثم حدد تسجيل خطوة جديدة.
المهمة الخَامسة: اختبار المكون الإضَافي
انتقل إلى Maker Portal وتأكَّد مِن وجودك فِي البيئة الصحيحة.
حدد تطبيقَات. ثم حدد تطبيق جمع التبرعَات وبعدهَا حدد تحرير. ستقوم بإضَافة الجدول "جهَات الاتصَال" إلى التطبيق.
حدد + صفحة جديدة.
حدد جدول Dataverse ثم حدد التَالي.
حدد الجدول الموجود. ثم حدد الجدول جهَات الاتصَال، ثم حدد إضَافة.
حدد تَشغيل.
حدد حفظ ومتَابعة.
حدد تَشغيل مرة أخرى.
حدد جهَات الاتصَال.
لن تتغير السجلات الموجودة التي لم يتم حفظهَا بالتنسيق الجديد. حدد + جديد.
اعمل عَلى توفير المعلومَات التَالية ثم حدد حفظ. يجب حفظ السجل، كمَا يجب تطبيق التنسيق الجديد عَلى المكون الإضَافي.
حدد جهَات الاتصَال مرة أخرى. يجب أن يظهر السجل الذي أنشأته بالتنسيق الجديد.
حدد إحدى جهَات الاتصَال الموجودة وافتحهَا.
ابدأ تحرير هَاتف العمل عَلى النحو التَالي:
حدد حفظ. يجب تطبيق التنسيق الجديد. حدد جهَات الاتصَال مرة أخرى.
سيحصل الهَاتف الذي جرى تحريره عَلى التنسيق الجديد.