سؤال

أحاول إنشاء نموذج يغير التحقق من صحة الحقل بناءً على خيار SELECT من حقل نموذج HTML.

على سبيل المثال: إذا حدد المستخدم خيارًا 1 من الحقل المنسدلة "خيارات" ، فأنا أريد أن يتحقق الحقل "القياس" على أنه sfvalidatorInteger. إذا كان المستخدم تحديد الخيار 2 من "الخيارات" الحقل ، فأنا أريد أن يتحقق الحقل "مقياس" كـ sfvalidatoremail ، إلخ.

لذلك داخل الوظيفة العامة تكوين () {لدي عبارة التبديل لالتقاط قيمة "الخيارات" ، وإنشاء المدقق بناءً على هذه القيمة التي تم إرجاعها من "الخيارات".

1.) كيف يمكنني التقاط قيمة "الخيارات"؟ لقد حاولت:

$this->getObject()->options
$this->getTaintedValues()

الشيء الوحيد الذي يعمل حاليًا بالنسبة لي هو ولكنه ليس MVC حقًا:

$params = sfcontext::getInstance()->getRequest()->getParameter('options');

2.) بمجرد التقاط هذه المعلومات ، كيف يمكنني تعيين قيمة "المقياس" لحقل مختلف؟ ("قياس" ليس عمودًا حقيقيًا في DB). لذلك أحتاج إلى تعيين قيمة "مقياس" إلى حقل مختلف مثل "البريد الإلكتروني" ، "العمر" ... حاليًا أتعامل مع هذا في جهاز التحقق من النشر مثل هذا ، فقط أتساءل عما إذا كان بإمكاني تعيين قيمة ضمن التكوين ( ):

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'checkMetric'))));

public function checkMetric($validator, $values) {

}

شكرًا!

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

المحلول

تريد استخدام مدقق منشور. حاول أن تفعل شيئًا كهذا في شكلك:

public function configure()
{
  $choices = array('email', 'integer');
  $this->setWidget('option', new sfWidgetFormChoice(array('choices' => $choices))); //option determines how field "dynamic_validation" is validated
  $this->setValidator('option', new sfValidatorChoice(array('choices' => array_keys($choices)));
  $this->setValidator('dynamic_validation', new sfValidatorPass()); //we're doing validation in the post validator
  $this->mergePostValidator(new sfValidatorCallback(array(
    'callback' => array($this, 'postValidatorCallback')
  )));
}

public function postValidatorCallback($validator, $values, $arguments)
{
   if ($values['option'] == 'email')
   {
     $validator = new sfValidatorEmail();
   }
   else //we know it's one of email or integer at this point because it was already validated
   {
     $validator = new sfValidatorInteger();
   }
   $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']); //clean will throw exception if not valid
   return $values;
}

نصائح أخرى

1) في مصلحة النشر ، يمكن الوصول إلى القيم بواسطة باستخدام معلمة قيم $. ما عليك سوى استخدام قيم $ ['Options'] ويجب أن يكون جيدًا ... أم أنك تريد الوصول إلى هذه القيم من جزء آخر من رمزك؟ $ this-> getObject ()-> يجب أن تعمل WidgetSchema ['Options'] أيضًا على ما أعتقد ، بمجرد ربط النموذج بكائن.

2) تسمى طريقة التكوين () في نهاية مُنشئ النموذج ، لذلك لا تكون القيم مرتبطة ولا يمكن الوصول إليها بعد ، إلا إذا كنت تقوم بتهيئة النموذج بكائن من DB (والذي لا يتطلب أي التحقق من الصحة). ولكن إذا كنت ترغب في تهيئة النموذج الخاص بك من $ _post ، فإن التحقق من Post هو بالتأكيد الطريق للذهاب IMHO.

حصلت على خطأ التحقق من الصحة في الظهور بجانب الحقل من خلال رمي أ sfValidatorErrorSchema بدل من sfValidatorError.

$values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);

... يصبح ...

try
{
    $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);
}
catch(sfValidatorError $e)
{
    $this->getErrorSchema()->addError($e, 'dynamic_validation');
    throw $this->getErrorSchema();
}

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

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