Работа с конструктором форм в InstantCMS 1.10

+56
3.84K
Всем привет.

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

Итак, что нового:

— для каждой формы вы можете указать свой атрибут action, по умолчанию он для всех форм "/forms/process";
— показывать/не показывать заголовок формы;
— выводить только поля формы (например, если поля формы вы хотите вставить в свою форму);
— новый тип поля ссылка (введенное в это поле ссылка будет обработана как активная через go редирект);
— новая опция поля формы "Значение поля ссылкой", при ее включении вы можете задать префикс этой ссылки, по умолчанию "/users/hobby/". Т.е. ссылка будет выглядеть как "/префикс/значение_поля".
— ширина поля теперь задается в px;
— автоматическая валидация значений полей формы.

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

Для начала в компоненте необходимо подключить сам класс конструктора форм, он теперь системный, находится в /core/classes/form.class.php, подключаем как:
  1. cmsCore::loadClass('form');
Я обычно это делаю в конструкторе класса модели компонента.
Работа с формой — это три этапа: показ самой формы (ее полей), получение значений от пользователя, вывод значений в необходимом месте.

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

Все на самом деле очень просто:
  1. $formsdata = cmsForm::getFieldsHtml($form_id);
Статический метод getFieldsHtml вернет массив полей формы. Вы так же можете передать вторым параметром массив значений полей и третьим параметром флаг показа только обязательных полей.
Дальше массив $formsdata можно передать в шаблон и в нем использовать например так (подразумевается, что таблица — тег table — уже есть):
  1.  
  2. {if $formsdata}
  3. {foreach key=tid item=form from=$formsdata}
  4. <tr>
  5. <td valign="top">
  6. <span>{$form.title}:</span>
  7. {if $form.description}
  8. <div style="color:gray">{$form.description}</div>
  9. {/if}
  10. </td>
  11. <td valign="top">
  12. {$form.field}
  13. </td>
  14. </tr>
  15. {/foreach}
  16. {/if}
  17.  

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

Тут еще проще:
  1.  
  2. $form_input = cmsForm::getFieldsInputValues($form_id);
  3. $formsdata = cmsDatabase::escape_string(cmsCore::arrayToYaml($form_input['values']));
  4.  
Массив $form_input будет содержать в себе:
— массив значений полей $form_input['values'];
— массив ошибок $form_input['errors'].
А переменная $formsdata уже подготовлена для вставки в базу данных. Обратите внимание, массив мы преобразовали в YAML и заэскейпили строку для вставки в базу.
Обязательные к заполнению поля вы можете проверить например так:
  1.  
  2. foreach ($form_input['errors'] as $field_error) {
  3. if($field_error){ cmsCore::addSessionMessage($field_error, 'error'); cmsCore::redirectBack(); }
  4. }
  5.  

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

Предполагается, что во втором этапе мы получили значения формы и поместили их куда-то в базу данных к какой-нибудь записи.
Теперь мы эти значения получаем
  1. $formsdata = cmsForm::getFieldsValues($form_id, $form_array)
Обратите внимание, $form_array — это уже преобразованная в массив строка YAML. Т.е. если из базы мы получили значение в формате YAML, его нужно преобразовать в массив, например так:
  1. $form_array = cmsCore::yamlToArray($formsdata);
И осталось нам всего то передать в шаблон переменную $formsdata и там показать, например так:
  1.  
  2. {if $formsdata}
  3. <table width="100%" cellspacing="0" cellpadding="2">
  4. {foreach key=tid item=form from=$formsdata}
  5. {if $form.field}
  6. <tr>
  7. <td valign="top" width="140px">
  8. <strong>{$form.title}:</strong>
  9. </td>
  10. <td valign="top">
  11. {$form.field}
  12. </td>
  13. </tr>
  14. {/if}
  15. {/foreach}
  16. </table>
  17. {/if}
  18.  
На этом все, в классе cmsForm все методы снабжены комментариями, любопытные и желающие разобраться думаю без труда поймут логику работы. Класс можно легко расширить, добавив обработку новых полей.
На примерах, вы можете посмотреть работу с формами в компонентах users, board.

Всем спасибо за внимание, попытался написать наиболее понятно, если возникли вопросы, смело пишите в комментариях.
0
deltas deltas 9 лет назад #
Спасибо! Довольно продумано все.
Спасибо за облегчение работы начинающим!
0
Evo Evo 9 лет назад #
Спасибо, все очень классно и понятно.
+3
darkheart darkheart 9 лет назад #
Вопрос не только касательно 1.10 а вообще, можно ли прикрутить календарь, по сути добавить поле дата, и второе не могу понять можно чекбоксы вывести чтобы галочками несколько вариантов значений выбрать или нет?
0
• Mike • • Mike • 9 лет назад #
«можно ли прикрутить календарь, по сути добавить поле дата»
— можно добавить поле и обрабатывать при помощи js… например, из состава jquery.ui datepicker

«можно чекбоксы вывести чтобы галочками несколько вариантов значений выбрать или нет?»
— “галочками” можно вывести одну, со значениями “да/нет”, группой можно вывести радио-кнопки с выбором единственного значения из нескольких (как в голосовании)
+2
darkheart darkheart 9 лет назад #
так по поводу календаря понятно, по поводу чекбоксов. я так понимаю отдельной доработкой. Да/нте - ну или radio button - у них немного другая логика, нужен именно чекбокс, к примеру если создавать форму онлайн бронирования (да-да, не только социалки на ней делать), то набор опций радиокнопкой не совсем верно будет выводить. Спасибо за ответ, пойду в раздел к разработчиков дергать :)
0
AndroS AndroS 9 лет назад #
Mike:
можно добавить поле и обрабатывать при помощи js… например, из состава jquery.ui datepicker
Можно подробнее чуточку? Я новичок в этом деле.
И еще мне непонятен этот момент
новая опция поля формы "Значение поля ссылкой", при ее включении вы можете задать префикс этой ссылки, по умолчанию "/users/hobby/". Т.е. ссылка будет выглядеть как "/префикс/значение_поля".
Как на практике это применить и с какой целью это сделано?
0
• Mike • • Mike • 9 лет назад #
«новая опция поля формы “Значение поля ссылкой”»
— если по-простому, это как в старых версиях для формы «Анкета пользователя»
при этом значение поля (например, «Рок») преобразуется в ссылку с указанным адресом, например “/users/hobby/рок” выполнит поиск по списку пользователей с похожим хобби (рок) …

«Можно подробнее чуточку?»
— при создании поля для формы или при редактировании существующего, нужно посмотреть занчение атрибута “name” для этого поля, например, name="field[22]" /* посмотреть можно firebug-ом в firefox */
далее в шаблоне где будет показываться форма подключаем jquery-ui.js(полный код подключения можно посмотреть по ссылке datepicker -> view source) и добавляем скриптик
Код PHP:
  1. <script>
  2. $(function() {
  3. $( "input[name='field[22]']" ).datepicker();
  4. });
  5. </script>
+1
AndroS AndroS 9 лет назад #
Спасибо, будем разбираться дальше... Только вот по поводу
если по-простому, это как в старых версиях для формы «Анкета пользователя» при этом значение поля (например, «Рок») преобразуется в ссылку с указанным адресом, например “/users/hobby/рок” выполнит поиск по списку пользователей с похожим хобби (рок) …
все равно не очень понятно... К примеру, я задавал этот вопрос, глядя на тип поля Да/нет. Вот в каких случаях данная фича будет полезна для применения на практике? Просто ума не приложу, а разобраться бы для ясности не мешало... Демо-данных нет на сайте, чтоб поэкспериментировать
0
• Mike • • Mike • 9 лет назад #
Добавьте (это самое Да/Нет) в существующую форму «Анкета пользователя» и увидите в профиле пользователя как будет выглядеть… и решите для чего оно пригодится )
0
ermakover ermakover 9 лет назад #
Спасибо за толковое объяснение.
Но вот на конкретном примере можете пояснить, если есть время - если я хочу в Доске Объявлений прикрутить форму в которой будет пара значений, ну к примеру "новостройка" и "вторичный рынок" и чтобы они обрабатывались, как ссылки. Как это сделать?
0
OlegSaf OlegSaf 9 лет назад #
Вопрос не в тему - на странице http://instantcms.ru/download.html InstantCMS 1.10 после аудита безопасности ?
0
• Mike • • Mike • 9 лет назад #
Fuze:
Исполнитель приступает к работе сегодня, 25.10.2012. Ориентировочный срок месяц +/- неделя.
0
Azura Azura 9 лет назад #
Мне, как пока что даже не разработчику, а просто непосвящённому в пхп не очень понятно...
Опишите, как сможете, пожалуйста, вот хочу я допустим прикрутить к профилю поле новое. Например, там пользователь может написать кто он по профессии. Это можно сделать через формы? :(
+1
Fuze Fuze 9 лет назад #
Для этого достаточно создать форму с нужными полями в админке и в настройках профилей в админке эту форму выбрать. Знания php тут не нужны.
p.s. данный пост не для вас)
0
• Mike • • Mike • 9 лет назад #
Более того — это уже сделано, при помощи формы «Анкета пользователя»…
Откройте в админке «Конструктор форм»
выберите форму «Анкета пользователя»
нажмите на вкладку «Поля формы»
на “чистой” установке где «Предварительный просмотр» там будут всего два поля: Любимая музыка и Образование*
слева где «Добавить поле» укажите:
Тип поля —> Текстовое,
Заголовок —> Профессия,
Описание —> Ваша профессия,
...
...
Макс. длина —> 200,
Ширина —> 200

и нажмите «Добавить поле», оно появится в Предварительном просмотре (и в профиле пользователя)
это “вкратце”…
0
Марат Марат 9 лет назад #
Супер!
И спасибо за мануал!
0
alpik alpik 9 лет назад #
М здорово, а загрузки определенных файлов похоже не сделать такого поля в этой версии?
0
VopisUVD VopisUVD 9 лет назад #
мне не понятен такой факт
если мне нужно вывести форму из конструктора в форму регистрации по инвайтам, что я должен добавить в шаблон?
точнее как/какую форму из конструктора я должен указать... Чтоб на странице появилась форма.
0
Anonim Anonim 9 лет назад #
А как делать список выпадающий? Вопрос мой тут
0
ermakover ermakover 9 лет назад #
Хочу вставить форму при добавлении статей на сайт после "теги".
Почитал инструкцию, всё понятно написано, но мне непонятно, уж простите...

Эту строку: cmsCore::loadClass('form'); я вставил в components/content/model.php
Правильно?

А это куда? - $formsdata = cmsForm::getFieldsHtml($form_id);
0
O3OH O3OH 9 лет назад #
Как созданную форму выводить в модуле? Например при создании объявления в форму прописывается цена, а в списке объявлений её нет. Форму в полном объявлении (открытом) выводит, а в списке объявлений нет. В модуле "Последние объявления" тоже нет.

Как можно это зделать?
-5
Константин Г. Константин Г. 8 лет назад #
может сделать это всё спец тегом как в DLE?
-5
Константин Г. Константин Г. 8 лет назад #
все это добавил в файлы но поля в статьях так и не появилось. неподскажите в какие файлы то надо?
-4
Константин Г. Константин Г. 8 лет назад #
Уважаемый Fuse ответьте пожалуйста. Не все понимают что написано.или кто-нибудь кто уже разобрался с полями.

Еще от автора

Как собрать обновление и релиз InstantCMS
Небольшой экскурс в сборку дистрибутива установки и обновления InstantCMS с GitHub.
InstantCMS 2.14.0 release candidate
Здравствуйте Тестируем релиз-кандидат InstantCMS 2.14.0. От того, как мы с вами выявим баги в новой версии, зависит стабильность релиза.
Черная пятница, скидки на премиум компоненты
Привет, друзья! Сегодня день, которого многие давно ждали - Черная пятница!
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.