سؤال

أنا أستخدم Symfony 1.4 لإنشاء مشروع ، وأحتاج إلى إنشاء نماذج ديناميكية اعتمادًا على نوع مجموعة الأسئلة القادم من قاعدة البيانات. لقد استخدمت نماذج Symfony في بقية مشروعي ، لكن في هذه الحالة يبدو أن نماذج Symfony أمر صعب ، حيث أحتاج إلى شكل ديناميكي. هل يمكن أن تكون آمنة لاستخدام نماذج HTML العادية .. في مشروع Symfony ، أو من المستحسن استخدام نماذج Symfony. لذا بحاجة إلى مساعدتك.

هل كانت مفيدة؟

المحلول

يمكنك استخدام نماذج HTML ، ولكنه سيتجاوز نظام التحقق من صحة نموذج Symfony.

لا يزال بإمكانك إنشاء نماذج ديناميكية عن طريق إنشاء وإضافة مصادر الإدخال إلى النموذج الحالي ، أو نموذج جديد داخل الإجراء. يمكنك بعد ذلك صدى النموذج في القالب وستكون الحقول التي تم إنشاؤها ديناميكيًا جزءًا من النموذج أيضًا.

إذا بدأت بـ myform.class.php في النماذج/النماذج ، فتأكد من إضافة:

$this->validatorSchema->setOption('allow_extra_fields', true);

خلاف ذلك ، ستحصل تلقائيًا على أخطاء التحقق من الصحة. إذا كنت ترغب في إضافة حقول إلى نموذج في إجراء ، فستفعل شيئًا كهذا:

$this->form = new MyForm();
$widgetSchema = $this->form->getWidgetSchema();
$widgetSchema['add_field'] = new sfWidgetFormInputText();

عندما تردد ، ستتم إضافة إدخال "add_field" الخاص بك.

نصائح أخرى

سيساعد ذلك على الحصول على مزيد من المعلومات حول ما تفعله ، ولكن إليك طريقة واحدة يمكن أن تكون فيها النماذج ديناميكية في Symfony. يقوم هذا الرمز بإنشاء أجهزة واجهة مستخدم ومقحة للمسح بناءً على "نوع" السؤال:

class SurveyAnswerForm extends BaseSurveyAnswerForm
{
  public function configure()
  {
    $question = $this->object->Question;

    $method = sprintf('createWidgetAndValidatorFor%sInputType', $question->type);
    $this->$method($question);
    $this->getWidget('value')->setOption('label', $question->question);
    $this->getValidator('value')->setOption('required', $question->required);
  }

  protected function createWidgetAndValidatorForTextFieldInputType(Question $question)
  {
    $this->setWidget('value', new sfWidgetFormInputText());
    $this->setValidator('value', new sfValidatorString());
  }

  protected function createWidgetAndValidatorForTextAreaInputType(Question $question)
  {
    $this->setWidget('value', new wfWidgetFormTextareaAutosize());
    $this->setValidator('value', new sfValidatorString());
  }

  //etc. for as many types as you require
}

ملاحظة: على الرغم من أن هذه الإجابة هي رمز من أحد مشاريعي ، إلا أنها تأثرت بشدة هذا الجواب أكثر على symfonyexperts.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top