Файл: core/form.php
Строк: 487
<?php
class Form
{
const METHOD_POST = 'post';
const METHOD_GET = 'get';
const ENCTYPE_APP_FORM_URLENCODED = 'application/x-www-form-urlencoded';
const ENCTYPE_MULTYPART_FORMDATA = 'multipart/form-data';
const BIND_SUCCESS = 'success';
const BIND_SUBMIT = 'submit';
const AJAX_DATA_TYPE_JSON = 'json';
const AJAX_DATA_TYPE_SCRIPT = 'script';
const AJAX_DATA_TYPE_XML = 'xml';
const AJAX_DATA_TYPE_HTML = 'html';
/**
* Form element attributes (id, name, etc).
*
* @var array
*/
protected $attributes = array();
/**
* Form elements list.
*
* @var array
*/
protected $elements = array();
/**
* Form submit elements list <Submit/Button>.
*
* @var array
*/
protected $submitElements = array();
/**
* Form ajax flag.
*
* @var boolean
*/
protected $ajax;
/**
* @var boolean
*/
protected $ajaxResetOnSuccess;
/**
*
* @var string
*/
protected $ajaxDataType;
/**
* @var array
*/
protected $bindedFunctions;
/**
* @var string
*/
protected $emptyElementsErrorMessage;
/**
* Constructor.
*
* @param string $name
*/
public function __construct( $name )
{
$this->setId(UTIL_HtmlTag::generateAutoId('form'));
$this->setMethod(self::METHOD_POST);
$this->setAction('');
$this->setAjaxResetOnSuccess(true);
$this->setAjaxDataType(self::AJAX_DATA_TYPE_JSON);
$this->bindedFunctions = array(self::BIND_SUBMIT => array(), self::BIND_SUCCESS => array());
$this->setEmptyElementsErrorMessage(PEEP::getLanguage()->text('base', 'form_validate_common_error_message'));
$formNameHidden = new HiddenField('form_name');
$formNameHidden->setValue($name);
$this->addElement($formNameHidden);
$this->setName($name);
}
/**
* @return string
*/
public function getId()
{
return isset($this->attributes['id']) ? $this->attributes['id'] : null;
}
/**
* @return string
*/
public function getName()
{
return isset($this->attributes['name']) ? $this->attributes['name'] : null;
}
/**
* @return string
*/
public function getEmptyElementsErrorMessage()
{
return $this->emptyElementsErrorMessage;
}
/**
* @param string $message
* @return Form
*/
public function setEmptyElementsErrorMessage( $message )
{
$this->emptyElementsErrorMessage = $message;
return $this;
}
/**
* Sets form `id` attribute.
*
* @param string $id
* @return Form
*/
public function setId( $id )
{
$this->attributes['id'] = trim($id);
return $this;
}
/**
* Sets form `name` attribute.
*
* @param string $name
* @return Form
* @throws InvalidArgumentException
*/
public function setName( $name )
{
if ( !$name )
{
throw new InvalidArgumentException('Invalid form name!');
}
$this->getElement('form_name')->setValue($name);
$this->attributes['name'] = trim($name);
return $this;
}
/**
* Sets form `action` url attribute.
*
* @param string $action
* @return Form
*/
public function setAction( $action )
{
$this->attributes['action'] = trim($action);
return $this;
}
/**
* @return string
*/
public function getAction()
{
return isset($this->attributes['action']) ? $this->attributes['action'] : null;
}
/**
* Sets form `method` attribute.
*
* @param string $method
* @return Form
*/
public function setMethod( $method )
{
if ( !in_array(trim($method), array(self::METHOD_GET, self::METHOD_POST)) )
{
throw new InvalidArgumentException('Invalid form method type!');
}
$this->attributes['method'] = trim($method);
return $this;
}
/**
* @return string
*/
public function getMethod()
{
return isset($this->attributes['method']) ? $this->attributes['method'] : null;
}
/**
* Sets form `enctype` attribute.
*
* @param string $enctype
* @return Form
*/
public function setEnctype( $enctype )
{
if ( !in_array(trim($enctype), array(self::ENCTYPE_APP_FORM_URLENCODED, self::ENCTYPE_MULTYPART_FORMDATA)) )
{
throw new InvalidArgumentException('Invalid form enctype!');
}
$this->attributes['enctype'] = trim($enctype);
return $this;
}
/**
* @return string
*/
public function getEnctype()
{
return isset($this->attributes['enctype']) ? $this->attributes['enctype'] : null;
}
/**
* Sets form ajax flag.
*
* @param boolean $isAjax
* @return Form
*/
public function setAjax( $ajax = true )
{
$this->ajax = (bool) $ajax;
return $this;
}
/**
* Checks if form is ajax.
*
* @return boolean
*/
public function isAjax()
{
return $this->ajax;
}
/**
* @return boolean
*/
public function getAjaxResetOnSuccess()
{
return $this->ajaxResetOnSuccess;
}
/**
* @param boolean $resetForm
* @return Form
*/
public function setAjaxResetOnSuccess( $resetForm )
{
$this->ajaxResetOnSuccess = (bool) $resetForm;
return $this;
}
/**
* @return string
*/
public function getAjaxDataType()
{
return $this->ajaxDataType;
}
/**
* @param string $ajaxDataType
* @return Form
*/
public function setAjaxDataType( $ajaxDataType )
{
$this->ajaxDataType = trim($ajaxDataType);
return $this;
}
/**
* @param string $eventType
* @param callback $function
*/
public function bindJsFunction( $eventType, $function )
{
$this->bindedFunctions[$eventType][] = $function;
}
/**
* Adds form element.
*
* @param mixed
* @return Form
* @throws InvalidArgumentException
* @throws LogicException
* @throws InvalidArgumentException
*/
public function addElement( $element )
{
if ( !$element instanceof FormElement )
{
throw new InvalidArgumentException('Provided element is not instance of FormElement class!');
}
if ( $element->getName() === null )
{
throw new LogicException('Form element with empty name was added!');
}
if ( array_key_exists($element->getName(), $this->elements) )
{
throw new LogicException('Duplicated form element name! Form element with name `' . $element->getName() . '` already exists!');
}
if ( $element instanceof Submit )
{
$this->submitElements[$element->getName()] = $element;
}
else
{
$this->elements[$element->getName()] = $element;
}
return $this;
}
/**
* Returns form element by name.
*
* @param string $name
* @return FormElement
*/
public function getElement( $name )
{
return empty($this->elements[$name]) ? null : $this->elements[$name];
}
public function deleteElement( $elementName )
{
if ( empty($elementName) )
{
return;
}
if ( array_key_exists($elementName, $this->elements) )
{
unset($this->elements[$elementName]);
}
}
/**
* Returns all form elements.
*
* @return array
*/
public function getElements()
{
return $this->elements;
}
/**
* Returns form submit element by name.
*
* @param string $name
* @return FormElement
* @throws InvalidArgumentException
*/
public function getSubmitElement( $name )
{
if ( !$name || !isset($this->submitElements[$name]) )
{
throw new InvalidArgumentException('Cant find element with name `' . $name . '`!');
}
return $this->submitElements[$name];
}
/**
* Validates added form elements.
*
* @param array $data
* @return boolean
* @throws InvalidArgumentException
*/
public function isValid( $data )
{
$valid = true;
if ( !is_array($data) )
{
throw new InvalidArgumentException('Array should be provided for validation!');
}
/* @var $element FormElement */
foreach ( $this->elements as $element )
{
$element->setValue(( isset($data[$element->getName()]) ? $data[$element->getName()] : null));
if ( !$element->isValid() )
{
$valid = false;
}
}
return $valid;
}
/**
* Returns form element values.
*
* @return array
*/
public function getValues()
{
$values = array();
/* @var $element FormElement */
foreach ( $this->elements as $element )
{
$values[$element->getName()] = $element->getValue();
}
return $values;
}
/**
* Sets form element values.
*
* @param array $values
*/
public function setValues( array $values )
{
/* @var $element FormElement */
foreach ( $this->elements as $element )
{
if ( isset($values[$element->getName()]) )
{
$element->setValue($values[$element->getName()]);
}
}
}
/**
* Returns errors array for all form elements.
*
* @return array
*/
public function getErrors()
{
$errors = array();
/* @var $value FormElement */
foreach ( $this->elements as $key => $value )
{
$errors[$key] = $value->getErrors();
}
return $errors;
}
/**
* Resets all form elements values.
*
* @return Form
*/
public function reset()
{
/* @var $element FormElement */
foreach ( $this->elements as $element )
{
$element->setValue(null);
}
return $this;
}
/**
* Returns rendered HTML code of form object.
*
* @param string $formContent
* @param string $decorator
* @return string
*/
public function render( $formContent, array $params = array() )
{
$formElementJS = '';
/* @var $element FormElement */
foreach ( $this->elements as $element )
{
$formElementJS .= $element->getElementJs() . PHP_EOL;
$formElementJS .= "form.addElement(formElement);" . PHP_EOL;
}
$formInitParams = array(
'id' => $this->getId(),
'name' => $this->getName(),
'reset' => $this->getAjaxResetOnSuccess(),
'ajax' => $this->isAjax(),
'ajaxDataType' => $this->getAjaxDataType(),
'validateErrorMessage' => $this->emptyElementsErrorMessage,
);
$jsString = " var form = new PeepForm(" . json_encode($formInitParams) . ");window.peepForms[form.name] = form;
" . PHP_EOL . $formElementJS . "
if ( form.form )
{
$(form.form).bind( 'submit', {form:form},
function(e){
return e.data.form.submitForm();
}
);
}
PEEP.trigger('base.onFormReady.' + form.name, [], form);
PEEP.trigger('base.onFormReady', [form]);
";
foreach ( $this->bindedFunctions as $bindType => $binds )
{
if ( empty($binds) )
{
continue;
}
foreach ( $binds as $function )
{
$jsString .= "form.bind('" . trim($bindType) . "', " . $function . ");";
}
}
PEEP::getDocument()->addOnloadScript($jsString, 10);
$hiddenFieldString = '';
/* @var $value PEEP_FormElement */
foreach ( $this->elements as $value )
{
if ( $value instanceof HiddenField )
{
$hiddenFieldString .= $value->renderInput() . PHP_EOL;
}
}
return UTIL_HtmlTag::generateTag('form', array_merge($this->attributes, $params), true, PHP_EOL . $hiddenFieldString . $formContent . PHP_EOL);
}
}