В данном уроке я продемонстрирую пример создания динамической формы, то есть формы, в которой можно редактировать количество полей и задавать этим полям какие либо свойства. Вся информация о добавленных полях будет храниться в базе данных, а работать с базой мы будем при помощи ORM технологии, описанной в моем предыдущем уроке, в котором Вы можете ознакомиться с особенностями ее работы.
База данных динамической формы имеет следующую структуру.
В таблице fields хранятся данные о полях, а именно:
Также есть таблица forms, куда записывается каждая отправленная пользователем форма и значения статических полей формы, в данном случае электронный адрес пользователя, а значения динамических полей записываются в таблицу fd_values:
Для работы с таблицами создадим следующие классы:
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(); ?> <form method="post" action=""> <table class="field-list"> <thead> <tr> <td>Name</td> <td>Label</td> <td>Type</td> <td></td> </tr> </thead> <tbody> <?php foreach($fields as $field): ?> <tr> <td> <?php echo $field->name; ?> </td> <td> <?php echo $field->label; ?> </td> <td> <?php echo $field->type; ?> </td> <td> <button value="<?php echo $field->id; ?>">Удалить</button> </td> </tr> <?php endforeach; ?> <tr> <td> <input name="name"> </td> <td> <input type="text"> </td> <td> <select name="type"> <option>text</option> <option>password</option> <option>date</option> <option>email</option> <option>number</option> <option>tel</option> </select> </td> <td> <input type="submit" value="Добавить"> </td> </tr> </tbody> </table> </form>
Ниже представлен код добавления поля:
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>
На этом урок окончен. Благодарю за внимание!