You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
4.8 KiB

<?php
/**
* @copyright NetMonsters <team@netmonsters.ru>
* @link http://netmonsters.ru
* @package Majestic
* @subpackage form
* @since 2010-04-25
*/
class FormField
{
/**
* @var iValidator[]
*/
protected $validators = array();
/**
* @var iFilter[]
*/
protected $filters = array();
/**
* Used instead message of validator if defined.
*
* @var string
*/
protected $default_message = false;
/**
* @var string
*/
protected $message = false;
/**
* @var mixed
*/
protected $value;
/* Flags */
/**
* @var bool
*/
protected $required = true;
/**
* @var bool
*/
protected $ignored = false;
/**
* @param bool|string $default_message
*/
public function __construct($default_message = false)
{
$this->default_message = $default_message;
}
/**
* @param bool $flag
* @return FormField
*/
public function setRequired($flag)
{
$this->required = (bool) $flag;
return $this;
}
/**
* @return bool
*/
public function isRequired()
{
return $this->required;
}
/**
* @param bool $flag
* @return FormField
*/
public function setIgnored($flag)
{
$this->ignored = (bool) $flag;
return $this;
}
/**
* @return bool
*/
public function isIgnored()
{
return $this->ignored;
}
/**
* @param string[]|iValidator[] $validators
* @return FormField
*/
public function addValidators($validators)
{
foreach ($validators as $validator) {
$this->addValidator($validator);
}
return $this;
}
/**
* @param string|iValidator $validator
* @return FormField
* @throws InitializationException
*/
public function addValidator($validator)
{
if ($validator instanceof iValidator) {
$name = get_class($validator);
} elseif (is_string($validator)) {
$name = $validator . 'Validator';
$validator = new $name();
} else {
throw new InitializationException('Invalid validator provided to addValidator; must be string or iValidator');
}
$this->validators[$name] = $validator;
return $this;
}
public function addFilters($filters)
{
foreach ($filters as $filter) {
$this->addFilter($filter);
}
return $this;
}
public function addFilter($filter)
{
if ($filter instanceof iFilter) {
$name = get_class($filter);
} elseif (is_string($filter)) {
$name = $filter . 'Filter';
$filter = new $name();
} else {
throw new InitializationException('Invalid filter provided to addFilter; must be string or iFilter');
}
$this->filters[$name] = $filter;
return $this;
}
public function getValue()
{
$value = $this->value;
if (is_array($value)) {
array_walk_recursive($value, array($this, 'filterValue'));
} else {
$this->filterValue($value, $value);
}
return $value;
}
/**
* $value & $key for array_walk_recursive
*
* @param mixed $value
* @param mixed $key
*/
protected function filterValue(&$value, &$key)
{
foreach ($this->filters as $filter) {
$value = $filter->filter($value);
}
}
public function getSourceValue()
{
return $this->value;
}
public function isValid($value, $context = null)
{
$this->value = $value;
// filtered value here
$value = $this->getValue();
$valid = true;
if ((($value === '') || ($value === null)) && !$this->isRequired()) {
return $valid;
}
foreach ($this->validators as $validator) {
if (is_array($value)) {
foreach ($value as $val) {
if (!$validator->isValid($val, $context)) {
$valid = false;
if (!$this->default_message) {
throw new InitializationException('Define default message for array fields');
}
$this->message = $this->default_message;
}
}
if ($valid) {
continue;
}
} elseif ($validator->isValid($value, $context)) {
continue;
}
$valid = false;
$this->message = ($this->default_message) ? $this->default_message : $validator->getMessage();
break;
}
return $valid;
}
public function getMessage()
{
return $this->message;
}
}