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.

155 lines
3.3 KiB

<?php
/**
* @copyright NetMonsters <team@netmonsters.ru>
* @link http://netmonsters.ru
* @package Majestic
* @subpackage form
* @since 2010-04-24
*/
abstract class Form
{
const SUCCESS = 'success';
const ERROR = 'error';
/**
* @var FormField[]
*/
protected $fields = array();
/**
* @var array
*/
protected $messages = array(
self::SUCCESS => 'Form data valid',
self::ERROR => 'Form data invalid');
protected $valid = true;
public function __construct()
{
$this->init();
}
/**
* @param string $name
* @param bool|string $message
* @return FormField
*/
protected function addField($name, $message = false)
{
$this->fields[$name] = new FormField($message);
return $this->fields[$name];
}
public function isValid($data)
{
if (!is_array($data)) {
throw new InitializationException(__CLASS__ . '::' . __METHOD__ . ' expects an array');
}
foreach ($this->fields as $field_name => $field) {
if (isset($data[$field_name])) {
$this->valid &= $field->isValid($data[$field_name], $data);
} else {
$this->valid &= $field->isValid(null, $data);
}
}
if (!$this->valid) {
$this->fillHelperData();
}
return $this->valid;
}
public function getMessages()
{
$messages = array();
foreach ($this->fields as $name => $field) {
if ($mess = $field->getMessage()) {
$messages[$name] = $mess;
}
}
return $messages;
}
public function getValue($key)
{
if (isset($this->fields[$key])) {
return $this->fields[$key]->getValue();
}
return false;
}
/**
* @return array
*/
public function getValues()
{
$values = array();
foreach ($this->fields as $key => $field) {
if (!$field->isIgnored()) {
$values[$key] = $field->getValue();
}
}
return $values;
}
/**
* @return array
*/
public function getSourceValues()
{
$values = array();
foreach ($this->fields as $key => $field) {
$values[$key] = $field->getSourceValue();
}
return $values;
}
/**
* @return string
*/
public function getMessageType()
{
return ($this->valid) ? self::SUCCESS : self::ERROR;
}
/**
* @return string
*/
public function getMessage()
{
return $this->messages[$this->getMessageType()];
}
/**
* @param string $message
* @return Form
*/
public function setSuccessMessage($message)
{
$this->messages[self::SUCCESS] = (string) $message;
return $this;
}
/**
* @param string $message
* @return Form
*/
public function setErrorMessage($message)
{
$this->messages[self::ERROR] = (string) $message;
return $this;
}
protected function fillHelperData()
{
$data['messages'] = $this->getMessages();
$data['values'] = $this->getSourceValues();
Session::set(get_class($this), $data);
}
abstract protected function init();
}