MACRO содержит средства для решения проблемы автозаполнения полей формы после submit-а в том случае, если отправленные данные содержали ошибки (ошибки валидации). Стоит, правда, отметить, что в последнее время все большую популярность набирают различные средства для проведения валидации на стороне клиента или при помощи Ajax-запросов. Тем не менее, в данном разделе мы осветим некоторые моменты использования тегов группы FormTags, которые умеют генерить html-аналоги тегов форм и элементов форм.
Итак, группа тегов FormTags используется для следующих целей:
Какие наиболее важные теги из группы FormTags существуют:
Рассмотрим небольшой пример, в котором мы соберем сразу все:
Предположим, что у нас есть вот такой MACRO-шаблон:
{{form name="my_form" method="POST"}} {{form:errors to='$fields_errors'/}} {{list using='$fields_errors'}} Errors: <ol class="form_errors"> {{list:item}} <li>{$item.message}</li> {{/list:item}} </ol> {{/list}} <table> <tr> <td>{{label for="title" error_class="error"}}Title{{/label}}</td> <td>{{input type="text" id="title" name="title" title="Title" error_class="error"/}}</td> <?php $types = array(array('id' => 10, 'name' => 'TypeA'), array('id' => 20, 'name' => 'TypeB')); ?> {{select_options_export from="$types" to="$types_as_options" key_field="id" text_field="name"/}} <td><label for="type">Select type</label></td> <td>{{select name="type" id="type" title="Type" options="$types_as_options" error_style="style_of_error"/}}</td> <tr> <td colspan='2'><input type="submit" value='Run' /></td> </tr> </table> <input type="hidden" name="action" value='create'/> {{/form}}
Пусть у нас где-то есть php-скрипт, который используется этот шаблон. При помощи этого скрипта мы продемонстрируем, как формы повторно получают данные:
<?php set_include_path(dirname(__FILE__) . '/' . PATH_SEPARATOR . 'path/to/limb/' . PATH_SEPARATOR . get_include_path()); require_once('limb/macro/common.inc.php'); $config = new lmbMacroConfig($cache_dir = dirname(__FILE__ ) . '/cache/', $is_force_compile = false, $is_force_scan = false); $macro = new lmbMacroTemplate('form.phtml', $config); if(count($_POST)) { $error_list = array(); $error_list[] = array('message' => 'Error in {field}', 'fields' => array('field' => 'title')); $error_list[] = array('message' => 'Other error in {field}', 'fields' => array('field' => 'type')); $macro->set('form_my_form_error_list', $error_list); $macro->set('form_my_form_datasource', $_POST); } echo $macro->render(); ?>
При первом запуске этого скрипта мы получим:
<form name="my_form" method="POST"> <table> <tr> <td><label for="title">Title</label></td> <td><input type="text" id="title" name="title" title="Title" value="" /></td> <td><label for="type">Select type</label></td> <td><select name="type" id="type" title="Type"><option value="10">TypeA</option><option value="20">TypeB</option></select></td> <tr> <td colspan='2'><input type="submit" value='Run' /></td> </tr> </table> <input type="hidden" name="action" value='create'/> </form>
Теперь попробуем заполнить поля и отправить форму. Мы должны получить нечто подобное:
<form name="my_form" method="POST"> Errors: <ol class="form_errors"> <li>Error in Title</li> <li>Other error in Type</li> </ol> <table> <tr> <td><label for="title" class="error">Title</label></td> <td><input type="text" id="title" name="title" title="Title" class="error" value="fds" /></td> <td><label for="type">Select type</label></td> <td><select name="type" id="type" title="Type" style="style_of_error"><option value="10">TypeA</option><option value="20" selected="true">TypeB</option></select></td> <tr> <td colspan='2'><input type="submit" value='Run' /></td> </tr> </table> <input type="hidden" name="action" value='create'/> </form>
Обратите внимание, что тег {{label}} для первого поля ввода сгенерил <label> с классом «error», так как для поля была указана ошибка валидации (см. [fields ⇒ array('field' ⇒ 'title')]), а в теге {{label}} был указан атрибут error_class Такой же способ пометки ошибочного поля мы использовали для {{input}}-а.
Для передачи данных в форму мы использовать 2 переменные:
$macro->set('form_my_form_error_list', $error_list); $macro->set('form_my_form_datasource', $_POST);
В качестве xxx указывается идентификатор (id) формы или ее name (в зависимости от того, что указано). При использовании пакета VIEW и класса lmbMacroView передача данных в форму производится автоматически.
{{label for="title"}}Title{{/label}} {{input type="text" id="title"}}
Результат:
<label for="title">Title</label> <input type="text" id="title" name="title">
Обсуждение