أشكال symfony أو أشكال HTML العادية
-
26-09-2019 - |
سؤال
أنا أستخدم 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.