Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Странная работа с формами на PHP либо как упростить себе жизнь

Anna | 29.05.2014 | нет комментариев
Всем здравствуй! Хочу показать как дозволено трудиться с формами не прибегая к «фримворкам» в несколько килобайт кода.

Введение

Как то раз пришлось мне сделать маленький план портала с огромным числом форм как в «back» так и в «front» и здесь появился вопрос что применять? Вначале решил прикрутить что то на подобии Symfony. Но при разработке вышло такое число строк кода что через некоторое время я сам начал путаться. И здесь я решил изобрести велосипед.

Разработка

Для начала сотворил все таблицы в БД, вот скажем листинг одной:

CREATE TABLE IF NOT EXISTS `cms_articles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) DEFAULT NULL,
  `article` text,
  `author` varchar(255) DEFAULT NULL,
  `edited` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `url` varchar(100) DEFAULT NULL,
  `rating` int(10) NOT NULL DEFAULT '0',
  `views` int(10) NOT NULL DEFAULT '0',
  `comments` int(10) unsigned NOT NULL DEFAULT '0',
  `parent` int(10) NOT NULL DEFAULT '0',
  `key` text NOT NULL,
  `desc` text NOT NULL,
  `tags` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

Дальнейшим этапом стало написание HTML кода для формы. 
И здесь начинается суть моего метода: наименование элементов в образце должно соответствовать наименованиям полей таблицы.

<body>
<font size='5px' class='title'>[page:name]</font>
<span style="float: right; padding-top: 10px;">[page:path]</span>

[page:message]

<form action="" method="post" name="Form" enctype="multipart/form-data" accept-charset="UTF-8">

<div>
<ul>
	<li><a href="#tab1">Основные параметри статьи</a></li>
	<li class=""><a href="#tab2">Текст статьи</a></li>
</ul>

<div>

<div>
	<label>Заголовок</label><span>*</span><br>
		<input type="text" value="" name="title">
	<br>
	<label>Заголовок должен содержать толк страницы</label>    
</div>

<div>
	<label>Родитель</label><br>                       	
	<select name="parent" id="">
		<option selected value="153">- без родителя -</option>
		[page:parent]
	</select><br>
	<label>Содержимое, к которому добавляется страница</label></div><div>

	<label>Адрес</label><br>
	<input type="text" value="" name="url">
	<br>
	<label>URL адрес страницы</label>    
</div>

<div>
	<label>Автор</label><br>
		<input type="text" value="" name="author">
	<br>
	<label>Автор статти ...</label>    
</div>

<div>
	<label>Изложение</label><br>                       	
	<textarea  class="" name="desc" rows="2"></textarea><br>
  	<label>Короткое изложение сайта. Применяются поисковыми системами (Яндекс, Google...)</label>
</div>

<div>
	<label>Ключевые слова</label><br>                       	
	<textarea name="key" rows="2"></textarea><br> 
	<label>Ключевые слова через запятую. Применяются поисковыми системами (Яндекс, Google...)</label>
</div>

<table width="600px">
<tr><td>

<div>
	<label>Рейтинг</label><br>
		<input type="text" value="" name="rating">
	<br>
	<label>Рейтинг статти ...</label>    
</div>

</td><td>

<div>
	<label>Просмотры</label><br>
		<input type="text" value="" name="views">
	<br>
	<label>число просмотров ...</label>    
</div>

</td></tr>
</table>

<div>
	<label>Разрешыть коментирование</label><br>  
	<span><input name="comments" type="radio" value="1" checked>Да</span>
	<span><input name="comments" type="radio" value="0">Нет</span><br>
	Пользователи могут оставлять коментарии.<br>
</div>

</div>

<div>

<div>
	<label>Текст</label><br>                       	
	<textarea name="article" rows="28" id="article"></textarea><br>
  	<label>Текст страницы. Разрешено применение HTML тегов</label>
</div>

<div>
	<label>Теги</label><br>
		<input type="text" style="width: 200px;" value="" name="tags" id="tags"><br>
	<label>Теги к даному тексту (Вводить через кому).</label>    
</div>

<div>
	<input type="submit" name="submit" id="submit" value="Сберечь">
</div>

</div>
</div>		
</form>
</body>

Вот как выглядит форма (Орфографические ошибки на рисунке остались от клиента я их не правил):

Дальше сберег образец в файл, под наименованием «article.tpl». И начал писать обработчик. Для его написание решил применять DOM кто хочет пускай перепишет под «simpleDom».

Вот крошечная функция которая находит элемент по наименованию а не по ID.

	private function GetElementByName($_dom, $_name){
		// Experimental search by name
		$xpath = new DOMXPath($_dom);
		return $xpath->query('//*[@name="'.$_name.'"]')->item(0);
	}

Вот здесь я написал функцию которая механически заполняет форму из таблицы. Рассматривая тип элемента и его свойства.

	public function LoadShowFormAll($query, $template) {

	$page_encoding = 'UTF-8';

    $dom = new DomDocument();
    @$dom->loadHTML('<meta http-equiv="content-type" content="text/html; charset=' . $page_encoding . '">' .  file_get_contents(TMP_DIR.$template.".tpl"));

    if ($result = $this->base->select($query)) {

	foreach ($result as $key => $value) {	
        $obj = $this->GetElementByName($dom, $value['name']);  //$dom->getElementById($val->name);

            switch ($obj->nodeName) {
                case "input":
                    if ($obj->getAttribute('type') == 'radio') {

                        $optionTags = $dom->getElementsByTagName('input');
                        for ($i = 0; $i < $optionTags->length; $i  ) {

                            if ($optionTags->item($i)->getAttribute('name') == $value['name']) {
                                if ($optionTags->item($i)->getAttribute('value') == $value['param']) {

                                    $optionTags->item($i)->SetAttribute('checked', 'checked');
                                }
                            }
                        }

                        if ($value['param'] == 1) {
                            $obj->SetAttribute('checked', 'checked');
                        }
                    } else
                    if ($obj->getAttribute('type') == 'checkbox') {

                        if ($value['param'] == 1) {
                            $obj->SetAttribute('checked', 'checked');
                        }
                    } else {
                        $obj->SetAttribute('value', $value['param']);
                    }
                    break;

                case "textarea":
                    $obj->nodeValue = $value['param'];
                    break;

                case "select":
                    $optionTags = $obj->getElementsByTagName('option');
                    for ($i = 0; $i < $optionTags->length; $i  ) {

                        if ($optionTags->item($i)->getAttribute('value') == $value['param']) {
                            $optionTags->item($i)->SetAttribute('selected', 'selected');
                        }
                    }
                    break;

                case "":
                    break;
			}
		}
	}	
	preg_match_all("#<body>(.*)</body>#isUu", $dom->saveHTML(), $str);	
	return $str[1][0];
	}

Применять дальнейшим образом:

echo $Core->LoadShowForm('SELECT * FROM cms_articles WHERE id='.(int)($get_id), 'article');

Позже этого появилась надобность сберегать значения в базу и изменять их для этих заданий я написал две примитивные функции.

	public function InsertNewValue($post, $table, $custom = null) {

    $query = '';
    $sep = false;
    $tmp = array();

    if ($result = $this->base->query("SELECT * FROM `$table` LIMIT 1")) {
        $fields = $result->fetch_fields();
    } else {
        return false;
        exit();
    }

    foreach ($post as $col => $val) {
        $col = mysql_real_escape_string($col);
        $val = mysql_real_escape_string($val);

        $tmp[$col] = $val;
    }

    if ($custom != null) {

        foreach ($custom as $col => $val) {
            $col = mysql_real_escape_string($col);
            $val = mysql_real_escape_string($val);

            $tmp[$col] = $val;
        }
    }

    foreach ($tmp as $column => $val) {

        foreach ($fields as $fval) {
            if ($column == $fval->name) {

                if ($sep == true) {
                    $query .= ", `$column` = '$val'";
                } else {
                    $query .= "`$column` = '$val'";
                }
                $sep = true;
            }
        }
    }

    return $this->base->query("INSERT INTO `$table` SET " . $query);
	}

	function UpdateValue($post, $table, $custom = null, $where) {

    $query = '';
    $sep = false;
    $tmp = array();

    if ($result = $this->base->query("SELECT * FROM `$table` LIMIT 1")) {
        $fields = $result->fetch_fields();
    } else {
        return false;
        exit();
    }

    foreach ($post as $col => $val) {
        $col = mysql_real_escape_string($col);
        $val = mysql_real_escape_string($val);

        $tmp[$col] = $val;
    }

    if ($custom != null) {

        foreach ($custom as $col => $val) {
            $col = mysql_real_escape_string($col);
            $val = mysql_real_escape_string($val);

            $tmp[$col] = $val;
        }
    }

    foreach ($tmp as $column => $val) {

        foreach ($fields as $fval) {
            if ($column == $fval->name) {

                if ($sep == true) {
                    $query .= ", `$column` = '$val'";
                } else {
                    $query .= "`$column` = '$val'";
                }
                $sep = true;
            }
        }
    }

    return $this->base->query("UPDATE `$table` SET " . $query . " WHERE " . $where);
	}

Ну и остальная часть:

$Core->UpdateValue($_POST, 'cms_articles', null, ' id='.(int)($get_id));	// обновление
$Core->InsertNewValue($_POST, 'cms_articles'); 

Завершение

Лично мне дюже понравилось трудиться таким образом с формами (При том что в плане их было примерно: 250).
При необходимости добавления в форму элемента необходимо прописать код в образце и добавить значение в базе и все.

Огромное спасибо!

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB