База данных динамической формы имеет следующую структуру. В таблице 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(); ?>
Ниже представлен код добавления поля:
```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>