36
© 2016 Magento, Inc. Page | 1 UI Компоненти

O.Posyniak - UI Components

Embed Size (px)

Citation preview

Page 1: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 1

UI Компоненти

Page 2: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 2

Розробник, Scrum MasterMagento Core, Команда Falcons

Олег Посиняк

Page 3: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 3

Magento 2

Page 4: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 4

Magento 2 Блоки

Page 5: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 5

Структура Блоку

Блок

PHP Клас

PHTML Шабло

н

Page 6: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 6

Що таке UI Компоненти?

• Еволюція Блоків

• Структурні елементи UI

• Поєднують JavaScript і бекенд

Page 7: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 7

Структура UI Компонента

UI Компонент

XML Конфігурація

JS Компонент

PHP DataProvider

HTML Шаблон

Page 8: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 8

Таблиці

Page 9: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 9

Форми

Page 10: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 10

Рендеринг

Layout сторінки

Конфігурація UI

Компонента

Пре-процес та

конвертація в JSON

Рендеринг за допомогою UI

Framework

Page 11: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 11

Нове в структурі модулів

• …/…/UI – Джерело даних

• …/view/{area}/ui_component – Конфігурація UI Компонента

• …/…/web – Статичні файли

Page 12: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 12

Створення сторінки з формою

Page 13: O.Posyniak - UI Components

© 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

Page 14: O.Posyniak - UI Components

© 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

Page 15: O.Posyniak - UI Components

© 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>

• Конфігурація колекції через віртуальний тип• Додавання сконфігурованої колекції в фабрику колекцій

Page 16: O.Posyniak - UI Components

© 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>

Page 17: O.Posyniak - UI Components

© 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

Page 18: O.Posyniak - UI Components

© 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

Page 19: O.Posyniak - UI Components

© 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

Page 20: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 20

Форма без UI Компонентів

Page 21: O.Posyniak - UI Components

© 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

Page 22: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 22

Форма з UI-компонентом

Page 23: O.Posyniak - UI Components

© 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

Page 24: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 24

Відображення динамічних елементів

Page 25: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 25

JavaScript & HTML

Page 26: O.Posyniak - UI Components

© 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

… …

Page 27: O.Posyniak - UI Components

© 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

Page 28: O.Posyniak - UI Components

© 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

Page 29: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 29

Шаблони

• Використовують Knockout.js конструкції

• Мають доступ до конфігурації JS компонента

Magento_UI/view/base/web/templates

Page 30: O.Posyniak - UI Components

© 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

Page 31: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 31

Розширення UI Компонента

Page 32: O.Posyniak - UI Components

© 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

Page 33: O.Posyniak - UI Components

© 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

Page 34: O.Posyniak - UI Components

© 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>

Page 35: O.Posyniak - UI Components

© 2016 Magento, Inc. Page | 35

Форма з новим елементом