В InstantCMS 1.10 конструктор форм претерпел значительные изменения. Помимо того, что поля форм теперь можно редактировать, формы теперь достаточно гибко настраиваемые:

- для каждой формы вы можете указать свой атрибут action, по умолчанию, он для всех форм »/forms/process»;

- показывать/не показывать заголовок формы;

- выводить только поля формы (например, если поля формы вы хотите вставить в свою форму);

- новый тип поля ссылка (введённое в это поле ссылка будет обработана как активная через go редирект);

- новая опция поля формы «Значение поля ссылкой», при её включении вы можете задать префикс этой ссылки, по умолчанию »/users/hobby/». Т.е. ссылка будет выглядеть как »/префикс/значение_поля».

- ширина поля теперь задается в px;

- автоматическая валидация значений полей формы.

Подробнее об использовании в различных компонентах.

Для начала, в компоненте необходимо подключить сам класс конструктора форм, он теперь системный, находится в /core/classes/form.class.php, подключаем так:

cmsCore::loadClass('form');

Обычно, это делается в конструкторе класса модели компонента. Работа с формой - это три этапа: показ самой формы (её полей), получение значений от пользователя, вывод значений в необходимом месте.

Итак, первое: показ самой формы

$formsdata = cmsForm::getFieldsHtml($form_id);

Статический метод getFieldsHtml вернёт массив полей формы. Вы так же можете передать вторым параметром массив значений полей и третьим параметром флаг показа только обязательных полей. Дальше массив $formsdata можно передать в шаблон и в нём использовать, например, так (подразумевается, что таблица - тег table - уже имеется):

{if $formsdata}
 
    {foreach key=tid item=form from=$formsdata}
 
    <tr>
 
        <td valign="top">
 
            <span>{$form.title}:</span>
 
            {if $form.description}
 
                <div style="color:gray">{$form.description}</div>
 
            {/if}
 
        </td>
 
        <td valign="top">
 
            {$form.field}
 
        </td>
 
    </tr>
 
    {/foreach}
 
{/if}

Второе: получение значений полей

$form_input = cmsForm::getFieldsInputValues($form_id);
$formsdata  = cmsDatabase::escape_string(cmsCore::arrayToYaml($form_input['values']));

Массив $form_input будет содержать в себе:

- массив значений полей $form_input['values'];

- массив ошибок $form_input['errors'].

А переменная $formsdata уже подготовлена для вставки в базу данных. Обратите внимание, массив мы преобразовали в YAML и заискейпили строку для вставки в базу.

Обязательные к заполнению поля вы можете проверить например так:

foreach ($form_input['errors'] as $field_error) {
 
    if($field_error){ cmsCore::addSessionMessage($field_error, 'error'); cmsCore::redirectBack(); }
 
}

И третье: показ значений

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

$formsdata = cmsForm::getFieldsValues($form_id, $form_array);

Обратите внимание, $form_array - это уже преобразованная в массив строка YAML. Т.е. если из базы мы получили значение в формате YAML, его нужно преобразовать в массив, например так:

$form_array = cmsCore::yamlToArray($formsdata);

И осталось нам всего то передать в шаблон переменную $formsdata и там показать, например так:

{if $formsdata}
 
    <table width="100%" cellspacing="0" cellpadding="2">
 
        {foreach key=tid item=form from=$formsdata}
 
            {if $form.field}
 
                <tr>
 
                    <td valign="top" width="140px">
 
                        <strong>{$form.title}:</strong>
 
                    </td>
 
                    <td valign="top">
 
                        {$form.field}
 
                    </td>
 
                </tr>
 
            {/if}
 
        {/foreach}
 
     </table>
 
{/if}

Класс можно легко расширить, добавив обработку новых полей. На примерах, вы можете посмотреть работу с формами в компонентах users, board.

 
разработка/компоненты/интеграция_с_конструктором_форм.txt · Последние изменения: 2015/02/11 23:39 От Aquarius