# رمز النموذج

## 👨‍💻️ ما هو كود النموذج؟

يتيح لك كود النموذج تشغيل وتنفيذ بعض تعليمات javascript المخصصة أثناء بدء الاستبيان وتشغيله.

يجب أن يمتد الكود المخصص الخاص بك من الـ **NGSFormCode** الكائن ليتم تنفيذه.

```javascript
/*
 مثال يوضح كيفية إرسال إجابات المستجيب إلى REST API جهة خارجية. 
 إجابات إلى REST API جهة خارجية.

 يمكن أيضًا استخدام كود النموذج لإدراج أكواد 
 الـ API لجهات خارجية في صفحة النموذج باستخدام أحداث onInit أو onLoaded
*/
class CustomFormCode extends NGSFormCode { 
  /* تم تحميل النموذج */
  onInit() {}

  /* سيتم استدعاء عنصر أمني يتطلب المصادقة 
     عندما يتطلب الاستبيان المصادقة من عنصر أمني  
  */
  onAuthenticate(securityItem) {}

  /* سيتم استدعاء عنصر أمني يتطلب المصادقة 
     تمت مصادقة عنصر أمني بنجاح. 
     إرجاع سلسلة نصية من هذه الطريقة سيمنع 
     الوصول إلى الاستبيان مع الرسالة المحددة بواسطة 
     السلسلة النصية المرجعة.  
  */
  onAuthenticated(securityItem, securityItemAuthorization) {}

  /* تم تفويض النموذج من قبل جميع العناصر الأمنية وتم تحميله  
    مع أسئلة صفحته المرئية الأولى */
  onLoaded() {}

  /* يُفعل عند تحميل صفحة جديدة؛ قيمة null للصفحة 
    تشير إلى أن صفحة الشكر النهائية يتم تحميلها 
  */
  onPageLoad(page) {}

  /* يُفعل بمجرد حفظ إجابات جلسة المستجيب على الخادم.
  تعرف action على الإجراء الذي أدى إلى حفظ التقدم ويمكن أن تكون أي من القيم التالية
  None = 0, Button = 1, PageChange = 2, QuestionChange = 3, Email = 4, Auto = 5 
  */
  onSaveProgress(ngsRespondent, action) {}

  /* يُفعل بمجرد حفظ إجابات المستجيب على الخادم. */
  onSubmit(ngsRespondent) {
    // تفاصيل المستجيب
    console.log(ngsRespondent.respondent);

    // إجابات المستجيب
    console.log(ngsRespondent.answers);

    // قيم سمات بيانات عناصر الأمان
    console.log(ngsRespondent.dataAttributes);
    
    this.formContext.httpClient.post('http://www.yourrestsite.com/yourapi/saveanswers', 
        ngsRespondent.answers, {}).subscribe();
  }

  /* يُفعل بمجرد تحديث إجابات المستجيب على الخادم. */
  onUpdate(ngsRespondent) {console.log('update', ngsRespondent);}
}
```

الـ **NGSForm** توفر الفئة الأساسية الخصائص التالية التي يمكنك إعادة استخدامها في الفئة المشتقة الخاصة بك.&#x20;

```javascript
class NGSFormCode {
    // الاستبيان الحالي
    survey;
    // فئة مساعد سياق النموذج
    formContext;
    // إجابات المستجيب الحالية
    respondentAnswers;
    // المستجيب الحالي
    respondent;
    // رمز اللغة الجاري التشغيل به
    language;
    // قيم سمات البيانات الحالية من عناصر الأمان
    dataAttributesValues;
 }
```

**FormContext** يوفر الخصائص التالية التي يمكنك استخدامها من فئة NGSFormCode المشتقة عبر الخاصية formContext.

```javascript
export class FormContext {
    // إجابات المستجيب الحالية
    private respondentAnswers$: Observable<RespondentAnswer[]>,
    // سمات بيانات عناصر الأمان الحالية
    private dataAttributesValues$: Observable<RespondentAnswer[]>,
    // لغة المستجيب الحالية
    private language$: Observable<Language>,
    // عميل HTTP الخاص بـ Angular
    private httpClient: HttpClient,
}
```

**تشفير** هي خصائص المستجيب

```javascript
export interface Respondent {
  id: string;
  surveyId?: string;
  panelistId?: string;
  contextUsername?: string;
  resumeUId?: string;
  resumePageId?: string;
  resumeQuestionId?: string;
  startDate: Date;
  voteDate?: Date;
  archiveDate?: Date;
  iPSource?: string;
  changeUID?: string;
  progressSaveDate?: Date;
  languageCode: string;
  timeToEnd?: number;
  validated: boolean;
  userAgent?: string;
  platform?: string;
  platformOS?: number;
  mobileOS?: boolean;
  longitude?: number;
  latitude?: number;
}
```

**تشفير** هي خصائص المستجيب

```javascript
export interface Respondent {
  id: string;
  surveyId?: string;
  panelistId?: string;
  contextUsername?: string;
  resumeUId?: string;
  resumePageId?: string;
  resumeQuestionId?: string;
  startDate: Date;
  voteDate?: Date;
  archiveDate?: Date;
  iPSource?: string;
  changeUID?: string;
  progressSaveDate?: Date;
  languageCode: string;
  timeToEnd?: number;
  validated: boolean;
  userAgent?: string;
  platform?: string;
  platformOS?: number;
  mobileOS?: boolean;
  longitude?: number;
  latitude?: number;
}
```

&#x20;**SecurityItemAuthorization** يتتبع جميع الخصائص التي تُرجعها عنصر أمني تم المصادقة عليه.

```javascript
export interface SecurityItemAuthorization {
  securityItemId?: string;
  authorizationToken?: string;
  sessionCode?: string;
  sessionRespondent?: NGSRespondent;
  sessionPanelist: NGSPanelist;
  dataAttributesValues?: SecurityItemDataAttributeValue[];
}
```
