Как отправить внешние данные в плагин OnlyOffice
Я разрабатываю плагин onlyoffice, который должен использовать данные (например, reportid, подробности сеанса, которые будут использоваться для загрузки данных с сервера) из запуска приложения.
Структура страницы получится так:
стартовая страница (editor.aspx) - iframe 1 для загрузки редактора -- ifram 2 для загрузки плагина
Здесь я хочу получить доступ к данным из editor.aspx в iframe 2 (JavaScript)
Я пытался использовать queryString как window.parent.location.search
но он может проходить только до iframe 1, но не до основной страницы aspx. Поскольку у меня нет контроля над тем, какие нагрузки в iframe 1, он не работал.
Также я попробовал с куки и localStorage, но ничего не получилось.
Пожалуйста, руководство..
2 ответа
стартовая страница (editor.aspx) - iframe 1 для загрузки редактора -- ifram 2 для загрузки плагина. Здесь я хочу получить доступ к данным из editor.aspx в iframe 2 (JavaScript)
Невозможно получить прямой доступ к iframe с помощью редактора, единственный способ работать с ним - использовать плагины сервера документов.
На самом деле есть способ... Потратив МНОГО времени на анализ происходящего... наконец-то нашел хороший способ обмена конфигами между TOP
рамка и PLUGIN
фрейм с несколькими строками кода, используя API -интерфейс onlyoffice - без каких-либо взломов:)
Редактор Config объекта:
config: {
"width" : "100%",
"height" : "100%",
"type" : "desktop",
"documentType": "text",
"token" : "{{token}}",
"document" : {
"title" : "{{document.name}}",
"url" : "{{downloadUrl}}",
...
events: {
'onReady': <application ready callback>, // deprecated
...
'onInfo': function ( data ) {
if ( data && data.data && data.data.getConfig ) {
docEditor.serviceCommand ( 'getConfig', config.document );
}
}
}
}
var docEditor = new DocsAPI.DocEditor("placeholder", config);
onInfo
Событие получит запрос от вашего плагина. Необходимо проверить данные события getConfig
приписывать. Если это так, отправьте обратно плагин.
В вашем плагине index.html
Добавьте встроенный тег сценария с этим содержимым:
// config ref
var config;
// Get ready to receive the response from TOP
window.parent.Common.Gateway.on ( 'internalcommand', ( data ) => {
if ( data.command = 'getConfig' ) {
config = data.data;
}
} );
// Send custom config request to TOP
window.parent.Common.Gateway.sendInfo ( { getConfig: true } );
Подписывается на internalcommand
События шлюза, которые будут вызываться TOP
затем включите процесс общения, позвонив sendInfo
команда. Поскольку редактор и ваши плагины (скорее всего) будут размещаться в одном домене, вы можете получить к нему доступ через window.parent
ссылка
Это загрузит config.document
Конфигурация объекта и хранить его в локальных плагинах config
переменная автоматически - при нажатии на плагин на панели инструментов.
Изменять api.js
файл с сервера onlyoffice для пересылки параметров строки запроса в плагин, и это работало примерно так.
function getQueryStringOfParentPage() {
var queryString = "";
try {
queryString = window.parent.location.search.replace('?', '');
} catch (e) {
console.log("getQueryStringOfParentPage::" + e.message );
}
return queryString;
}
function createIframe(config) {
var parentPageQueryString = getQueryStringOfParentPage();
var iframe = document.createElement("iframe");
iframe.src = getAppPath(config) + getAppParameters(config) + "&" + parentPageQueryString;
iframe.width = config.width;
iframe.height = config.height;
iframe.align = "top";
iframe.frameBorder = 0;
iframe.name = "frameEditor";
iframe.allowFullscreen = true;
iframe.setAttribute("allowfullscreen",""); // for IE11
iframe.setAttribute("onmousewheel",""); // for Safari on Mac
return iframe;
}