Работа с формами

Компонент Форма

Форма позволяет вывести некую информацию о некотором объекте (например, карточка клиента). Форма может иметь некоторые поля и кнопки выполнения операции (например, Сохранить).

 

Способы вывода формы на странице

Форму можно вывести в следующих вариантах: 

1. Просто сразу на странице в виде сниппета div с классом as-form

<div class="as-form" data-code="x1" data-itemid="123"></div>

2. Как ссылка на модальную форму. Подробнее про форму в модальном окне.

3. Как контекстное окно рядом с кнопкой (окно закрывается по нажатию на крестик). Подробнее про popover формы.

4. Как выпадающее окно рядом с кнопкой (окно закрывается по нажатию вне окна). Подробнее про dropdown формы.

5. Загрузка формы по ссылке в некий контейнер на странице. Подробнее про загрузку форм по ссылке.  

 
Пример форм можно посмотреть на демостенде компонентов.
 
Формы используются для создания сущностей (передан itemID=0), а также для редактирования параметров некой сущности (itemID>0).
Форма может содержать либо стандартную, либо кастомную разметку (в форму можно помещать другие компоненты, например таблицы, формы, файлы и т.д.).

Howto по формам можно посмотреть здесь - howto по формам Falcon Space.
 
Есть отдельное пошаговое руководство как создать форму

 

Настройка хранимых процедур для формы

Какие есть процедуры у формы: 

Процедуры формы генерируются автоматически в настройках формы. 

Важно следовать общему стилю и виду шаблонных процедур (они имеют префикс fm_example_).

Хранимая процедура извлечения данных формы GetItem

CREATE PROCEDURE [dbo].[fm_tatest_getItem]
@itemID int, --Стандартные параметры, они всегда приходят в эту процедуру.
@username nvarchar(256)
AS BEGIN -- инициализация формы данными. Названия вывода 1 SELECT должны совпадать с элементами формы
  if(@itemID>0) begin --Перед началом можно проверить права данного username -- 1 SELECT значения элементов формы
     select * from as_trace t1 where id = @itemID -- 2 SELECT дополнительные параметры настройки формы
/* select 'Редактирование "'+header+'"' Title, '' Subtitle, 'Сохранить' ButtonText, 'success' Background */
-- 3 SELECT некие табличные данные в свободном формате для вывода в форме через JS Render
  end else
  begin
     select 1
  end
select '' Title, '' Subtitle, 'h2' HeaderTag, 1 LineLabel
END

На входе: 

username - текущий пользователь

itemID - что передано в data-itemID сниппета формы (может быть и строкой, по умолчанию int)/ 

в процедуру может передаваться необязательный параметр @parameters ExtendedDictionaryParameter в котором передаются системные параметры:

НА выходе 3 SELECT:

  1. SELECT 1 - данные формы (колонки). 

Также в этом запросе указываются метаданные к колонкам:

  1. SELECT 2 - Настройки формы.

  1. SELECT 3 - дополнительные табличные данные (произвольные колонки) для вывода через jsRender разметку

  2. SELECT 4 - вызов внешних действий. См. вызов внешних действий

Хранимая процедура проверки элемента CheckItem

CREATE PROCEDURE [dbo].[fm_test_checkItem]
  @username nvarchar(256),
  @itemID int,
  @parameters ExtendedDictionaryParameter READONLY
AS BEGIN -- процедура проверки корректности данных перед сохранением
  declare @ptitle nvarchar(max)
  select @ptitle = value from @parameters where [key] = 'title'

  declare @id int
  select @id = id from as_trace where header=@ptitle and id <> @itemID

  if(@id >0) begin
    select 0 Result, 'В системе уже есть элемент с выбранным Заголовком (ID='+cast(@id as nvarchar)+')' Msg
  end else begin
    select 1 Result, '' Msg
  end
END

Процедура возвращает модель ResultModel: Result, Msg

Если Result=1 то проверка прошла успешно.

Примечание: ранее использовался способ передачи колонок формы как параметров хранимой процедуры (он оставлен для совместимости). В настоящий момент используется коллекция @parameters для передачи колонок (также в рамках этой коллекции дополнительно передаются langID и falconGuid).

Если не хотите использвоать CheckItem - оставьте в ней только select 1 Result, '' Msg

 

Хранимая процедура сохранения элемента SaveItem

 
CREATE PROCEDURE [dbo].[fm_metric_saveItem]
  @username nvarchar(256),
  @itemID int,
  @parameters ExtendedDictionaryParameter READONLY
AS BEGIN

declare @pcode nvarchar(max), @ptitle nvarchar(max)

select @pcode = Value2 from @parameters where [key]='code'  -- всегда Value2, а не Value
select @ptitle = Value2 from @parameters where [key]='title'

update as_mt_metrics set code = @pcode, title = @ptitle
where id = @itemID


-- SELECT 1 select 1 Result, '' Msg, '' Icon, '' RefreshContainer, 10000 AlertDelay, 0 EnableSaveAlert, '' SuccessUrl, 0 HideFormAfterSubmit


-- SELECT 2 Внешние действия
-- select 'notification' type, 'text1' text , 'demo1' [to], 'ticketExecutor' typeCode, 'http///' url, 'add111' additional select 'email' type, 'ru@rudensoft.ru' [to], 'sub1' subject, 'body1' body

END

Входные параметры:

@username - текущий пользователь

@itemID - переданный параметр itemID

@parameters - коллекция параметров из URL (Key, Value)

Примечание: в @parameters используйте Key, Value2, помимо полей формы там находятся еще следующие параметры: 

Первый запрос (SELECT 1) возвращает модель:

Второй запрос (SELECT 2) это вызов внешнего действия. См. вызов внешних действий

Примечание: ранее использовался способ передачи колонок формы как параметров хранимой процедуры (он оставлен для совместимости). В настоящий момент используется коллекция @parameters для передачи колонок (также в рамках этой коллекции дополнительно передаются langID и falconGuid)

Хранимая процедура сохранения одиночного поля SaveField

CREATE PROCEDURE [dbo].[fm_metric_saveEditableField]
  @pk nvarchar(128),	  -- id for item
  @fieldCode nvarchar(64), -- form field @value nvarchar(max),	-- field value
  @username nvarchar(256) -- current user
AS BEGIN

  if(@fieldCode='XXXXXXXXXXXXXXXXXXXXX') begin
    update as_categories set typeCode = @value where id = @pk
    select 1 Result, '' Msg return
   end
  -- ...
  --SELECT 1 Result,Msg select 0 Result, 'Не найден код сущности' Msg
  -- SELECT 2 Внешние действия (notification, email и т.д.)

END

Возвращает SELECT 1 (Result, Msg) и SELECT 2 (Внешние действия)

SELECT 1 

Также в процедуру можно передавать параметр @parameters типа ExtendedDictionaryParamerer для передачи спец параметров (langID и falconGuid).

Хранимая процедура для заполнения списковых полей

Имя процедуры задается автоматически в виде fm_{formCode}_{colCode}_dict и процедура редактируется через кабинет в Управление колонками.

CREATE PROCEDURE [dbo].[fm_notificationType_categoryName_dict]
  @username nvarchar(256)
  @itemID int
AS BEGIN
  select 'Не выбрано' Text, 0 Value, 0 Selected -- 'Group1' optGroup для категорий в списке. (и по нему же должна быть сортировка)
  union
  select name Text, id Value, Selected from as_nt_notificationCategories order by Text

END

Передается ItemID на случай использования универсальной процедуры.

На выходе модель:

Примечание.

  1. В процедуру может передаваться необязательный параметр @parameters DictionaryParameter в котором передаются системные параметры (langID, falconGuid)
  2. Ранее использовалось поле для хранения имени процедуры. Он остался рабочим для совместимости. Сейчас это поле не выводится и вместо него необходимо использовать новые процедуры с редактированием через кабинет.
  3. Если нужен элемент Не выбрано, то можно сделать  union select 0 Value, ‘Не выбрано’ Text
  4. OptGroup используется для организации списка с категориями (для этого первый optGroup должен быть непустым и список должен быть упорядочен по optGroup).
  5. Если установлен Color - то список и его элементы будут иметь указанные цвета. 
  6. Если стоит Disabled=1, то элемент списка будет неактивен. 

 

Хранимая процедура для проверки одиночных полей при заполнении формы CheckItemField

Если существует подобная процедура с именем fm_{entity}_checkItemField, то она будет вызываться всякий раз, когда редактируется одно из полей формы.

Входные параметры:

@username - текущий пользователь

@itemID - переданный параметр itemID

@field - код поля

@value - текущее значение поля

@parameters - коллекция параметров из URL (Key, Value2)

CREATE PROCEDURE [dbo].[fm_metric_checkItemField]
  @username nvarchar(256),
  @itemID int,
  @field nvarchar(256),
  @value nvarchar(max),
  @parameters ExtendedDictionaryParameter readonly -- необязательный
AS BEGIN
  if(@field = 'roles') begin
   if(charindex(' ', @value)>0) begin
     select 'В ролях не должно быть пробелов!' Msg, 0 Result, '.projectStageCont' RefreshContainer, '.p1' ShowContainer, '.p2' HideContainer, '' ReplaceContainer, '' ReplaceContainerHtml
    end
   end

   -- SELECT 1
   select '' Msg, 1 Result

   -- SELECT 2 Outer actions

END

На входе - ID сущности, код поля, значение и текущий пользователь.

В процедуру можно передавать параметр @parameters типа ExtendedDictionaryParamerer (Key, Value2) для передачи спецпараметров (langID и falconGuid) и текущие значения других полей формы.

Этот параметр также используется для извлечения данных, полученных из внешнего API. 

На выходе:

SELECT 1

SELECT 2 - вызов внешних действий

Также вы можете задать коллбек для обработки в JS результата проверки поля - as.formcallbacks["{formCode}_checkField"](params, data).

 

Создание формы

Для создания формы необходимо сделать следующее:

Поля формы

Код - код поля формы.

Название - название поля (отображается на самой форме).

Тип данных - тип данных поля (строка, число, дробное число и прочее, более подробно о типах полей формы ниже в этой статье.)

Placeholder - текст пустого поля.

Подсказка - текст отображающийся при наведении курсора на поле.

Порядок - порядок вывода элемента на форме (чем значение меньше тем элемент располагается выше)

Обязательное поле - если значение установлено в "Да", то система будет проверять заполненность данного поля при проверке или сохранении, и если поле не заполнено будет выдаваться предупреждение, что поле не заполнено.

Хранимка значений - задается источник данных для спискового элемента в форме (пример: выпадающий список значений)

Ширина колонки - задаётся в процентах или пикселях. 

Зависимые колонки - указываются названия (код) зависимых полей формы. Пример: есть поле выбора страны, на основании выбора страны следующее поле будет иметь города относящиеся к данной стране. Более подробно здесь

 

Хранимая процедура отображения статуса заполнения формы Progress

CREATE PROCEDURE [dbo].[fm_knowledgeBaseArticle_progress]
  @username nvarchar(256),
  @itemID int,
  @parameters ExtendedDictionaryParameter Readonly
AS BEGIN
  -- процедура для визуализации прогресса формы
  declare @fieldchannel nvarchar(max) = ''
  select @fieldchannel = value from @parameters where [key]='channel'

  -- SELECT 1 select 1 Result, '' Msg
  -- SELECT 2 набор индикаторов прогресса
   select 'Первый параметр' Title, 40 Value, 'Хорошо' [Text]
   union
   select 'Второй параметр' Title, 20 Value, 'Не очень' [Text]

END

Пример: [fm_example_progress]

На входе все элементы формы (передаются из несохраненной формы в параметре @parameters, там же передаются langID и falconGuid). 

На выходе: 

SELECT 1 - Result, Msg

SELECT 2 - Text, Value (от 0 до 100), Title

Эта процедура вызывается, если установлен тип прогресс-бара в GetItem Select 1: 'circle|line' ProgressType

Вызывается при каждом изменении элементов формы и выводится там где разметка {form-progress}

Примечание: 

Круговая диаграмма работает только со значениями, кратными 10 (т.е. округляет до десятков). Если вам нужно использовать точные значения (например, отображать скидку в 3.5%, то используйте line режим для отображения прогресса). 

Типы полей формы

Пример полей формы на демостенде

Вы можете использовать следующие типы полей

  1. Editor (CSS), editorCSS - редактор CSS с подсветкой синтаксиса
  2. Editor (HTML), editorHTML - редактор HTML с подсветкой синтаксиса
  3. Editor (JS), editorJS - редактор JS с подсветкой синтаксиса (если нужно отменить возможность форматировать код - ставим CSS класс as-disableAutoFormat)
  4. Editor (SQL), editorSQL - редактор SQL с подсветкой синтаксиса
  5. hidden - input type=hidden поле. Просто значение поля прокидывается из GetItem в SaveItem через форму (внимание, пользователь может его изменить через HTML).
  6. HTML, html - Rich редактор tinyMCE(старая версия)
  7. HTML2, html2 - Rich редактор tinyMCE(новая версия)
  8. HTML Lite, html-lite  - выбор Rich редактора tinyMCE в упрощенном виде
  9. HTML5 Color, html-color - редактирование цвета
  10. HTML5 Date, html-date - поля для ввода даты. Форма сохранения YYYY-MM-DD (и не зависит от настройки в GetLayoutInfo dateFormat!)
  11. HTML5 Datetime local, html-datetime-local - поле для ввода даты и времени без учета часового пояса. Формат сохранения YYYY-MM-DDTHH:MM,  ВАЖНО - datatime-local не работает в Firefox (поэтому используйте в большинстве случаев поля date + time).
  12. HTML5 Email, html-email - редактирование email
  13. HTML5 Month, html-month - выбор месяца. Формат сохранения YYYY-MM.
  14. HTML5 Number, html-number - выбор числа
  15. HTML5 Tel, html-tel - поле для телефона (установка формата делается через GetLayoutInfo, параметр phoneFormat, а для лендов добавить hidden поле с классом as-phoneFormat, и value="+d ddd-ddd-dddd")
  16. HTML5 Time, html-time - поле для ввода времени/ Формат сохранения  HH:MM
  17. HTML5 Url, html-url - поле для ввода URL
  18. HTML5 Week, html-week - выбор недели. Формат сохранения 2020-W01 (YYYY-WWW).
  19. localStorage, sessionStorage, cookie, urlParameter - скрытые поля для передачи параметров в saveItem из куки, локальных ресурсов браузера или из URL.
  20. Альтернативный способ выбора содержимого текстовых файлов, textFile - файл не грузится на сервер, а содержимое файлов извлекается из него прямо в браузере. Подробнее.
  21. Ввод пароля, password - используется в формах регистрации. Скрывает ввод в виде звездочек.
  22. Выбор radio, radio - одиночный выбор через радиокнопки (в стиле связанных кнопок Bootstrap)
  23. Выбор иконки, iconPicker - выбор иконки Font Awesome. В базе значение хранится в текстовом виде, например, fas fa-search
  24. Выбор времени, time - выбор времени из выпадающего списка
  25. Выбор диапазона дат, daterange - (формат даты можно задать через настройку format либо использовать глобальную настройку dateFormat в GetLayout)
  26. Выбор места (гео), geo-autocomplete - вывод поля с поиском геолокации. Формат хранения значения - {lat}||{lon}||{geotext}||{JSONOptions}
  27. Выбор файла, files - можно добавлять файлы к форме (в том числе и в форме на добавление, когда еще нет сущности, к которой привязывать файлы). Подробнее.
  28. Дата выбор, date - выбор даты через плагин Datepicker (формат устанавливается в GetLayout в параметре dateFormat).
  29. Дерево с галочками, treeCheckboxes - выбор галочек в иерархическом списке
  30. Дробное число, float - число с плавающей точкой
  31. Картинки Radio, imageRadio - выбор через радиокнопки с картинкой
  32. Картинки Флажки, imageCheckboxes - выбор флажков с картинками.
  33. Многострочный текст, text - вывод textarea
  34. Переключатель, switch - чекбокс в виде переключателя (Да, Нет). В placeholder можно задать текст вместо Да/Нет. Для изменения размера можно передать классы в GetItem SELECT 1 ( 'as-switch-large' class_immediatelyLoad).  as-switch-large, as-switch-mini, as-switch-small
  35. Подсказки dadata, dadata - поле с выпадающими подсказками по разным объектам - адреса, компании, банки и т.д. (демо)
  36. Слайдер значений, slider - выбор числа или диапазона чисел в виде ползунка. 
  37. Содержимое файла, fileContent - загрузка файла через менеджер ресурсов и передача его содержимого в SQL процедуру в виде строки. Подробнее.
  38. Сортировка дерева, treeOrder - управление структурой дерева через Drag&Drop
  39. Список chosen, chosen - выбор из списка с возможностью поиска
  40. Список, select - комбосписок для одиночного выбора
  41. Список множественный chosen, chosenMiltiple - множественный выбор элементов из списка (в сохранение они идут как id через запятую).
  42. Список-поиск, select-search - поиск через autocomplete
  43. Список 2 (более функциональный), select2 - выбор элемента с поиском, добавлением элемента
  44. Стандартный выбор radio, defaultRadio - стандартный выбор из радиополей.
  45. Строка по шаблону, patternString - вводим некую строку, разбираем регулярным выражением и выводим разметку с неким значением (например, ввод ютуб ссылки и вывод iframe)
  46. Строка, string - текстовое поле в 1 строку
  47. Таймер, timer - поле, которое позволяет запускать таймер по секундам. Время в итоге передается в виде mm:ss. 
  48. Установка рабочего графика, weekTime - позволяет выбрать определенные часы в неделе.
  49. Флажки, checkboxes - множественный выбор через галочки
  50. Флажок, bool - чекбокс
  51. Файл на внешнем ресурсе, remoteFile - указание URL и передача в процедуру saveItem тела файла, загруженного по данному URL. Подробнее.
  52. Целое число, int - целочисленное число
  53. Цвет множ. colorCheck, цвет colorRadio - выбор цвета (одиночный и множественный). В value - цвет, в text - текст (необязательно). 
  54. Градиент, gradient - выбор градиента с несколькими цветовыми маркерами. 

Примечание: если HTML5 будут введены некорректно, то они подсвечиваются розовым и форма не будет сохраняться, пока не будут исправлены ошибки.

Некоторые типы полей имеют дополнительные настройки в GetItem SELECT 1 в параметрах options_{code}. Подробнее

Форма с редактированием по отдельным полям (мгновенное сохранение полей, editable поля).

Можно сделать форму, где каждое поле будет сохраняться отдельно.

Для этого необходимо сделать следующее:

  1. В GetItem установить какие поля будут редактируемые, для этого добавляем в SELECT 1 выходные колонки вида 1 edt_{colName} (тем самым эти колонки будут реагировать на изменения и вызывать сохранение этих полей).
  2. Реализовать процедуру SaveField (сохранение отдельных полей формы).
  3. Кнопку Сохранить либо скрыть через CSS, либо использовать кастомную разметку формы и не вставлять кнопку в разметку.  

Примечание:

1.  Данный режим сохранения подходит для полей ввода, галочек, радиопереключателей, textarea, выбора из списка. Режим не работает для набора галочек и для сложных полей типа Code Editor.

2. Если вам необходимо установить вывод сообщения после успешного сохранения поля, то используйте в процедуре формы GetItem в SELECT 2 параметр EditableSuccessMessage (строка).

Форма с дополнительными параметрами 

Бывают случаи когда нужно в форму передать несколько параметров (а не только data-itemID). 

См. подробнее...

Форма без параметров

Данная форма может использоваться для выполнения каких-либо действий.

Т.е. выводим информацию с помощью Getitem и кастомной разметки + выполняем действие.

Важно! В процедурах CheckItem и SaveItem не должно быть параметров fieldName.

 

Работа с внешним источником API в форме

Среди настроек формы есть 3 параметра подключения внешних источников (коды API запросов через запятую, для выполнения исходящих запросов при различных событиях формы):

Результат ответ запроса API передается в хранимую процедуру через параметр @parameters ExtendedDictionaryKey (в Key пишется код запроса). 

Документация по запросам API

Решение проблем

Не получается корректно сохранить скрипт в форме

При использовании script

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

Ошибка при начальной загрузке формы

fm_{code}_getItem - всегда должен возвращаться какой-то результат. Если ваша форма на добавление, то можете просто возвращать select 1.

Криво выводятся подписи для элементов формы

Используйте разметку bootstrap для скелета формы (классы row, col-md-X и т.д.). Для меток используйте тег label с классом as-form-cap.

Множественный вызов GetItem процедуры

Дело в том, что процедура GetItem вызывается не только при первичной загрузке формы, но и при выполнении значимых действий (инициализация объекта формы) - при сохранении, при отслеживании изменения поля или сохранения одиночного поля и т.д.

Если вам необходимо отследить первый инициализирующий запуск GetItem, то используйте параметр isMainLoadForm в @parameters.

Пример: 

CREATE PROCEDURE [dbo].[fm_myForm_getItem]    
@itemID nvarchar(256), 
@username nvarchar(256),    
@parameters ExtendedDictionaryParameter readonly
AS
BEGIN 
    declare @isMainLoadForm bit = (select try_cast(value2 as bit) from @parameters where [Key]='isMainLoadForm')
    print @isMainLoadForm
END

Для первичной загрузки параметр будет равен 1, в других случаях 0.

 

Howto по формам

Полный список вопросов, как реализовать ту или иную возможность на форме, описан в разделе Howto Формы.

 

Дополнительные материалы

  1. Как создать форму для редактирования сущности
  2. Как сделать кастомную HTML разметку для формы
  3. Как установить некоторые поля в форме по умолчанию при загрузке
  4. Как сделать модальную форму 
  5. Как вывести форму во всплывающем окне рядом с кнопкой (popover)
  6. Как передать в форму скрытый параметр
  7. Загрузка формы по ссылке

 

 

Страница-источник на сайте falconspace.ru