Справочники, инструменты, документация

PHP: Динамическая форма

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

База данных динамической формы имеет следующую структуру. В таблице fields хранятся данные о полях, а именно:

  • name – атрибут name;
  • type – атрибут type;
  • label – подпись поля.

Также есть таблица forms, куда записывается каждая отправленная пользователем форма и значения статических полей формы, в данном случае электронный адрес пользователя, а значения динамических полей записываются в таблицу fd_values:

  • form – внешний ключ-ссылка на отправленную форму;
  • field – ссылка на поле;
  • value – значение поля.

Для работы с таблицами создадим следующие классы:

class Form extends MyORM {
 protected $table = 'forms';
 protected static $tableName = 'forms';
 public $fieldsList = array('id', 'email');
}

class Field extends MyORM {
 protected $table = 'fields';
 protected static $tableName = 'fields';
 public $fieldsList = array('id', 'name', 'type', 'label');
}

class Value extends MyORM {
 protected $table = 'fd_values';
 protected static $tableName = 'fd_values';
 public $fieldsList = array('id', 'form', 'field', 'value');
}

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

<?php   
$fields = Field::find();
?>
<form method="post" action="" class="send-form">
 <label>Email: 
    <input name="email" class="text-field" type="email" required>
 </label>
<?php
 foreach($fields as $field):
?>
 <label><?php echo $field->label; ?>: 
    <input name="<?php echo $field->name; ?>" class="text-field" type="<?php echo $field->type; ?>">
 </label>

<?php 
 endforeach;
?>
<input name="send" type="submit" value="Отправить">

</form>

Теперь у нас есть форма, можем приступить к получению данных с нее и сохранить эти данные в бд:

if(isset($_POST['send']))
{
 unset($_POST['send']);

 $pdo = new PDOConfig();
 $form = new Form($pdo);

 $form->email = $_POST['email'];

 $form->save();

 unset($_POST['email']);

 foreach($_POST as $key => $value)
 {
 $fd = Field::findFirst(array('name' => $key));
 if($fd)
 {
 $val = new Value($pdo);


 $val->form = $form->id;
 $val->field = $fd->id;
 $val->value = $value;

 $val->save();
 } 
 }
}

Страница «поля» у нас содержит таблицу со всеми созданными полями, в последней строке которой форма для добавления поля:

<?php $fields = Field::find(); ?>

Name Label Type
name; ?> label; ?> type; ?>

 Ниже представлен код добавления поля:

```php
if(isset($_POST['delete']))
{
 $fordel = $fields = Field::findFirst(

array('id' => $_POST['delete']));
 $fordel->delete();
}

elseif(isset($_POST['add']))

{
 $pdo = new PDOConfig();
 $new = new Field($pdo);
 $new->name = $_POST['name'];
 $new->type = $_POST['type'];
 $new->label = $_POST['label'];
 $new->save();
}

На очереди последняя страница – «результаты». На этой странице мы уже ничего не сохраняем, только выводим результаты отправленных пользователем форм:

<?php 

 $forms = Form::find(array('condition' => 'LIMIT 10'));
 $result = array();

 foreach($forms as $form)
 {
 $tmp['form'] = $form;
 $tmp['values'] = Value::find(array('where' => array('form' => $form->id)));
 $result[] = $tmp;
 }
?>

<ul class="form-list">

<?php 
 foreach($result as $item):
?>

<li>
<?php echo $item['form']->email; ?>
 <ul>
<?php foreach($item['values'] as $value): ?>
 <li><?php echo $value->value; ?> </li>
 <?php endforeach; ?>
 </ul>
</li>

<?php
 endforeach;
?>
</ul>

Скачать пример