0

根据另一个表单元素的值验证数字范围的最佳方法是什么?如果用户选择“百分比”作为折扣类型,则折扣金额应该在 0 到 100 之间,而不是 140!问题似乎是传入另一个表单元素值。

此外,我还查看了其他资源,其中一个涉及类似的主题,但可能并不完全相关。 如何根据另一个字段的值验证 Zend_Form 的一个字段?

表单.php

$isValid = new Application_Model_Validate();
$discount = $this->createElement('text', 'discount')
                 ->setLabel('Discount Amount') 
                 ->setDescription("Enter an amount in the format \"200.00\" ")
                 ->setRequired(true)
                 ->setDecorators(array('Description', 'ViewHelper', 'Errors',
                           array('HTMLTag', array('tag' => 'dd')),
                           array('Label', array('tag' => 'dt'))));

$discount->addValidators(array(array('Float')), $isValid->isValid(new Zend_Validate_Between(array('min' => '0', 'max' => '100')), $discountType));
$this->addElement($discount);

Application_Model_Validate.php

Require_once 'Zend/Validate/Abstract.php';

class Application_Model_Validate extends Zend_Validate_Abstract
{
/*
 *  Validation failure message key
 */
const INVALID_PERCENTAGE = 'InvalidPercentage';

/*
 * Validation failure message template definitions
 */
protected $_messageTemplates = array(
  self::INVALID_PERCENTAGE => 'Please enter a percentage greater than 0 and up to 100.' 
);


protected $_percentageOption;
protected $_percentageValue;

/*
 * Defined by Zend_Validate_Interface
 * Validate the percentage parameters
 */
public function isValid($value, $context = null)
{
    $this->_setValue($value);

     /*
     * If context key is valid, return true
     */

    if(is_array($context))
    {
       if (isset($context['percentage']) && ($value))
        {
           return true;                
        }
    }

    $this->_error(self::INVALID_PERCENTAGE);
    return false;

 }

如果您需要更多信息,请说。

4

2 回答 2

0

我稍微修改了您的代码并添加了一个下拉框:

形式:

$this->addElement('select', 'discounttype');
$this->getElement('discounttype')
    ->addMultiOptions(
        array('percentage' => 'percentage', 'other' => 'other')
);

$discount = $this->createElement('text', 'discount')
         ->setLabel('Discount Amount') 
         ->setRequired(true);

$discount->addValidators(
    array('Float', new Application_Model_Validate(0, 140))
);
$this->addElement($discount);

验证器:

<?php

class Application_Model_Validate extends Zend_Validate_Between
{
    public function isValid($value, $context = null)
    {
        $this->_setValue($value);

        if ($context['discounttype'] == 'percentage') {
            $this->setMax(100);
        }

        return parent::isValid($value, $context);
    }
}

现在,如果您使用 验证控制器中的表单,$form->isValid($this->getRequest()->getParams())如果在下拉框中选择“百分比”,它将采用 0 到 100 之间的输入,否则将采用 0 到 140 之间的输入。

于 2012-06-04T21:46:44.943 回答
0

另一种解决方案:

//controller validation
$discountValidate = new Application_Model_Validate();
$discountValidate->_checkDiscount($data['discountType'], $data['discount']);

if ($discountValidate->isValid())
{
    //do
}

else
{
     $element = $form->getElement('discount');
     $element->addError($discountValidate->getError());
}
于 2012-06-26T01:05:59.930 回答