[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: PHP класс для рисования HTML форм
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Guest
Цитата (Игорь_Vasinsky @ 1.11.2013 - 10:42)
свали уже. ходишь ноешь в каждой теме. сам никто вообще.

правда глаза колет, да?
redreem
Guest
ты по-любому "кто-то с форума" smile.gif думаешь кроме отчуждения твой анонимизм что-то вызывает? я тож скажу "свали уже", но добавлю: "или авторизируйся" smile.gif
inpost
Он не может авторизироваться, его 20-ый аккаунт забанили же. Кстати, про 20-ый - не шутка smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Invis1ble
А сколько IP-адресов перебанено - несчесть smile.gif

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

inpost
Не, эту подмаску не банили. Когда я банил в своё время, а я лишь парочку забанил, то бан по подмаске и всё. А тут терпят его другие модераторы)

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Invis1ble
Уже, кстати, может. 14 минут примерно как истек срок. Ждем наплыва нового дерьма.
Что-то мы тут заоффтопили, давайте прекращать.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

redreem
Invis1ble
inpost
колитесь, господа! smile.gif
Guest
Invis1ble,
inpost
а что я не так написал, он предоставил код, код ужасного качества. В других темах он говорил, что мега профессионал и 10 лет в программировании, а на самом деле ...

А что на счет бана, то вы забанили от силы 3 аккаунта с моим участием, так что не преувеличивайте.

Ну lekafe я, ну зовут меня Федор Казин, ну и что [ censored ]
Игорь_Vasinsky
ты какую-то фигню пронёс. ты просто нытик Федя. ну что же - ходи и ной дальшё вместо того чтоб учиться. нытиком то оно проще.

о боже.. он мне карму минусанул..беда беда... пойду давиться.. услышать у говнокодера что у меня говнокод biggrin.gif

аргументируй.

_____________
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
Игорь_Vasinsky
кстати, малость поправил класс и дописал валидатор и фильтр.
они так же нарушают концепцию ооп, но меня это сильно не беспокоит. всё работает, использование - простое,мне нравиться.

будет время - выложу с описанием.

_____________
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
redreem
Цитата
lekafe


не, не слышал. видать пропустил сие чудестное пришествие до распятия smile.gif
inpost
redreem
Его пришествие пропустил даже я! Я лишь застал его Х-возвращение smile.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
redreem
inpost
экаж исторический период схлопнули smile.gif 33 дня то хоть продержался? smile.gif
inpost
Класс для простого вывода элементов формы и всё? Без валидации? Точнее ничего подобного в нём не увидел, отсюда кажется бесполезным как таковой...

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Игорь_Vasinsky
по началу выложил без валидации, но цель была с валидацией. просто написал на одном дыхании и сразу выложил, не утерпел.

вот сами классы. не идеал
Свернутый текст
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();
}
}
}
}

}

щас конфиг формы пишется так

Свернутый текст
$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();
}
else{
$data = $f->getData();
}


а рисуется так
<?=$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-2025 Invision Power Services, Inc.