كيفية "التحقق من صحة" نموذج symfony في خطوات - بدلاً من استدعاء $ form-> isValid ()

StackOverflow https://stackoverflow.com/questions/3545398

  •  30-09-2019
  •  | 
  •  

سؤال

أنا أستخدم Symfony 1.3.6 على Ubuntu.

لدي نموذج يحتوي على الكثير من الحقول عليه - بدلاً من إظهار جميع الحقول في واحدة (والتي قد تخويف المستخدم) ، أريد تقسيم النموذج إلى مراحل ، بحيث يمكن للمستخدم ملء الحقول المعروضة فقط ، في كل خطوة/مرحلة (كيندا مثل المعالج).

من أجل القيام بذلك ، أحتاج إلى كتابة طرق مخصصة للنموذج ، على سبيل المثال:

validateStep1();
validateStep2();
...
validate StepN();

حيث في كل وظيفة أعلاه ، لا أتحقق سوى من صحة مجموعة فرعية من الأدوات المصغرة المتاحة - أي التحقق من صحة المصغّرة المعروضة للمستخدم فقط في تلك الخطوة.

من أجل القيام بذلك ، سيكون من المفيد أن أتمكن من استدعاء طريقة isValid () على أجهزة التشغيل ، ومع ذلك ، فقد نظرت إلى فئات SFWidget ولا توجد طريقة isValid () على مستوى عنصر واجهة المستخدم.

لا أرغب في التحقق من صحة رمز صعب لكل عنصر واجهة مستخدم أستخدمه ، لأن هذا ليس كذلك جاف

هل يعرف أي شخص كيف يمكنني التحقق من أجهزة التشغيل الفردية في نموذج لمعرفة ما إذا كانت القيمة (المستخدمين) المُدخل صالحة؟

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

المحلول

أود الاستفادة من طريقة مختلفة لتنفيذ أشكال متعددة الأجزاء في Symfony. نأمل أن تكون القشرة التالية كافية لتبدأ.

الخطوة 1: أضف أداة مرحلة إلى النموذج الخاص بك

public function configure()
{
  $this->setWidget('stage', new sfWidgetFormInputHidden(array('default' => 1));
  $this->setValidator('stage', new sfValidatorFormInteger(array('min' => 1, 'max' => $maxStages, 'required' => true));
}

الخطوة 2: أضف بعض المعلومات حول المراحل إلى النموذج الخاص بك

protected $stages = array(
  1 => array('stage1field1', 'stage1field2',
  2 => array('stage2field1', ... //etc for as many stages you have
);

الخطوة 3: أضف تكوينًا كطريقة مرحلة إلى النموذج الخاص بك

public function configureAsStage($currentStage)
{
  foreach($this->stages as $stage => $field)
  {
    if ($currentStage > $stage)
    {
      $this->setWidget($stage, new sfWidgetFormInputHidden()); //so these values carry through
    }
    if ($stage > $currentStage)
    {
       unset($this[$stage]); //we don't want this stage here yet
    }
  }
}

الخطوة 4: تجاوز Dobind

قد تحتاج إلى تجاوز bind() مباشرة ، نسيت.

public function doBind(array $taintedValues)
{
  $cleanStage = $this->getValidator('stage')->clean($taintedValues['stage']);
  $this->configureAsStage($cleanStage);
  parent::doBind($taintedValues);
}

الخطوة 5: إضافة بعض الطرق الإضافية إلى النموذج

public function advanceStage()
{
  if ($this->isValid())
  {
    $this->values['stage'] += 1;
    $this->taintedValues['stage'] += 1;
    $this->resetFormFields();
  }
}

public function isLastStage()
{
  return $this->getValue('stage') == count($this->stages);
}

الخطوة 6: استدعاء configureasStage/Advancestage حسب الضرورة في إجراءك

public function executeNew(sfWebRequest $request)
{
  $form = new MultiStageForm($record);
  $form->configureAsStep(1);
}

public function executeCreate(sfWebRequest $request)
{
  $record = new Record();
  $form = new MultiStageForm($record);
  $form->bind($request[$form->getName()]);
  if ($form->isValid())
  {
    if ($form->isLastStage())
    {
      $form->save();
      //redirect or whatever you do here
    }
    $form->advanceStage(); 
  }
  //render form
}

لقد صنعت هذا تماما على الطيران. أعتقد أنه يجب أن ينجح ، لكنني لم أختبره ، لذلك قد يكون هناك بعض الأخطاء!

نصائح أخرى

الوظيفة isValid() لا تفعل أي شيء حقًا ، باستثناء التحقق مما إذا كان النموذج المرتبط به ملزم وأن العدد الإجمالي لأخطاء التحقق هو 0. يتم التحقق الفعلي أثناء مرحلة "الربط" ($form->bind()).

بعد الربط ، يتم تخزين أخطاء المدقق في كل حقل من النموذج (Sfformfield). لذا ، للحصول على الأخطاء الفردية لحقول النماذج ، يمكنك أن تفعل شيئًا كهذا:

<?php
  foreach ($form as $formField) { // $formField is an instance of sfFormField
    if ($formField->hasError()) {
      // do something
    }
  }
?>

أو ، بما أنه في حالتك ، تحتاج إلى التعامل مع مجموعة مقيدة فقط من الحقول ، حاول التكرار على مجموعة من أسماء الحقول بدلاً من ذلك:

<?php
  $fieldNames = array('name', 'email', 'address');
  foreach ($fieldNames as $fieldName) {
    if ($form[$fieldName]->hasError()) {
      // do something
    }
  }
?>

هذا يمكن تكييفه بسهولة في وظيفة ، على سبيل المثال validateFields($fieldNames) التي تلبي التوقعات الجافة.

تحقق من الوثائق ل سيفورمفيلد لمعرفة المعلومات الأخرى التي يمكنك الحصول عليها من حقل.

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