Upload
oleg-posyniak
View
83
Download
5
Embed Size (px)
Citation preview
© 2016 Magento, Inc. Page | 1
UI Компоненти
© 2016 Magento, Inc. Page | 2
Розробник, Scrum MasterMagento Core, Команда Falcons
Олег Посиняк
© 2016 Magento, Inc. Page | 3
Magento 2
© 2016 Magento, Inc. Page | 4
Magento 2 Блоки
© 2016 Magento, Inc. Page | 5
Структура Блоку
Блок
PHP Клас
PHTML Шабло
н
© 2016 Magento, Inc. Page | 6
Що таке UI Компоненти?
• Еволюція Блоків
• Структурні елементи UI
• Поєднують JavaScript і бекенд
© 2016 Magento, Inc. Page | 7
Структура UI Компонента
UI Компонент
XML Конфігурація
JS Компонент
PHP DataProvider
HTML Шаблон
© 2016 Magento, Inc. Page | 8
Таблиці
© 2016 Magento, Inc. Page | 9
Форми
© 2016 Magento, Inc. Page | 10
Рендеринг
Layout сторінки
Конфігурація UI
Компонента
Пре-процес та
конвертація в JSON
Рендеринг за допомогою UI
Framework
© 2016 Magento, Inc. Page | 11
Нове в структурі модулів
• …/…/UI – Джерело даних
• …/view/{area}/ui_component – Конфігурація UI Компонента
• …/…/web – Статичні файли
© 2016 Magento, Inc. Page | 12
Створення сторінки з формою
© 2016 Magento, Inc. Page | 13
Демо модуль
Де знайти?– https://github.com/shiftedreality/module-mageconf-ui-demo
Інсталяція– Через Composer php composer.phar require shiftedreality/module-
mageconf-ui-demo– Git clone
© 2016 Magento, Inc. Page | 14
Базова структура модуля
• {vendor}/{module}/registration.php• …/…/etc/module.xml• …/…/etc/di.xml• …/…/etc/adminhtml/menu.xml• …/…/etc/adminhtml/routes.xml• …/…/Controller/Adminhtml/Index/Index.php• …/…/view/adminhtml/layout/demo_index_index.xml• …/…/view/adminhtml/ui_component/demo_item_form.xml
© 2016 Magento, Inc. Page | 15
.../…/etc/di.xml
<config xmlns:xsi="…" xsi:noNamespaceSchemaLocation="…"> <virtualType name="ShiftedReality\MageConfDemo\Model\ResourceModel\Item\Grid\Collection" <!--...--> </virtualType> <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory"> <arguments> <argument name="collections" xsi:type="array"> <item name="item_form_data_source" xsi:type="string"> ShiftedReality\MageConfDemo\Model\ResourceModel\Item\Grid\Collection </item> </argument> </arguments> </type></config>
• Конфігурація колекції через віртуальний тип• Додавання сконфігурованої колекції в фабрику колекцій
© 2016 Magento, Inc. Page | 16
Конфігурація Layout• Файл view/adminhtml/layout/demo_index_index.xml• Додавання компонента в блок <referenceContainer>
<page xmlns:xsi="…" xsi:noNamespaceSchemaLocation="…"> <body> <referenceContainer name="content"> <uiComponent name="demo_item_form"/> </referenceContainer> </body></page>
© 2016 Magento, Inc. Page | 17
Конфігурація компонента форми
<form xmlns:xsi="…" xsi:noNamespaceSchemaLocation="…"> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> <!--JS config--> </item> <item name="config" xsi:type="array"> <!--Data scope config--> </item> <item name="template" xsi:type="string">templates/form/collapsible</item> <item name="buttons" xsi:type="array"> <!--Buttons config--> </item> </argument> <dataSource name="item_form_data_source"> <!--Data Source--> </dataSource> <!--Components--></form>
…/…/view/adminhtml/ui_component/demo_block_form.xml
© 2016 Magento, Inc. Page | 18
Конфігурація джерела даних
<form xmlns:xsi="…" xsi:noNamespaceSchemaLocation="…"> <!--...--> <dataSource name="item_form_data_source"> <argument name="dataProvider" xsi:type="configurableObject"> <argument name="class" xsi:type="string"> ShiftedReality\MageConfDemo\Ui\DemoDataProvider </argument> <!--...--> </argument> <argument name="data" xsi:type="array"> <item name="js_config" xsi:type="array"> <item name="component" xsi:type="string"> Magento_Ui/js/form/provider </item> </item> </argument> </dataSource> <!--...--></form>
…/…/view/adminhtml/ui_component/demo_block_form.xml
© 2016 Magento, Inc. Page | 19
Джерело даних(DataProvider)
Magento/Framework/View/Element/UiComponent/DataProvider/DataProviderInterface.php
Magento/Framework/View/Element/UiComponent/DataProvider/
DataProvider.php
Magento/Ui/DataProvider/AbstractDataProvider.php
ShiftedReality/MageConfDemo/Ui/DemoDataProvider.php
© 2016 Magento, Inc. Page | 20
Форма без UI Компонентів
© 2016 Magento, Inc. Page | 21
Конфігурація елементів в формі
<form xmlns:xsi="…" xsi:noNamespaceSchemaLocation="…"> <!--...-->
<fieldset name="general"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string">Simple elements</item> <item name="collapsible" xsi:type="boolean">false</item> </item> </argument> <field name="input"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="sortOrder" xsi:type="number">10</item> <item name="dataType" xsi:type="string">string</item> <item name="formElement" xsi:type="string">input</item> <item name="label" xsi:type="string" translate="true">Sample Input</item> </item> </argument> </field> <!-- Place for dynamic element --></fieldset>
</form>
…/…/view/adminhtml/ui_component/demo_block_form.xml
© 2016 Magento, Inc. Page | 22
Форма з UI-компонентом
© 2016 Magento, Inc. Page | 23
Динамчна конфігурація в PHP
use Magento\Framework\View\Element\UiComponent\DataProvider\DataProvider;
class DemoDataProvider extends DataProvider{ public function getMeta() { $meta = parent::getMeta(); $meta['general']['children']['dynamic']['arguments']['data']['config'] = [ 'dataType' => Boolean::NAME, 'formElement' => Checkbox::NAME, 'notice' => __('This is dynamic element added from backend'), 'label' => __('Sample Checkbox'), 'code' => 'checkbox', 'source' => 'general', 'sortOrder' => 40, 'componentType' => Field::NAME, 'prefer' => 'toggle', ]; return $meta; }}
…/…/Ui/DemoDataProvider.php
© 2016 Magento, Inc. Page | 24
Відображення динамічних елементів
© 2016 Magento, Inc. Page | 25
JavaScript & HTML
© 2016 Magento, Inc. Page | 26
Бібліотека компонентів• Magento_UI/view/base/web/js/form/element• Magento_UI/view/base/web/js/grid
Форми Таблиціboolean.js columns/actions.js
checkbox-set.js columns/date.js
country.js columns/multiselect.js
date.js …
file-uploader.js editing/bulk.js
media.js editing/editor.js
… …
© 2016 Magento, Inc. Page | 27
Абстрактний компонент
define([…], function () { 'use strict'; return Element.extend({ defaults: { visible: true, preview: '', focused: false, required: false, disabled: false, valueChangedByUser: false, elementTmpl: 'ui/form/element/input', tooltipTpl: 'ui/form/element/helper/tooltip', 'input_type': 'input', placeholder: '', description: '', } });});
Magento/Ui/view/base/web/js/form/element/abstract.js
© 2016 Magento, Inc. Page | 28
Компонент Textarea
define([ './abstract'], function (Abstract) { 'use strict';
return Abstract.extend({ defaults: { cols: 15, rows: 2, elementTmpl: 'ui/form/element/textarea' } });});
Magento/Ui/view/base/web/js/form/element/textarea.js
© 2016 Magento, Inc. Page | 29
Шаблони
• Використовують Knockout.js конструкції
• Мають доступ до конфігурації JS компонента
Magento_UI/view/base/web/templates
© 2016 Magento, Inc. Page | 30
Шаблон Textarea
<textarea class="admin__control-textarea" data-bind=" value: value, valueUpdate: valueUpdate, hasFocus: focused, attr: { name: inputName, cols: cols, rows: rows, 'aria-describedby': noticeId, placeholder: placeholder, id: uid, disabled: disabled }" />
Magento/Ui/view/base/web/templates/form/element/textarea.html
© 2016 Magento, Inc. Page | 31
Розширення UI Компонента
© 2016 Magento, Inc. Page | 32
JavaScript компонент
define([ 'Magento_Ui/js/form/element/abstract' ], function (Abstract) { 'use strict';
return Abstract.extend({ defaults: { placeholder: 'This is demo component' } })});
…/…/view/adminhtml/web/js/components/form/demo.js
© 2016 Magento, Inc. Page | 33
Шаблон
<input class="admin__control-text" style="background-color: red;" type="text" data-bind=" event: {change: userChanges}, value: value, hasFocus: focused, valueUpdate: valueUpdate, attr: { name: inputName, placeholder: placeholder, 'aria-describedby': noticeId, id: uid, disabled: disabled }"/>
…/…/view/adminhtml/web/template/form/element/demo.html
© 2016 Magento, Inc. Page | 34
Розширення декларації форми…/…/view/adminhtml/ui_component/demo_block_form.xml
<form xmlns:xsi="…" xsi:noNamespaceSchemaLocation="…"> <!--...--> <fieldset name="general"> <!--...--> <field name="demo"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="sortOrder" xsi:type="number">60</item> <item name="dataType" xsi:type="string">string</item> <item name="formElement" xsi:type="string">input</item> <item name="label" xsi:type="string" translate="true">Demo UI Component</item> <item name="component" xsi:type="string"> ShiftedReality_MageConfDemo/js/components/form/demo </item> <item name="elementTmpl" xsi:type="string"> ShiftedReality_MageConfDemo/form/element/demo </item> </item> </argument> </field> </fieldset></form>
© 2016 Magento, Inc. Page | 35
Форма з новим елементом
© 2016 Magento, Inc. Page | 36
Корисні ресурси
• Офіційна документація http://devdocs.magento.com/guides/v2.0/ui-components/ui-component.html
• Демо модуль https://github.com/shiftedreality/module-mageconf-ui-demo
• Knockout context debugger https://chrome.google.com/webstore/detail/knockoutjs-context-debugg/oddcpmchholgcjgjdnfjmildmlielhof?hl=en
• Magento StackExchange http://magento.stackexchange.com/