1
votes

how can i validate the bill address depending on bill_ceck post parameter?

i reviewed the post validation (http://symfony.com/legacy/doc/cookbook/1_2/en/conditional-validator) but it seem to me like an AND validation not an OR.

class OrderAddForm extends BaseOprOrderHeaderForm {
  public function configure() {
    $this->setWidgets(array(
        'email' => new sfWidgetFormInputText(),
        'name' => new sfWidgetFormInputText(),
        //....
        'city' => new sfWidgetFormInputText(),
        'street' => new sfWidgetFormInputText(),
        //....
        'bill_check' => new sfWidgetFormInputCheckbox(),
        'bill_name' => new sfWidgetFormInputText(),
        'bill_city' => new sfWidgetFormInputText(),
        'bill_street' => new sfWidgetFormInputText(),
        //....
    ));
    $this->widgetSchema['bill_check']->setOption('value_attribute_value', 1);
    $this->setValidators(array(
        'email' => new sfValidatorEmail(),
        'name' => new sfValidatorString(),
        //...
        'city' => new sfValidatorString(),
        'street' => new sfValidatorString(),
        //...
        'bill_check' => new sfValidatorBoolean(),
    ));
    if (/** the most convetional solution to check 'bill_check' state */) {
      $this->validatorSchema['bill_name'] = new sfValidatorString();
      $this->validatorSchema['bill_city'] = new sfValidatorString();
      $this->validatorSchema['bill_street'] = new sfValidatorString();
      //....
    }
    $this->widgetSchema->setNameFormat('orderAddForm[%s]');
  }
}

thanks, oliver

1

1 Answers

2
votes

You could use a postValidator

public function configure() {
  // your current code
  $this->validatorSchema->setPostValidator(
    new sfValidatorCallback(array('callback' => array($this, 'checkOtherStuff')))
  );
}

public function checkOtherStuff($validator, $values)
{
  // $values is an array of POSTed values
  if ($values['bill_check'] == 'something in here')
  {
    if ($values['bill_city'] == '' || $values['bill_street'] == '') {
        throw new sfValidatorError($validator, 'You must complete all fields');
    }
  }
  // bill_check is correct, return the clean values
  return $values;
}

Blog article on the subject here