# كود النموذج

## 👨‍💻️ ما هو form code ؟

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

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

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

 يمكن أيضًا استخدام Form code لإدراج أكواد جهة خارجية 
 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,
}
```

**Respondent** هي خصائص المستجيب

```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;
}
```

**Respondent** هي خصائص المستجيب

```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[];
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ngsurvey.com/ar/form-management/form-designer/form-settings/form-code.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
