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