Уроки Динамическая форма PHP
7 ноября 2013
3217
динамическая форма PHP

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

Сложность Рубрика PHP
Демонстрация » Скачать »

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

 

База данных динамической формы имеет следующую структуру.

 

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

 

В таблице 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();
?>


<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>

 

 

На этом урок окончен. Благодарю за внимание!





Евгений Болдырев