Zend_Validate_Between pe altă valoare

Care este cel mai bun mod de validare a unui interval de numere pe baza valorii unui alt element de formă? Dacă utilizatorul selectează "procentual" ca tip de discount, suma de reducere ar trebui să fie cuprinsă între 0 și 100 și nu 140! Problema pare să treacă printr-o altă valoare a elementului de formă.

Also, I've viewed other resources, one dealing with a similar topic, but perhaps not all the way relevant. How to validate a field of Zend_Form based on the value of another field?

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;

 }

Dacă aveți nevoie de mai multe informații, spuneți.

0

2 răspunsuri

O soluție alternativă:

//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());
}
0
adăugat

Am modificat codul dvs. puțin și am adăugat o casetă drop-down:

Formă:

$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);

validator:

<?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);
    }
}

Now, if you validate the form in your controller using $form->isValid($this->getRequest()->getParams()), it will take an input between 0 and 100 if in the drop down box 'percentage' is selected and an input between 0 and 140 otherwise.

0
adăugat
Mulțumiri. Modul simplu pe care l-am găsit a fost să părăsească clasa Zend_Validate.
adăugat autor parseMaestro63, sursa