Всем привет.
В InstantCMS 1.10 конструктор форм претерпел значительные изменения. Помимо того, что поля форм теперь можно редактировать, формы сами по себе достаточно гибко настраиваемые.
— показывать/не показывать заголовок формы;
— выводить только поля формы (например, если поля формы вы хотите вставить в свою форму);
— новый тип поля ссылка (введенное в это поле ссылка будет обработана как активная через go редирект);
— новая опция поля формы "Значение поля ссылкой", при ее включении вы можете задать префикс этой ссылки, по умолчанию "/users/hobby/". Т.е. ссылка будет выглядеть как "/префикс/значение_поля".
— ширина поля теперь задается в px;
— автоматическая валидация значений полей формы.
Я обычно это делаю в конструкторе класса модели компонента.
Работа с формой — это три этапа: показ самой формы (ее полей), получение значений от пользователя, вывод значений в необходимом месте.
Статический метод getFieldsHtml вернет массив полей формы. Вы так же можете передать вторым параметром массив значений полей и третьим параметром флаг показа только обязательных полей.
Дальше массив $formsdata можно передать в шаблон и в нем использовать например так (подразумевается, что таблица — тег table — уже есть):
Массив $form_input будет содержать в себе:
— массив значений полей $form_input['values'];
— массив ошибок $form_input['errors'].
А переменная $formsdata уже подготовлена для вставки в базу данных. Обратите внимание, массив мы преобразовали в YAML и заэскейпили строку для вставки в базу.
Обязательные к заполнению поля вы можете проверить например так:
Теперь мы эти значения получаем
Обратите внимание, $form_array — это уже преобразованная в массив строка YAML. Т.е. если из базы мы получили значение в формате YAML, его нужно преобразовать в массив, например так:
И осталось нам всего то передать в шаблон переменную $formsdata и там показать, например так:
На этом все, в классе cmsForm все методы снабжены комментариями, любопытные и желающие разобраться думаю без труда поймут логику работы. Класс можно легко расширить, добавив обработку новых полей.
На примерах, вы можете посмотреть работу с формами в компонентах users, board.
Всем спасибо за внимание, попытался написать наиболее понятно, если возникли вопросы, смело пишите в комментариях.
В InstantCMS 1.10 конструктор форм претерпел значительные изменения. Помимо того, что поля форм теперь можно редактировать, формы сами по себе достаточно гибко настраиваемые.
Итак, что нового:
— для каждой формы вы можете указать свой атрибут action, по умолчанию он для всех форм "/forms/process";— показывать/не показывать заголовок формы;
— выводить только поля формы (например, если поля формы вы хотите вставить в свою форму);
— новый тип поля ссылка (введенное в это поле ссылка будет обработана как активная через go редирект);
— новая опция поля формы "Значение поля ссылкой", при ее включении вы можете задать префикс этой ссылки, по умолчанию "/users/hobby/". Т.е. ссылка будет выглядеть как "/префикс/значение_поля".
— ширина поля теперь задается в px;
— автоматическая валидация значений полей формы.
Подробнее об использовании в различных компонентах.
Для начала в компоненте необходимо подключить сам класс конструктора форм, он теперь системный, находится в /core/classes/form.class.php, подключаем как:
cmsCore::loadClass('form');
Работа с формой — это три этапа: показ самой формы (ее полей), получение значений от пользователя, вывод значений в необходимом месте.
Итак, первое, показ самой формы
Все на самом деле очень просто:
$formsdata = cmsForm::getFieldsHtml($form_id);
Дальше массив $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['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 = cmsCore::yamlToArray($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.
Всем спасибо за внимание, попытался написать наиболее понятно, если возникли вопросы, смело пишите в комментариях.
Реклама #
deltas 12 лет назад #
Спасибо за облегчение работы начинающим!
Evo 12 лет назад #
darkheart 12 лет назад #
• Mike • 12 лет назад #
— можно добавить поле и обрабатывать при помощи js… например, из состава jquery.ui datepicker
«можно чекбоксы вывести чтобы галочками несколько вариантов значений выбрать или нет?»
— “галочками” можно вывести одну, со значениями “да/нет”, группой можно вывести радио-кнопки с выбором единственного значения из нескольких (как в голосовании)
darkheart 12 лет назад #
AndroS 12 лет назад #
И еще мне непонятен этот момент
• Mike • 12 лет назад #
— если по-простому, это как в старых версиях для формы «Анкета пользователя»
при этом значение поля (например, «Рок») преобразуется в ссылку с указанным адресом, например “/users/hobby/рок” выполнит поиск по списку пользователей с похожим хобби (рок) …
«Можно подробнее чуточку?»
— при создании поля для формы или при редактировании существующего, нужно посмотреть занчение атрибута “name” для этого поля, например, name="field[22]" /* посмотреть можно firebug-ом в firefox */
далее в шаблоне где будет показываться форма подключаем jquery-ui.js(полный код подключения можно посмотреть по ссылке datepicker -> view source) и добавляем скриптик
AndroS 12 лет назад #
• Mike • 12 лет назад #
ermakover 11 лет назад #
Но вот на конкретном примере можете пояснить, если есть время - если я хочу в Доске Объявлений прикрутить форму в которой будет пара значений, ну к примеру "новостройка" и "вторичный рынок" и чтобы они обрабатывались, как ссылки. Как это сделать?
OlegSaf 12 лет назад #
• Mike • 12 лет назад #
Azura 12 лет назад #
Опишите, как сможете, пожалуйста, вот хочу я допустим прикрутить к профилю поле новое. Например, там пользователь может написать кто он по профессии. Это можно сделать через формы? :(
Fuze 12 лет назад #
p.s. данный пост не для вас)
• Mike • 12 лет назад #
Откройте в админке «Конструктор форм»
выберите форму «Анкета пользователя»
нажмите на вкладку «Поля формы»
на “чистой” установке где «Предварительный просмотр» там будут всего два поля: Любимая музыка и Образование*
слева где «Добавить поле» укажите:
Тип поля —> Текстовое,
Заголовок —> Профессия,
Описание —> Ваша профессия,
...
...
Макс. длина —> 200,
Ширина —> 200
и нажмите «Добавить поле», оно появится в Предварительном просмотре (и в профиле пользователя)
это “вкратце”…
Марат 12 лет назад #
И спасибо за мануал!
alpik 11 лет назад #
VopisUVD 11 лет назад #
если мне нужно вывести форму из конструктора в форму регистрации по инвайтам, что я должен добавить в шаблон?
точнее как/какую форму из конструктора я должен указать... Чтоб на странице появилась форма.
Anonim 11 лет назад #
ermakover 11 лет назад #
Почитал инструкцию, всё понятно написано, но мне непонятно, уж простите...
Эту строку: cmsCore::loadClass('form'); я вставил в components/content/model.php
Правильно?
А это куда? - $formsdata = cmsForm::getFieldsHtml($form_id);
O3OH 11 лет назад #
Как можно это зделать?
Константин Г. 11 лет назад #
Константин Г. 11 лет назад #
Константин Г. 11 лет назад #