Symonfy 1.4 التحقق الديناميكي ممكن؟
-
26-09-2019 - |
سؤال
أحاول إنشاء نموذج يغير التحقق من صحة الحقل بناءً على خيار 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();
}
لست متأكدًا مما إذا كانت هذه هي أفضل طريقة للحصول على هذه النتيجة ، ولكن يبدو أنها تعمل من أجلي في الوقت الحالي.