Halo semuanya! MySklad Marketplace sedang mengudara. The terakhir kali kita berbicara tentang bagaimana kami meluncurkan aplikasi marketpleys di SaaS-layanan MoySklad . Hari ini kami akan melanjutkan tentang cara kami mengaktifkan aplikasi untuk memperluas antarmuka pengguna layanan. Mungkin, banyak yang menemukan aplikasi desktop dengan plugin serupa, yang, ketika terhubung, menambahkan beberapa tombol mereka sendiri, item menu dan bahkan seluruh rangkaian jendela dan dialog baru ke aplikasi, dan juga menyematkan blok UI mereka sendiri ke layar yang ada. . Bagaimana Anda melakukan ini di layanan SaaS yang memiliki UI browser?
Mengapa harus menyematkan UI?
Di awal Marketplace untuk aplikasi tujuan umum, satu-satunya cara yang tersedia untuk mengintegrasikan aplikasi dengan MyStore adalah integrasi data melalui API JSON umum . Melalui API ini, backend aplikasi vendor dapat menerima dan mengubah data pengguna. Jadi, pada awalnya, kami hanya memiliki kemampuan untuk mengintegrasikan backend aplikasi dan MyStore satu sama lain. Mereka tidak dapat menambahkan tombol atau widget ke formulir pengeditan aplikasi.
Awalnya, terlihat jelas bahwa ini tidak cukup untuk memberikan pengalaman aplikasi terbaik kepada pengguna akhir. Di sisi lain, pengembang dan integrator eksternal harus mengumpulkan mekanisme mereka di UI - mereka memiliki pilihan untuk menyematkan langsung ke aplikasi web HTML MyStore melalui plugin browser atau membuat antarmuka terpisah (UI) di pihak mereka, sebagian besar. menduplikasi fungsionalitas layar di MyStore (misalnya, daftar dokumen dengan filter).
, β , ( ). β , , . , () , .
, , UI- β must have , .
β β iframe . , , . .
UI- -.
.
, , SaaS-.
. UI, .
:
:
,
:
. . , , ( ) UI ( ) (UX).
. . , , , ββ .
/ . , UI β SPA, : DOM- , UI β . , .
?
SaaS- (Jira, Salesforce, Zendesk) (amoCRM, 24, InSales). .
:
: SPA - ?
- (- , iframe ), , SDK ( UI)?
, ?
. , / .
. , .
, SPA- ββ SPA (ββ β , , UI SPA, - β ). UI β SPA.
iframeβ. :
iframe , ( , β ). sandbox iframeβa
allow-same-origin
, DOM - . - , , JavaScript-. ().
iframe (
allow-same-origin
) β , DOM- - . . - postMessage, , , , JavaScript- - . , postMessage JS SDK β JavaScript-.
JS SDK. JS SDK API , API ββ postMessage JavaScript-.
amoCRM, DOM- -. , , , β , UI. , . , , , - .
(, ) β JSON- (). XML β XML- ( JSON-). XML JSONβa β .
XML-
, , :
<ServerApplication xmlns="https://online.moysklad.ru/xml/ns/appstore/app/v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://online.moysklad.ru/xml/ns/appstore/app/v2
https://online.moysklad.ru/xml/ns/appstore/app/v2/application-v2.xsd">
<iframe>
<sourceUrl>https://example.com/iframe.html</sourceUrl>
<expand>true</expand>
</iframe>
<vendorApi>
<endpointBase>https://example.com/dummy-app</endpointBase>
</vendorApi>
<access>
<resource>https://online.moysklad.ru/api/remap/1.2</resource>
<scope>admin</scope>
</access>
<widgets>
<entity.counterparty.edit>
<sourceUrl>https://example.com/widget.php</sourceUrl>
<height>
<fixed>150px</fixed>
</height>
<supports>
<open-feedback/>
<save-handler/>
</supports>
<uses>
<good-folder-selector/>
</uses>
</entity.counterparty.edit>
</widgets>
<popups>
<popup>
<name>somePopup</name>
<sourceUrl>https://example.com/popup.php</sourceUrl>
</popup>
<popup>
<name>somePopup2</name>
<sourceUrl>https://example.com/popup-2.php</sourceUrl>
</popup>
</popups>
</ServerApplication>
, XML, JSON? , XML β XML Schema. JSON β , JSON Schema. JSON- ( XML-) , , IDE. , JSON- . , XML- . JSON-, , XML JSON , XML- .
? :
, . , , , - . β .
code completion IDE β β UI . - ( ), .
, , Intellij IDEA , :
IDE open-feedback ( - ):
:
.
XML-
( ) . , ( ) . β . , . , . . . .
. , . , β , , , , , , - . , , - , . .
, XML-:
<widgets>
<some.extension.point1>...</some.extension.point1>
<some.extension.point2>...</some.extension.point2>
</widgets>
, , :
<widgets>
<widget location="some.extension.point1">...</widget>
<widget location="some.extension.point2">...</widget>
</widgets>
XML- (ββ) . - ββ β . , XML-, XML-.
? , , ?
:
<document.customerorder.edit>
<sourceUrl>https://example.com/widget.php</sourceUrl>
<height>
<fixed>150px</fixed>
</height>
<supports>...</supports>
<uses>...</uses>
</document.customerorder.edit>
sourceUrl
height
. sourceUrl
iframe, height
( , β , , UI).
( ) - (, , ), , <height><dynamic/></height>
. β . , , <dynamic/>
, .
supports
uses
. .
( API , ):
:
<document.customerorder.edit>
<sourceUrl>https://example.com/widget.php</sourceUrl>
<height>
<fixed>150px</fixed>
</height>
<supports>
<open-feedback/>
<save-handler/>
<change-handler>
<expand>agent</expand>
<expand>positions.assortment</expand>
</change-handler>
</supports>
<uses>
<good-folder-selector/>
</uses>
</document.customerorder.edit>
.
β , UI , . , HTTP postMesssage. .
.
β , / ( ). . , sourceUrl
height
, iframe HTTP - postMessage- Open
.
DOM- :
Open
:
{
"name": "Open",
"messageId": 12345,
"extensionPoint": "entity.counterparty.edit",
"objectId": "8e9512f3-111b-11ea-0a80-02a2000a3c9c",
"displayMode": "expanded"
}
β ( ) , . supports
( ). .
supports
. .
pen-feedback
( ) β , , , OpenFeedback
. , . - , .
:
OpenFeedback
:
{
"name": "OpenFeedback",
"correlationId": 12345
}
save-handler
( ) β , - ββ Save
.
Save
:
{
"name": "Save",
"messageId": 32109,
"extensionPoint": "entity.counterparty.edit",
"objectId": "8e9512f3-111b-11ea-0a80-02a2000a3c9c"
}
hange-handler
( ) β , , , ( ). , change-handler
, - ββ β - (, ) - Change
JSON . expand
, JSON API ( change-handler
expand
).
β , - . . uses ( ). , -> - -.
β good-folder-selector
. . :
1. - SelectGoodFolderRequest
(, - ):
{
"name": "SelectGoodFolderRequest",
"messageId": 12345
}
2. - :
3. - SelectGoodFolderResponse
:
{
"name": "SelectGoodFolderResponse",
"correlationId": 12345,
"selected": true,
"goodFolderId": "8e9512f3-111b-11ea-0a80-02a2000a3c9c"
}
:
, .
XML- , ( ).
/ , . : , , - , , , .
, -. , change-handler, - , ( SPA- ).
(, - Init postMessage, iframe. , , ( ), (, ). , , β , - , ( ). , .
?
?
. - , . - . . iframe, . postMessage- -. .
change-handler
. β update
, -.
:
ββ postMessage JavaScript/TypeScript Widget SDK
UI- ( ) β , :
,
UI
RESP API Widget SDK
UI β SaaS- , .
β email- , , .