Статьи

Создание форм с помощью Webix Framework — 4 практических примера

Эта статья была рецензирована Саймоном Кодрингтоном и Мэллори ван Ачтербергом. Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

Как веб-дизайнер, есть вероятность, что вам придется создавать веб-формы на довольно регулярной основе. Это часто неблагодарное занятие, которое чревато головными болями (особенно если вы делаете что-то более сложное, например, создаете многошаговую форму). В таких случаях может быть лучше использовать инфраструктуру пользовательского интерфейса, чтобы облегчить боль и ускорить процесс разработки. В этой статье я расскажу о различных советах и ​​хитростях, которые позволят вам создавать различные типы форм быстро и с минимальными трудностями при использовании инфраструктуры Webix .

Что такое Webix?

Webix — это библиотека JavaScript UI компонентов HTML5, которая облегчает создание мобильных и настольных веб-приложений. Он предоставляет вам широкий спектр компонентов от простой кнопки до виджета SpreadSheet, который можно использовать для разработки приложений, подобных Excel. Помимо коллекции компонентов пользовательского интерфейса , есть механизм обработки событий , поддержка автономного режима и множество инструментов разработки . Вы также можете создавать свои собственные скины, используя конструктор скинов, использовать визуальный дизайнер для создания пользовательского интерфейса с помощью перетаскивания и играть с кодом на онлайн-площадке с исходным кодом. Проект также имеет исчерпывающую документацию .

Я уже написал вступительную статью, в которой описываются основные функции и основы использования этой платформы, поэтому не стесняйтесь заранее ознакомиться с ней, если вам интересно.

Включая Webix

Существует множество способов включить необходимые файлы JavaScript и CSS в ваш проект. Если вы загрузите пакет библиотеки, вы найдете эти файлы в папке codebase . Вы можете включить их следующим образом:

 <link rel="stylesheet" href="./codebase/webix.css"> <script src="./codebase/webix.js"></script> 

В качестве альтернативы вы можете использовать CDN:

 <link rel="stylesheet" href="http://cdn.webix.com/edge/webix.css"> <script src="http://cdn.webix.com/edge/webix.js"></script> 

Вы также можете использовать NuGet :

 nuget install Webix 

Таким образом, если вы используете Microsoft Visual Studio, выполните это из консоли диспетчера пакетов:

 install-package Webix 

Или попробуйте Бауэр :

 bower install webix 

Создание простой формы

Теперь, когда библиотеки установлены, давайте посмотрим, как работает виджет Webix Form .

 webix.ui({ view: "form", id: "myForm", container: "areaA", width: 350, elements: [ { // first form component }, { // second form component}, { // n-th form component */} ] }); 

Мы начнем с вызова метода пользовательского webix объекта webix и передачи ему различных параметров для настройки его вывода.

  • Свойство view определяет тип создаваемого элемента (здесь мы создаем форму, но это также может быть меню или диаграмма).
  • Свойство id присваивает форму идентификатору, с помощью которого вы можете впоследствии ссылаться на нее.
  • Свойство container указывает идентификатор элемента HTML, в который должна быть визуализирована форма.
  • Свойство width используется для установки ширины элемента формы. Webix предполагает, что вы хотите использовать пиксели в качестве единицы измерения здесь, поэтому вам просто нужно установить правильное число.
  • Свойство elements — это массив компонентов, которые будет содержать ваша форма. Вы можете использовать любой подходящий компонент в форме: текстовое поле, переключатель, флажок, кнопки и т. Д.

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

 webix.ui({ ... elements: [ { view: "text", label: "Username", name: "username" }, { view: "text", label: "Password", name: "password", type: "password" }, { view: "checkbox", labelRight: "I accept the terms of use", name: "accept" }, { view: "button", value: "Submit", width: 150, align: "center", click: submit } ] }); 

Обратите внимание, что мы указываем атрибуты name для наших элементов формы и type: "password" установки type: "password" для нашего поля пароля, чтобы маскировать символы при их вводе. Установка свойства label элемента определяет метку для этого элемента, и мы можем использовать свойство click элемента, чтобы определить обработчик события, который будет вызываться при отправке формы. Хотя приятно иметь возможность проверить, что с данными все в порядке, не забывайте, что проверка на стороне клиента должна только дополнять проверку на стороне сервера.

Прежде чем мы сможем запустить эту демонстрацию, нам нужно определить этот обработчик событий. Здесь я использую окно сообщений Webix, чтобы дать пользователю обратную связь относительно того, что было введено:

 function submit(){ webix.message(JSON.stringify($$("myForm").getValues(), null, 2)); } 

Этот код использует метод getValues Webix для извлечения вставленных данных из формы с идентификатором myForm а затем преобразует их в строку JSON с помощью JSON.stringify () .

Ну, все готово, и мы можем проверить результат:

Simple Webix form with three fields

После того, как вы вставите некоторые данные и нажмете кнопку «Отправить», вы получите сообщение:

Webix message box displaying field values on submission

Вот демо:

Кажется, все работает хорошо. Теперь давайте добавим что-нибудь более интересное.

Многократный выбор и предложения

Различные элементы управления формой позволяют выбирать несколько элементов или использовать предложения. На мой взгляд, наиболее интересным из них является Multicombo . Это элемент управления, который позволяет выбирать несколько значений для поля ввода через простой, но интуитивно понятный интерфейс.

Примечание. В последнем выпуске Webix (26 апреля 2016 г.) изменилось функционирование элемента управления Multicombo. Теперь он доступен только в версии Webix Pro (платный продукт).

Представьте, что вы хотите создать страницу, которая поможет разработчику создать резюме. Может содержать следующие поля:

Webix form with name, skills and email fields

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

 var languages = [ {id: 1, lang: "JavaScript"}, {id: 2, lang: "PHP"}, {id: 3, lang: "Ruby"} ... ] webix.ui({ ... elements: [ { view: "multicombo", name: "skills", label: "Skills", button: true, suggest: { body: { data: languages, template: webix.template("#lang#") } }, } ] }); 

В дополнение к знакомым свойствам, здесь мы используем свойство button свойство suggest . Свойство button создает кнопку для подтверждения выбора, тогда как свойство offer определяет источник элементов, отображаемых в мультикомбо. В нашем примере мы используем свойство data чтобы указать имя массива, а также свойство template чтобы указать значение для отображения. Также было бы возможно установить путь к файлу (например, suggest: "path/to/file/data.js" ), выполнение t, как указано выше, является лучшим вариантом, если вы хотите извлечь различные массивы данных из большого источника ,

Давайте проверим, как это работает. После того, как вы нажмете текстовое поле, появится раскрывающийся список:

Webix multicombo component with drop-down list

Вы можете либо прокрутить его и выбрать нужные элементы, либо начать печатать, чтобы сузить варианты предложений:

Webix multicombo component with suggestions

Этот конкретный пример формы вернет набор идентификаторов, которые соответствуют выбранным элементам:

Webix multicombo component returned values

Вот демо для этого примера .

В качестве альтернативы multicombo вы можете проверить компоненты Gridsuggest и Dataview Suggest .

Использование виджета дерева в качестве элемента формы

Webix не ограничивает вас обычными элементами формы, такими как текстовые поля, кнопки и флажки. Вы можете разместить любой виджет, который вам нравится в вашей форме. Давайте посмотрим на виджет дерева , например. Изначально он не был разработан как элемент управления формой, поэтому для этого элемента нет getValue методов setValue и getValue . Но эти методы необходимы, если мы хотим иметь возможность возвращать или устанавливать значения для этого компонента. Так что мы можем сделать? К счастью, есть метод protoUI, который может помочь нам. Это позволяет создавать новые взгляды на основе существующих.

Давай попробуем:

 webix.protoUI({ name: "formTree", setValue: function(id){ this.select(id); }, getValue: function(){ return this.getChecked(); } }, webix.ui.tree); 

В приведенном выше коде мы создаем новое представление с именем formTree . Затем мы определяем два новых метода, которые позволяют нам устанавливать и получать значения id . Наконец, мы используем виджет Tree в качестве основы для этого нового представления.

Теперь давайте создадим некоторые данные:

 var treedata = [ { id: "1", value: "Web", data: [ { id: "1.1", value: "HTML" }, { id: "1.2", value: "CSS" }, ... ]}, { id:"2", value:"Scripting", data: [ { id: "2.1", value: "Shell" }, ... ]}, ... ]; 

Вы можете добавить свой новый элемент в форму, как обычно:

 webix.ui({ ... elements: [ { view: "formTree", name: "skills", data: treedata, height: 150, threeState: true, template: "{common.icon()} { common.checkbox() } &nbsp; #value#" }, ... ] }); 

Здесь мы представляем несколько новых свойств: свойство template добавляет флажки к узлам дерева, а свойство threeState включает флажки с 3 состояниями . Это флажки, где:

  • когда пользователь проверяет / снимает флажок с родительского узла, родительский узел и все его дочерние узлы (каждого уровня вложенности) проверяются / не проверяются.
  • когда пользователь проверяет / снимает флажок дочернего узла, проверяется / снимается только отдельный дочерний узел.

Если вы используете флажки с 3 состояниями, вы должны обратить внимание на одну небольшую проблему. Когда вы устанавливаете флажок, Webix повторно отображает дерево. Если вы решите использовать клавиатуру для заполнения формы, при нажатии клавиши « Пробел» для переключения выбора флажка (в случае браузеров на основе WebKit, таких как Chrome) это может привести к потере фокуса, и вы начнете вкладку с самое начало формы.

К счастью, для этого есть обходной путь. Вы можете использовать свойство on чтобы прикрепить новый обработчик к дереву. Мы будем использовать его вместе с событием onItemCheck которое срабатывает при выборе определенного элемента дерева. Используя некоторые дополнительные методы, мы можем сохранить фокус:

 on: { onItemCheck: function(id){ var node = this.getItemNode(id); if(node){ checkbox = node.getElementsByTagName("input")[0]; checkbox.focus(); } } } 

Это должно работать. Но есть и другая проблема: WebKit не ставит флажки во вкладках. Чтобы противодействовать этому, вы можете использовать некоторый код CSS, чтобы добавить контур или тень блока к сфокусированным флажкам. Вот пример:

 input[type=checkbox]:focus { outline: -webkit-focus-ring-color auto 5px; } 

Со всем этим мы можем нажать кнопку « Отправить» , чтобы проверить, работают ли наши методы ручной работы:

Webix tree component returned values

Да, идентификаторы были успешно отправлены.

Вы можете проверить эту форму здесь:

Multi-tab и Multi-step Forms

Если вы планируете собирать большое количество данных от пользователя, вы можете разделить форму на маленькие части. Давайте рассмотрим две возможности: форму, состоящую из нескольких вкладок, и форму, которая позволяет вставлять данные шаг за шагом.

Компонент Tabview

Компонент Tabview создает коллекцию элементов, разделенных на вкладки, между которыми пользователь может переключаться. Вы можете использовать либо один элемент в качестве содержимого Tabview, либо определить комбинацию строк и столбцов, которая содержит нужные элементы.

Вот пример:

 webix.ui({ ... elements: [{ view:"tabview", cells: [ { header:"First tab label", body: { // first tab content } }, { header:"Second tab label", body: { rows:[ { // first row content }, { // second row content } ] } }, ... ] }] ... }); 

Основная идея этого подхода заключается в разделении формы (таким образом, делая ее более управляемой для вашего пользователя). Однако вы должны помнить, что компоненты, относящиеся ко всей форме (например, кнопка отправки или флажок «Я принимаю»), должны размещаться вне компонента табуляции.

Например:

 webix.ui({ ... elements: [{ view:"tabview", cells: [ { // 1st tab header and content }, { // 2nd tab header and content }, { view:"button", value: "Submit", width: 150, align:"center", click:submit } ] }] ... }); 

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

Webix multitab form with 'Personal Info' and 'Delivery Details' tabs

Дополнительным преимуществом этого подхода является то, что нет необходимости добавлять дополнительный код, чтобы эти части работали как единое целое. Просто поместите компонент tabview в вашу форму, добавьте свойство name в каждое поле, и вы сможете получить все вставленные значения. Нажатие кнопки « Подтвердить» подтверждает это:

Webix multitab form submitted with data from both tabs

Выглядит немного грязно, но все же это наши данные.

Доступность клавиатуры

Если вы хотите использовать большое количество вкладок и хотите переключаться между ними, используйте кнопки на панели вкладок. Этот подход позволяет нам добавлять вкладки в порядок навигации по вкладкам. Все, что вам нужно сделать, это изменить свойство header :

 header: "<button class='webixbutton'>Personal Info</button>" 

Вы должны добавить CSS-код, чтобы эти кнопки выглядели нативно:

 .webix_item_tab .webixbutton{ background-color:transparent; } .webix_item_tab.webix_selected .webixbutton:focus{ background-color:#268fd5; } .webix_item_tab .webixbutton:focus{ background-color:#98abb7; } 

В следующей демонстрации мы также будем использовать средство выбора даты. Нам нужно убедиться, что он появляется, когда пользователь нажимает Return , поскольку, хотя пользователь не может (в настоящее время) взаимодействовать с ним с помощью клавиатуры, он предоставляет полезную визуальную помощь.

Один из способов сделать это — использовать свойство горячих клавиш . Но вот кое-что, что вы должны понять. Это свойство работает без каких-либо проблем, если вы хотите привязать ключ к одному элементу страницы. Но в нашей форме есть два сборщика дат. Таким образом, вы должны использовать метод addHotKey для создания нового обработчика, который работает со всеми вашими датчиками:

 webix.UIManager.addHotKey("enter", function(view){ view.getPopup().show(view.getInputNode()); }, "datepicker"); 

Все это работает вместе в следующей демонстрации:

В качестве альтернативы вы можете использовать Аккордеон для этой задачи.

Multiview Компонент

Компонент Multiview позволяет нам создавать последовательность элементов, которые можно просматривать один за другим. Вы можете использовать вкладки для переключения между областями многократного просмотра, но, так как мы заинтересованы в создании многошаговой формы, давайте добавим кнопки, чтобы провести пользователя по различным этапам.

Прежде всего, нам нужно создать две функции для работы кнопок Next и Back :

 function next(){ var parentCell = this.getParentView().getParentView(); var index = $$("formContent").index(parentCell); var next = $$("formContent").getChildViews()[index+1] if(next){ next.show(); } } function back(){ $$("formCells").back(); } 

next функция использует метод getParentView в Webix для получения ссылки на ячейку, на которой была нажата кнопка (т. Е. На ячейку, отображаемую в данный момент). Затем он использует значение id компонента formContent ( formContent ), чтобы вычислить, какая ячейка (если есть) будет следующей. Если есть следующая ячейка, она переводится в представление с помощью метода show . Функция back использует метод back для переключения многовидового представления на ранее активное представление

Элемент многовидового просмотра может быть определен так же, как мы определили элемент tabview ранее. На этот раз, однако, мы должны поместить один дополнительный ряд внизу каждой ячейки. Этот ряд будет содержать кнопки управления. Если отображается только одна кнопка (как в первой ячейке), мы добавляем пустой объект.

Давайте посмотрим, как это выглядит:

 webix.ui({ ... elements: [{ view: "multiview", id: "formContent", cells: [{ // First step rows: [{ ... cols: [ // Buttons {}, { view: "button", value: "Next", click: next } ] }] }, { // Second step rows: [{ ... cols: [ // Buttons { view: "button", value: "Back", click: back }, { view: "button", value: "Next", click: next } ] }] }, { // Final step rows: [{ ... cols: [ // Buttons { view: "button", value: "Back", click: back }, { view: "button", value: "Submit", click: submit } ] }] }] ... }] }); 

Давайте теперь посмотрим на то, что мы сделали:

Webix multistep form with 'Next' button

После того, как мы нажмем кнопку « Далее» , появится следующая часть формы.

Webix multistep form with 'Next' and 'Back' buttons

И давайте проверим, все ли работает как положено:

Webix multistep form with 'Back' and 'Submit' buttons

Оно делает! Вот последняя демонстрация:

Вывод

В этом уроке я продемонстрировал, как легко Webix позволяет создавать сложные, но стильные и доступные формы. Фреймворк размещает целый ряд мощных виджетов у вас под рукой, и даже если они не предназначены для использования в качестве компонентов формы из коробки, довольно просто переопределить их поведение с protoUI метода protoUI .

Используете ли вы Webix в своих проектах? Этот урок вдохновил вас попробовать? Позвольте мне знать в комментариях ниже.