[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP класс для рисования HTML форм
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Игорь_Vasinsky
обновил код
Класс рисования формы и валидатор

<?php
header("Content-Type: text/html;charset=utf-8");
session_start();
error_reporting(-1);

class Validate{
protected $rules;
private $errors = array();
private $data = array();

//Манипуляция с данными
// float - к дробному числу
// string - к строке
// sha1 - сделает hash алгоритмом sha1
// trim - утсечёт пробелы
// html - аналог strip_tags()

//Примечание
// regexp[шаблон с делиметерами]
// length[мин,макс]
// code[index эл-та в $_SESSION] - для капчи
// confirm[имя поля с которым сравнивается]
//


protected $text_error = array(
'notempty' => 'Поле не может быть пустым',
'length' => 'Поле содержит неверное кол-во символов',
'email' => 'Поле заполнено не корректно',
'regexp' => 'Поле заполнено не корректно',
'code' => 'Введён не правильный защитный код',
'confirm'=> 'Введённые пароли не совпадают',
'id'=>'Поле заполнено не верно, ожидаются только цифры'
);

public function __construct(){

}


protected function addRules($rules){
$this->rules[] = $rules;
return $this;
}

protected function _empty($nameTag){
if(empty($_REQUEST[$nameTag]))
$this->errors[$nameTag]['notempty'] = $this->text_error['notempty'];
else
$this->insertData($nameTag);
}

protected function _id($nameTag){
if(!is_numeric($_REQUEST[$nameTag])){
$this->errors[$nameTag]['id'] = $this->text_error['id'];
}
else
$this->insertData($nameTag);
}

protected function _float($nameTag){
$_REQUEST[$nameTag] = (float)$_REQUEST[$nameTag];
$this->insertData($nameTag);
}

protected function _sha1($nameTag){
$_REQUEST[$nameTag] = sha1($_REQUEST[$nameTag]);
$this->insertData($nameTag);
}

protected function _string($nameTag){
$_REQUEST[$nameTag] = (string)$_REQUEST[$nameTag];
$this->insertData($nameTag);
}

protected function _length($nameTag, $tv){
$limit = rtrim($tv, ']');

if(empty($limit[0])) return;

$t = explode(',',$limit[0]);
$min = (int)$t[0];
$max = isset($t[1]) ? (int)$t[1] : 2000;
$length = mb_strlen(trim($_REQUEST[$nameTag]), 'utf-8');

if($length<$min || $length>$max)
$this->errors[$nameTag]['length'] = $this->text_error['length'];
else
$this->insertData($nameTag);
}

protected function _trim($nameTag){
$_REQUEST[$nameTag] = trim($_REQUEST[$nameTag]);
$this->insertData($nameTag);
}

protected function _html($nameTag){
$_REQUEST[$nameTag] = strip_tags($_REQUEST[$nameTag]);
$this->insertData($nameTag);
}

protected function _email($nameTag){
if(!filter_var($_REQUEST[$nameTag], FILTER_VALIDATE_EMAIL))
$this->errors[$nameTag]['email'] = $this->text_error['email'];
else
$this->insertData($nameTag);

}

protected function _url($nameTag){
if(!filter_var($_REQUEST[$nameTag], FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED))
$this->errors[$nameTag]['url'] = $this->text_error['url'];
else
$this->insertData($nameTag);
}

protected function _confirm($nameTag, $tv){
$confirm = rtrim($tv, ']');

if(!isset($this->errors[$tv])){
if($_REQUEST[$nameTag] != $_REQUEST[$confirm]){
unset($this->errors[$nameTag]['errors']);
$this->errors[$nameTag]['confirm'] = $this->text_error['confirm'];
}
}
}


protected function _regexp($nameTag, $tv){
if(!preg_match($tv, $_REQUEST[$nameTag])){
$this->errors[$nameTag]['regexp'] = $this->text_error['regexp'];
}
else
$this->insertData($nameTag);
}

protected function _code($nameTag, $tv){
// if(!isset($_SESSION[$tv])) return;

if($_SESSION[$tv] != $_REQUEST[$nameTag])
$this->errors[$nameTag]['code'] = $this->text_error['code'];
else
$this->insertData($nameTag);
}

private function parseRules($target){
$this->target = $target;

foreach($target as $nameTag=>$l){

$tempRules = explode('|',$l);

foreach($tempRules as $k=>$v){
if(preg_match("#code#", $v)){
$tv = rtrim(strtr($v, array('code['=>'')),']');

$v = 'code';
}
elseif(preg_match("#regexp#", $v)){
$tv = rtrim(strtr($v, array('regexp['=>'')),']');
$v = 'regexp';
}
else{
$v = explode("[", $v);
$tv = isset($v[1]) ? $v[1] : null;
$v = $v[0];
}
switch($v){
case 'notempty' :
$this->_empty($nameTag);
break;
case 'length':
if($tv != null)
$this->_length($nameTag, $tv);
break;
case 'trim' :
$this->_trim($nameTag);
break;
case 'html' :
$this->_html($nameTag);
break;
case 'email' :
$this->_email($nameTag);
break;
case 'confirm' :
$this->_confirm($nameTag,$tv);
break;
case 'regexp' :
$this->_regexp($nameTag,$tv);
break;
case 'code' :
$this->_code($nameTag,$tv);
break;
case 'id' :
$this->_id($nameTag);
break;
case 'float' :
$this->_int($nameTag);
break;
case 'string' :
$this->_int($nameTag);
break;
case 'sha1' :
$this->_int($nameTag);
break;
}
}
}

}


private function insertData($nameTag){
$this->data[$nameTag] = $_REQUEST[$nameTag];
}

public function getData(){
return $this->data;
}

public function getAllErrors(){
return $this->errors;
}

public function getErrors(){
$firstErrors = array();

foreach($this->errors as $k=>$err){
$firstErrors[$k] = array_shift($err);
}

return $firstErrors;
}

protected function validate(){
if(is_array($this->rules)){
foreach($this->rules as $k=>$v){
$this->parseRules($v);
}

if(count($this->errors)>0){
$success = false;
}
else{
$success = true;
}
return $success;
}
}
}



class HTMLForm extends Validate{
public $action;
public $method;
public $nameForm;
public $paramsForm;

const EndTagInput = ' rel="i"/>';
const EndTagSelectInside = ' rel="s"';
const EndTagSelect = '</select>';
const EndTagOption = ' rel="o">';
const EndTagTextarea = ' rel="t">';

protected $elems = array(
'input'=>'<input rel="i"/>',
'select'=>'<select rel="s"></select>',
'option'=>'<option rel="o"></option>',
'textarea'=>'<textarea rel="t"></textarea>'
);

public function __construct(){
return parent::__construct();
}

public function setRules($rules){
parent::addRules(array($this->name=>$rules));
return $this;
}

//создание свойства класса динамически
public function createProperty($name, $value){
$this->$name = $value;
}
//проверка наличия свойства у класса
private function checkProperty($name){
if(!property_exists(__CLASS__, $name)){
$this->createProperty($name,$name);
$this->name = $name;
}
else
$this->name = $name;
}
//начало рисования формы
//Самые распространнённые у формы 3 мараметра, буду задавать обязательными аргументами

public function open($nameForm, $action, $method, $arg = null){
$this->action = $action;
$this->method = $method;
$this->arg = $arg;
//если был 3й аргумент - соберём все параметры в стрку вида arg1="param1" arg2="param2"
if(is_array($this->arg)){

$this->paramsForm = null;

foreach($this->arg as $attr=>$val){
if($val == null)
$this->paramsForm .= $attr;
else
$this->paramsForm .= ' '.$attr.'="'.$val.'" ';
}
}

$this->form[$this->nameForm] = array();
$this->nameForm = $nameForm;
$this->form[$this->nameForm]['begin'] = '<form name="'.$this->nameForm.'" method="'
.$this->method.'" action="'.$this->action.'" '.$this->paramsForm.'>';
}
//Закрывает формы (чисто для солидарности:))
public function close(){
$this->form[$this->nameForm]['end'] = '</form>';
return $this->form[$this->nameForm];
}
//Метод парсит тег и производит вставки атрибутов и т.д.
private function collectElem($name, $elem, $endTag){
$this->elem = $elem;
$this->checkProperty($name);
$this->parentMethodName = __CLASS__.'::set'.ucfirst($this->elem);
$this->parentMethod = strtr($this->elems[$this->elem], array($endTag=>' name="'.$this->$name.'"'.$endTag));
}
//Собирает textarea
public function setTextarea($name){
$this->collectElem($name, 'textarea', self::EndTagTextarea);
return $this;
}
//собирает input всех типов
public function setInput($name){
$this->collectElem($name, 'input', self::EndTagInput);
return $this;
}
//инициализирует тег select
public function setSelect($name){
$this->collectElem($name, 'select', self::EndTagSelectInside);
return $this;
}
//собирает теги option
public function setOption($name){
$this->checkProperty($name);
$this->parentMethodName = __METHOD__;
$this->parentMethod = strtr($this->elems['option'], array(self::EndTagOption =>' value="'.$this->$name.'"'.self::EndTagOption));
return $this;
}
//устанавливает атрибуты тегам
public function setAttr($attr){
$this->attr = explode('|', $attr);
if(is_array($this->attr)){

$this->parentMethod = strtr($this->parentMethod,
array($this->getEndTag() => ' '.$this->attr[0].'="'.$this->attr[1].'"'.$this->getEndTag()));
}
return $this;
}

//дописывает текст в option,checkbox, radio в поле textarea
public function setText($text){
if(!property_exists(__CLASS__, $text)){
$this->createProperty($text,$text);
$this->text = $text;
}
else
$this->text = $text;

if(is_array($this->attr)){
$this->parentMethod = strtr($this->parentMethod,
array($this->getEndTag() => $this->getEndTag().$this->$text));
}
return $this;
}

//промежуточное сохранение в ассоц массив
private function saveInArray($sub = false,$innerNameSub = null){
if($sub)
$this->form[$this->nameForm][$this->name][] = $this->parentMethod;
else if(!$sub)
$this->form[$this->nameForm][$this->name] = $this->parentMethod;
else if($innerNameSub != null){
$this->form[$this->nameForm][$innerNameSub.'_options'][$this->name] = $this->parentMethod;
return $this->form[$this->nameForm][$innerNameSub.'_options'];
}
}

//формирует Input
public function addInput(){
if(preg_match('#type="radio"|type="checkbox"#', $this->parentMethod))
$this->saveInArray(true);
else
$this->saveInArray();

$this->parentMethod = '<input rel="i"/>';
}
//формирует select
public function addSelect(){
$this->saveInArray();
$this->parentMethod = '<select rel="s"></select>';
}
//формирует textarea
public function addTextarea(){
$this->saveInArray();
$this->parentMethod = '<textarea rel="t"></textarea>';
}
//формирует список option и собирает вместе с указанным select
public function addOption($select){
//ПРомежуточное сохранение вида тега option, далее он храниться в подмассиве select
$this->form[$this->nameForm][$select.'_options'][$this->name] = $this->parentMethod;
$temp = $this->form[$this->nameForm][$select.'_options'];
$this->form[$this->nameForm][$select] = strtr($this->form[$this->nameForm][$select],
array(self::EndTagSelect =>
$temp[$this->name].PHP_EOL.self::EndTagSelect)
);

$this->parentMethod = '<option rel="o"></option>';
return $this;
}
//ничё интересного
private function getEndTag(){
switch($this->parentMethodName){
case __CLASS__.'::setTextarea' : $this->endTag = self::EndTagTextarea; break;
case __CLASS__.'::setInput' : $this->endTag = self::EndTagInput; break;
case __CLASS__.'::setSelect' : $this->endTag = self::EndTagSelectInside; break;
case __CLASS__.'::setOption' : $this->endTag = self::EndTagOption; break;
}
return $this->endTag;
}

public function sendForm($submit){
foreach($this->form[$this->nameForm] as $k=>$elem){
if(strpos($elem, 'type="submit"') !== false){
$t = preg_match('#name="(.*)"#uUs', $elem, $s);

if(isset($_REQUEST[$submit])){
return $this->validate();
}
}
}
}

}

?>


Так задаётся конфиг формы

имитация капчи
$_SESSION['secret'] = 123;

$f = new HTMLForm;

$f->open('aut','','POST');

$login = isset($_POST['my_login']) ? htmlspecialchars($_POST['my_login']) : '';
$email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : '';
$capcha = isset($_POST['capcha']) ? htmlspecialchars($_POST['capcha']) : '';

$f->setInput('my_login')
->
setAttr('type|text')
->
setAttr('value |'.$login)
->
setAttr('placeholder|Введите логин')
->
setRules('notempty|regexp[#[a-z0-9]{3,10}#i]')
->
addInput();

$f->setInput('email')
->
setAttr('type|text')
->
setAttr('value|'.$email)
->
setAttr('placeholder|Введите email')
->
setRules('notempty|email')
->
addInput();

$f->setInput('my_password')
->
setAttr('type|password')
->
setAttr('placeholder|Введите пароль')
->
setRules('notempty|length[4,16]')
->
addInput();

$f->setInput('my_password2')
->
setAttr('type|password')
->
setAttr('placeholder|Подтвердите пароль')
->
setRules('confirm[my_password]')
->
addInput();

$f->setInput('capcha')
->
setAttr('type|text')
->
setAttr('value|'.$capcha)
->
setRules('code[secret]')
->
addInput();

$f->setInput('send')
->
setAttr('type|submit')
->
setAttr('value|Отправить')
->
addInput();


$form = $f->close();
//echo '<pre>' . print_r($form, 1);

if(!$f->sendForm('send')){
$errors = $f->getErrors();
//echo '<pre>' . print_r($errors, 1) . '</pre>';
}
else{
$data = $f->getData();
//echo '<pre>' . print_r($data, 1) . '</pre>';
}


Вот сама форма, которую можно гибко воткнуть в любую вёрстку
<?=$form['begin'];?> 
<?=
$form['my_login'];?> <?=isset($errors['my_login']) ? $errors['my_login'] : null;?><br />
<?=$form['email'];?> <?=isset($errors['email']) ? $errors['email'] : null;?><br />
<?=$form['my_password'];?> <?=isset($errors['my_password']) ? $errors['my_password'] : null;?><br />
<?=$form['my_password2'];?> <?=isset($errors['my_password2']) ? $errors['my_password2'] : null;?><br />
<?=$form['capcha'];?> <?=isset($errors['capcha']) ? $errors['capcha'] : null;?><br/>
<?=$form['send'];?><br />
<?=$form['end'];?>


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.