/** * Run validator to validate column * * A validator could be: * 1. a ValidationKit validator, * 2. a closure * 3. a function name * * The validation result must be returned as in following format: * * boolean (valid or invalid, true or false) * * array( boolean valid , string message ) * * ValidationKit\ValidationMessage object. * * This method returns * * (object) { * valid: boolean valid or invalid * field: string field name * message: * } */ protected function _validateColumn(RuntimeColumn $column, $val, array $args) { // check for requried columns if ($column->required && ($val === '' || $val === NULL)) { return array('valid' => false, 'message' => sprintf(_('Field %s is required.'), $column->getLabel()), 'field' => $column->name); } // XXX: migrate this method to runtime column if ($validator = $column->validator) { if (is_callable($validator)) { $ret = call_user_func($validator, $val, $args, $this); if (is_bool($ret)) { return array('valid' => $ret, 'message' => 'Validation failed.', 'field' => $column->name); } elseif (is_array($ret)) { return array('valid' => $ret[0], 'message' => $ret[1], 'field' => $column->name); } else { throw new Exception('Wrong validation result format, Please returns (valid,message) or (valid)'); } } else { if (is_string($validator) && is_a($validator, 'ValidationKit\\Validator', true)) { // it's a ValidationKit\Validator $validator = $column->validatorArgs ? new $validator($column->get('validatorArgs')) : new $validator(); $ret = $validator->validate($val); $msgs = $validator->getMessages(); $msg = isset($msgs[0]) ? $msgs[0] : 'Validation failed.'; return array('valid' => $ret, 'message' => $msg, 'field' => $column->name); } else { throw new Exception("Unsupported validator"); } } } if ($val && $column->validValues) { if ($validValues = $column->getValidValues($this, $args)) { // sort by index if (isset($validValues[0]) && !in_array($val, $validValues)) { return array('valid' => false, 'message' => sprintf("%s is not a valid value for %s", $val, $column->name), 'field' => $column->name); } else { $values = array_values($validValues); foreach ($values as &$v) { if (is_array($v)) { $v = array_values($v); } } if (!in_array($val, $values)) { return array('valid' => false, 'message' => sprintf(_("%s is not a valid value for %s"), $val, $column->name), 'field' => $column->name); } } } } }