Вызов внешних действий - это возможность действия, выходящего за рамки возможности работы с БД через SQL.
В некоторых процедурах можно вызвать такие внешние действия как отправка почты, СМС, очистка кеша, создание уведомления. Это можно использовать в следующих случаях:
Пример данного select2:
select 'email' type, -- email, sms, notification, clearcache
'x1' spCallback, -- вызов некой хранимки после внешнего действия (с именем outer_x1)
'ru@rudensoft.ru' [to], 'sub1' subject, 'bodyXXX'+@itemIDs body, ---EMAIL
'Text 1' msg, '723429234' [number], --- SMS
'' prefix, --CLEAR CACHE
'text1' text , 'ru@rudensoft.ru' [to],
'ticketExecutor' typeCode, 'http///' url,
'add111' additional -- notifications
Использоваться будут только те параметры, которые актуальны для выбранного type (обязательный параметр для внешнего действия).
Необязательный параметр spCallback также есть для всех внешних действий и необходим для вызова некой хранимой процедуры outer_xxxx после выполнения внешнего действия (см. ниже описание)
Если необходимо сделать сразу несколько внешних действий - то можно прописать через Union (и в этом случае указать все параметры чтобы была возможность сделать union).
Примечание. Внешние действия могут возвращать результат на front end сторону (ВАЖНО! эти данные доступны пользователю в браузере!), где вы можете обработать их через JS и показать пользователю результат (поле data.additionalData в коллбеке сохранения формы).
Если вызвано было несколько действий, то результаты передаются через конкатенацию с "||", например, aa||bbb||c.
Внимание! Параметры SELECT с внешним действием зависимы от регистра букв. Указывайте названия именно в том регистре, какой используется в документации или рабочих примерах.
Type - типы команды (notification, clearcache, email, emailtemplate, sms, apirequest)
select 'notification' type, 'text1' text , 'demo1' [to], 'ticketExecutor' typeCode, 'http///' url, 'add111' additional
См. подробнее про работу с уведомлениями.
select 'clearcache' type, '' prefix
Если префикс указан, то кеш будет чистить ключи только с заданным префиксом (по умолчанию это as_).
Отправка сообщения в телеграм пользователю (если он подписан на бота системы).
-- простая отправка
select 'telegram' type, 'username' [to], 'message text' [text]
-- отправка с кнопками
select 'telegram' type, 'text1' text, 'admin' [to], '@falconSpaceTest' channel, '{}' buttonsJSON, '' parseMode
Также в to можно указать ранее привязанный telegram в tg_settings в формате '@telegramLogin' (поиск осуществляется через процедуру tg_getChatID). Таким образом можно отправлять незарегистрированным в системе пользователям уведомления по их логину в телеграм (но они должны изначально обратиться к боту для создания привязки в tg_settings).
type = telegram.info
Позволяет получить данные о количестве участников чата, общие данные по чату, список администраторов, информацию о себе, и информацию о конкретном участнике чата.
Данные сохраняются в JSON и передаются в параметре Msg (который можно обработать через коллбек внешнего действия spCallback либо на стороне JS (например, callback для сохранения формы в Javascript) в AdditionalData).
В случае использования spCallback все результаты выполнения этой команды приходят в @parameters ExtendedDictionaryParameter. в нем будут элементы:
Примеры:
select 'telegram.info' type, 'chatmemberscount' infotype, '273533547' chatID
select 'telegram.info' type, 'chat' infotype, '273533547' chatID
select 'telegram.info' type, 'chatadministrators' infotype, '273533547' chatID
select 'telegram.info' type, 'me' infotype
select 'telegram.info' type, 'chatmember' infotype, '273533547' chatID, '273533547' userID
select 'email' type, 'ru@rudensoft.ru' [to], 'sub1' subject, 'body1' body
См. подробное про настройки Email
Шаблоны писем создаются в разделе /email-templates
select 'emailtemplate' type, 'code1' code,
'ru@rudensoft.ru' [to], 'hecrus@mail.ru' bcc,
'Некий параметр' name1, 'Наименование некоего товара' productName1
Примечание: для корректной работы отправки, в системе должны быть таблицы as_mailing_templates, as_mailing_log
select 'sms' type, 'Text 1' msg, '723429234' [number]
Внимание! Используйте вместо type=sms отправку API (с подключением к какому-либо провайдеру SMS) запросов для отправки SMS.
select 'apirequest' type, 'code1' code, 'name1' p1_name, 'val1' p1_value,..........'name10' p10_name, 'val10' p10_value
ВАЖНО! Параметры во внешнее действие apirequest должны быть иметь тип Строка (приводите числа, булев тип и др к строке через cast). Пример:
select 'apirequest' type, 'checkContragent' code, 'clientID' p1_name, cast(@clientID as nvarchar(max)) p1_value
См. подробнее про запросы API.
select 'directAPI' type, @purl url, @pcontenttype contenttype, @pmethod method,
@pheaders headers, @pformparams formparams, @pfiles files, @ppostbody body
Параметры:
Вы можете через указание настроек сгенерировать графический файл. В файле вы можете писать некий текст, размещать блоки, линии и добавлять картинки. Все настройки генерации указываются через JSON в параметре options (обязательно используйте кавычки для имен в JSON).
Пример:
select 'generateImage' type, '
{
"options":{
"path":"'+@url+'",
"width":"735",
"height":"354",
"backColor":"#fff",
},
"render": [
{
"type": "image",
"path":"'+@backImg+'",
"x":"0",
"y":"0",
"width":"735",
"height":"354",
"opacity":"1"
},
{
"type": "text",
"text":"'+iif(@langID=1, 'Discount', 'Скидка')+' '+@pdiscount+'%",
"x":"30",
"y":"120",
"width":"400",
"height":"120",
"color":"#fff",
"backColor":"",
"fontSize":"38",
"fontFamily":"Verdana"
},
{
"type": "line",
"x1":"20",
"y1":"190",
"x2":"380",
"y2":"190",
"thickness":"1",
"color":"white"
},
{
"type": "text",
"text":"'+iif(@langID=1, 'Coupon 124322', 'Купон 1234241')+'",
"x":"120",
"y":"200",
"width":"400",
"height":"120",
"color":"#fff",
"backColor":"",
"fontSize":"18",
"fontFamily":"Verdana"
},
{
"type": "text",
"text":"'+iif(@langID=1, 'Active till ', 'Действует до ')+' '+@date+'",
"x":"20",
"y":"10",
"width":"400",
"height":"120",
"color":"#fff",
"backColor":"",
"fontSize":"10",
"fontFamily":"Verdana"
},
{
"type": "text",
"text":"'+iif(@langID=1, 'John Smith Ltd', 'ИП Иванов И.И. ОГРН 12355152413123')+'",
"x":"230",
"y":"10",
"width":"400",
"height":"120",
"color":"#000",
"backColor":"",
"fontSize":"10",
"fontFamily":"Verdana"
},
{
"type": "text",
"text":"'+@ptext+'",
"x":"20",
"y":"300",
"width":"400",
"height":"120",
"color":"#fff",
"backColor":"",
"fontSize":"7",
"fontFamily":"Verdana"
}
]
}
' options
раздел options задает общие настройки картинки.
раздел render задает последовательность вывода элементов на картинке. Поле type задает формат вывода элемента:
type=text - вывод элемента Текст, параметры:
type=image - вывод картинки. У него следующие параметры:
type=line- это Линия, параметры:
type=barcode - добавляет картинку штрихкода. Параметры:
ВАЖНО: должен быть установлен (открыть файл ttf и кнопка Установить) шрифт font39 на сервере или другой аналогичный шрифт для вывода штрихкодов. Шрифт есть в папке /content/fonts. После установки шрифта нужно перезагрузить IIS на сервере.
Пример:
select 'generateImage' type, '
{
"options":{
"path":"/uploads/_1.jpg",
"width":"735",
"height":"354",
"backColor":"#fff",
},
"render": [
{
"type": "barcode",
"value": "13244241",
"x":"0",
"y":"0",
"width":"300",
"height":"254"
}
]
}
' options
Вы можете выполнить трансформацию картинок (изменить размеры, качество и т.д.)
Для этого необходимо выполнить следующее действие:
select 'processimage' type, '/uploads/viki.png' path, '/uploads/x-viki.png' url,
300 width, 300 height, 50 quality, '1' fitWithWhitespace, '' watermarkUrl
union
select 'processimage' type, '/uploads/viki2.png' path, '/uploads/x-viki2.png' url,
100 width, 100 height, 50 quality, '1' fitWithWhitespace, '' watermarkUrl
Таким образом можно сделать пакетную обработку множества картинок.
Параметры processimage
Важно: path и url должны быть различными!
Автоматизированный тест позволяет выполнить некий сценарий действий в Chrome и записать результаты выполнения этих операций для проверки работы корректности страниц.
Вы можете запустить тесты, указав в actions коды тестов через запятую. Сами тесты создаются в разделе /frontchecker (пока доступно только в Core версии платформы).
select 'frontchecker' type, 'action1,action2' actions
Вы можете передать некие параметры на вход механизму генерации документов (as-doc) и получить ссылку на результирующий документ.
select 'generatedoc' type, 'stageAct' code, '2459' itemID, '{
"date" : "11.11.11",
"num": "4444"
}' parameters
Полученный результат от внешнего действия можно использовать либо в коллбеке {code}_saveItem формы, либо через дополнительную обработку outer_ действий (последовательное выполнение нескольких внешних действий, например, для отправки на почту).
Пример коллбека формы:
$(function(){
as.form.callbacks["generateAct_saveItem"] = function(data){
var url = data.additionalData;
if(url){
as.sys.bootstrapAlert("Ваш файл", {type:"success", delay:0});
}
}
});
Вы можете сжать некую папку на сервере в zip архив следующей командой:
select 'zip' type, '/uploads/dir1' directory, '/uploads/zipFile.zip' zipFile
Для распаковки архива используйте следующую команду:
select 'extractZip' type, '/uploads/zipFile.zip' zipFile,'/uploads/dir1' outputDirectory, 1 overwrite
Скачиваем некие файлы с удаленного источника и размещаем в папку:
select 'download' type, '/uploads/dir1' path, 'https://site.ru/uploads/zipFile.zip' url, 4 maxFileSizeMb, '' filename
Пример с headers:
select 'download' type, '/uploads/dir2' path,
'https://falconspace.ru/uploads/falcon-logo.png' url,
4 maxFileSizeMb, 'ss||11,ddd||22' headers
В выходном Msg будет ссылка на скачанный файл.
Скачиваем некоторый файл по URL и извлекаем из него некоторые теги через XPath:
select 'downloadPage' type, 'https://yandex.ru' url, '//title,//h1' commaxpath
На входе:
На выходе:
Через spCallback вы сможете обработать эти извлеченные значения:
Create or ALTER PROCEDURE [dbo].[outer_relmapProcessPage]
@parameters ExtendedDictionaryParameter readonly,
@data nvarchar(128) = '',
@username nvarchar(128) = ''
AS
BEGIN
declare @s nvarchar(max) = (select Value2 from @parameters where lower([Key]) = 'content')
declare @title nvarchar(max) = (select top 1 value2 from @parameters where [key]='//title')
-- SELECT 1 ReesultModel
select 1 Result, '' Msg
END
Из HTML строки создаем Word файл.
select 'html2docx' type, 'some html' html, '/uploads/g1.docx' filename
На входе:
На выходе:
Отправка производится через SignalR и указанным зарегистрированным пользователям немедленно приходит запрос с информацией в браузер.
Формат команды:
select 'sendToBrowser' type, 'admin' username,
'' falconGuid,
'' url,
'action1' code,
'{
"s":1,
"redirectUrl" : "",
// любые другие данные...
"alert": {
"text": "Текст сообщения",
"type": "warning",
"delay": 2000,
"hidePrev": true,
"title": "Заголовок"
},
"audio": "/uploads/mp3/call.mp3",
"updates": [
{"control": "table", "code":"code1", "itemID": "123", "pk":"12345", "col": "col1", "value": "value1"},
{"control": "form", "code":"code1", "itemID": "123", "col": "col1", "value": "value1"}
],
"refreshContainer": ".class1",
"setContainerContent": { "selector": ".class1", "value": "value1", "delay": 1000 }
}' data
Параметры:
Параметр audio (путь к файлу mp3) - если указан путь к файлу, то он будет единоразово проигран в браузере получателя.
Параметры для alert:
Массив updates позволяет обновить в режиме реального времени поле таблицы или формы. Указываем тип компонента (control), код компонента (code), itemID (привязка к сущности - параметр компонента data-itemID), какая колонка (col) и какое значение необходимо установить. Для таблиц также передается pk - первичный ключ таблицы (параметр id).
Раздел setContainerContent - позволяет установить через delay мс нужную разметку(value) в некотором контейнере с селектором selector.
Если передан refreshContaner, то на клиенте будет обновлена область с указанным jquery селектором в refreshContainer.
redirectUrl - если задан, то пользователь, которому пришло это сообщение, будет переведен на указанный адрес.
Раздел pushOptions задает настройки push уведомления пользователю:
Раздел printlog выводит общий поток подобных данных в контейнере слева внизу на странице:
Коллбек опционально может быть подключен на странице. Пример коллбека:
$(function(){
as.signalr_action1 = function(data){
console.log("Полученные с сервера данные", data);
}
});
Если коллбек найден, то он будет выполнен. Ему на вход передается объект JSON data, который мы передали из внешнего действия.
Команда может иметь различные действия (задаются в поле action), выполняемые в отношении объектов на Google Drive
Подробнее про интеграцию с Google Drive и варианты команд action.
Команда может иметь различные действия (задаются в поле action) с FTP протоколом - загружать файлы на FTP хранилище, скачивать, удалять и т.д.
Подробнее про передачу файлов по FTP.
Вы можете задать некие правила в виде JSON и исходя из них будет формироваться файл PDF.
Формат команды:
Пример настроек:
declare @url nvarchar(128) = '/uploads/pdf/'+convert(nvarchar(50), newid())+'.pdf'
-- SELECT 1 (Result, Msg, SuccessUrl, HideFormAfterSubmit, RefreshContainer)
select 1 Result, 'OK Download PDF' Msg, '' SuccessUrl, 1 HideFormAfterSubmit, '' RefreshContainer
--select 1 Result, 'Сохранено'
declare @options nvarchar(max) = N'
{
"options": {
"title": "Test Document"
},
"pages": [
{
"elements": [
{
"type": "text",
"value": "'+isnull(@pname, 'No name')+N'",
"alignment": "center",
"marginTop": "6cm",
"marginBottom": "0",
"marginLeft": "0",
"marginRight": "0",
"paddingTop": "0cm",
"paddingBottom": "0",
"paddingLeft": "0",
"paddingRight": "0",
"firstLineIndent": "0cm", //красная строка для абзацев
"color": "#000000",
"backgroundColor": "#FFFFFF",
"font": {
"size": 30,
"bold": false,
"italic": false
}
},
{
"type": "text",
"value": "PDF Generator test",
"alignment": "center",
"font": {
"size": 16,
"italic": true
}
}
]
},
{
"elements": [
{
"type": "image",
"path": "/uploads/land/finance.jpg",
"width": "10cm", //соотношение сторон сохраняется, можно указывать либо ширину, либо высоту
"height": "10cm",
"alignment": "left",
//"wrapStyle": "through" //при значении through картинка становится фоном для последующих элементов. По идее здесь же настраиваниется обтекание текста вокруг картинки, пока это не работает
},
{
"type": "text",
"value": "Text below the image",
"alignment": "left",
"font": {
"size": 14,
"italic": true
}
},
{
"type": "line",
"color": "#333399",
"thickness": "0.1cm"
},
{
"type": "text",
"value": "This is a line test",
"alignment": "right",
"font": {
"size": 12,
"bold": true
}
}
]
},
{
"elements": [
{
"type": "table",
"border": {
"width": "0.02cm",
"color": "#000000"
},
"columnWidths": ["4cm", "4cm", "2cm"],
"headers": ["Column ", "Column 2", "Column 3"],
"values": [
["value 1_1", "value 1_2", "value 1_3"],
["value 2_1", "value 2_2", "value 2_3"],
["value 3_1", "value 3_2", "value 3_3"],
["result", "", ""]
],
"styleOptions": [
{
"position": [4, 0], //координаты ячейки, которую правим. [X, Y] - где X - строка, Y - столбец, начиная с нуля, строка 0 - шапка
"alignment": "right",
"font": { "bold": true, "italic": false, "family": "Arial", "size": 12 },
"mergeRight": 2, //объединить n ячеек справа с этой
"mergeDown": 0 //объединить n ячеек ниже с этой
}
]
},
{
"type": "text",
"value": "This is a table",
"color": "#ff3333",
"backgroundColor": "#ddddff",
"paddingBottom": "0.2cm",
"marginTop": "0.1cm"
},
{
"type": "text",
"value": "Some lists:",
"marginTop": "1cm"
},
{
"type": "list",
"listStyle": "ul",
"items": [
"item1",
"item2",
"item3"
]
},
{
"type": "list",
"listStyle": "ol",
"items": [
"item1",
"item2",
"item3"
]
},
{
"type": "list",
"listStyle": "ol2",
"items": [
"item1",
"item2",
"item3"
]
},
{
"type": "list",
"listStyle": "ol3",
"items": [
"item1",
"item2",
"item3"
]
},
{
"type": "text",
"value": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"marginBottom": "0.5cm",
"firstLineIndent": "1.5cm"
},
{
"type": "text",
"value": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"marginBottom": "0.5cm",
"firstLineIndent": "1.5cm"
},
{
"type": "text",
"value": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
"marginBottom": "0.5cm",
"firstLineIndent": "1.5cm"
}
]
}
]
}
'
select 'generatepdf' type,
@url url,
@options options
Мы последовательно указываем страницы документа и элементы на этих страницах, это может быть текст, картинка, таблица, списки, линии.
ВАЖНО: при вставке параметров в JSON обязательно строку помечайте как N'' (иначе будет не юникод и не будет корректно обрабатываться JSON объект).
Скачивает файлы на сервер из внешнего источника
select 'download' type, 'https://site.ru/uploads/importXML/rss.zip' url, '/uploads' path
union
select 'download' type, 'https://site.ru' url, '/uploads' path
Получить список онлайн пользователей (user.onlineusers)
Возвращает Result и Msg (через запятую имена онлайн пользователей)
select 'user.onlineusers' type
Возвращает Result, Msg, Count (количество созданных файлов в системе ресурсов).
Подробнее про массову загрузку файлов из zip архива
Удаляет записи и сами файлы в системе ресурсов.
Входные параметры
Возвращает Result, Msg.
Работа с папками и файлами доступна только в пределах папки /uploads (и ее подпапок).
Все методы (за исключением getFolder) возвращают стандартный ResultModel (Result, Msg).
Сохранение файла на диске file.savefile
select 'file.savefile' type, '/uploads/111/22.txt' path,
'Привет!'+char(10)+ '2222' content, 'windows-1251' encoding
Получить файл file.getfile
select 'file.getfile' type, '/uploads/111/22.txt' path, 'windows-1251' encoding
Переместить файл/папку file.move
select 'file.move' type, '/uploads/111/22.txt' path, '/uploads/33.txt' destinationPath
select 'file.move' type, '/uploads/111' path, '/uploads/land/22' destinationPath
Копировать файл/папку file.copy
select 'file.copy' type, '/uploads/111/22.txt' path, '/uploads/33.txt' destinationPath
select 'file.copy' type, '/uploads/111' path, '/uploads/land/22' destinationPath
Проверка существования файла file.exists
select 'file.exists' type, '/uploads/111/22.txt' path
Получить размер файла/папки file.getsize
select 'file.getsize' type, '/uploads/111/22.txt' path
select 'file.getsize' type, '/uploads/111' path
На выходе в Msg будет длина файла в байтах.
Удаление файла file.deleteFile
select 'file.deleteFile' type, '/uploads/111/22.txt' path
Получить содержимое папки file.getfolder
select 'file.getFolder' type, '/uploads' path
В результате в items будут записаны отдельно объекты с key=file (title- название файла, value2 - URL файла, value - расширение файла) и key=folder (title - название папки, value2 - URL папки, value - количество вложенных элементов).
Создание папки file.createFolder
select 'file.createFolder' type, '/uploads/111/22' path
Удаление папки file.deleteFolder
select 'file.deleteFolder' type, '/uploads/111/22' path
Скачать zip папки file.downloadFolder
select 'file.downloadFolder' type, '/uploads/111/22' path
Zip создается в папке /uploads/tmp (необходимо периодически чистить эту папку через fushFolder и периодические действия).
Очистить содержимое папки file.flushFolder
select 'file.flushFolder' type, '/uploads/111/22' path
Сохранение файла из строки в формате base64 savebase64
select 'savebase64' type, '/uploads/xx/1.jpg' path, 'XXXXXXXXXXXXXXXX' value
Получаем место о размере диска и свободном месте на диске.
select 'diskinfo' type, 'C:\\' disk
На выходе 3 поля в структуре:
Делаем выгрузку в Excel либо загружаем некий файл на обработку в БД. В основе работы данных внешних действий - компонент выгрузки в Excel.
Экспорт файла в Excel
select 'io.export' type, 'code1' code, '123' itemID, '0' isEmpty, 1 page, 500 pageSize
В выходной модели будет поле с key=url - содержать URL сформированного файла.
Импорт файла из Excel в БД
select 'io.import' type, 'code1' code, '123' itemID, '/uploads/file.xlsx' url
В выходной модели будут данные лога выгрузки, результат операции.
Обработка данных из Excel файла с произвольным форматом
select 'io.parseExcel' type, '/uploads/1.xlsx' path,
'' listName, 'parseExcel1' spCallback
В выходной модели в @parameters будут данные:
См. статью про обработку Excel произвольного формата
Если нам необходимо обработать результат выполнения внешнего действия, то мы должны передать параметр spCallback во внешнем действии, в котором мы указываем код хранимки для выполнения после внешнего действия.
select 'telegram' type, 'text1asd' text, '@hecrus' [to],
'{}' buttonsJSON,
'test' spCallback
Затем мы должны реализовать процедуру outer_{spCallback}.
ALTER PROCEDURE [dbo].[outer_test]
@parameters ExtendedDictionaryParameter readonly,
@data nvarchar(128) = '',
@username nvarchar(128) = ''
AS
BEGIN
-- SELECT 1 ReesultModel
select 1 Result, '123' Msg
exec as_print @str = '123321'
-- SELECT 2 Outer actions
select 'telegram' type, 'text12222' text, '@hecrus' [to],
'{}' buttonsJSON
END
На входе:
На выходе:
Примечание:
Обновление Янв2025. Простой способ обработать результат внешнего действия на странице без JS - использовать actions. См раздел Обработка результата внешнего действия через actions
В коллбеках компонентов вы можете обработать результаты, полученные из внешнего действия (например, для формы это getItem, saveItem коллбеки).
В параметре data передаются данные по выполнению соответствующей операции (например, сохранение формы), а также данные по внешним действиям.
Данные по внешнему действию приходят в поле additionalData - в нем находится серилизованный массив объектов ResultModel в виде JSON строки.
У каждого из результатов внешнего действия может быть дополнительный вызов другого внешнего действия (если указан был spCallback) - в этом случае у него также будет по аналогии заполнен additinalData данными по результатам соответствующего внешнего действия.
Основные поля каждого результата (OuterResultModel).
$(function(){
as.formcallbacks.createpdf_saveItem = function(data){
console.log("_saveItem",data)
var outerData = JSON.parse(data.additionalData);
if(!outerData || outerData.length==0) return;
console.log("outerData", outerData)
var ss1 = JSON.parse(outerData[0].additionalData);
console.log("ss1", ss1)
var ss2 = JSON.parse(ss1[0].additionalData);
console.log("ss2", ss2)
if(ss2) url = ss2[0].msg;
console.log("url", url)
if(url) location.href= url;
}
});
Вот так может выглядеть additionalData:
additionalData: "[
{"items":[
{"key":"result","value":null,"title":null,"value2":"True"},
{"key":"msg","value":null,"title":null,"value2":""},
{"key":"url","value":null,"title":null,"value2":"/uploads/doc/buydeal/договор на закупку_4e76.docx"},
{"key":"spCallbackResult","value":"True","title":"","value2":null}],
"result":true,"msg":"/uploads/doc/buydeal/договор на закупку_4e76.docx",
"additionalData":"
[
{\"items\":
[
{\"key\":\"result\",\"value\":null,\"title\":null,\"value2\":\"True\"},
{\"key\":\"msg\",\"value\":null,\"title\":null,\"value2\":null},
{\"key\":\"fileId\",\"value\":null,\"title\":null,\"value2\":\"111\"},
{\"key\":\"spCallbackResult\",\"value\":\"True\",\"title\":\"\",\"value2\":null}
],
\"result\":true,
\"msg\":null,
\"additionalData\":\"
[
{\\\"items\\\":
[{\\\"key\\\":\\\"result\\\",\\\"value\\\":null,\\\"title\\\":null,\\\"value2\\\":\\\"True\\\"},
{\\\"key\\\":\\\"msg\\\",\\\"value\\\":null,\\\"title\\\":null,\\\"value2\\\":\\\"/uploads/111.pdf\\\"},
{\\\"key\\\":\\\"exportPath\\\",\\\"value\\\":null,\\\"title\\\":null,\\\"value2\\\":\\\"/uploads/111.pdf\\\"}],
\\\"result\\\":true,
\\\"msg\\\":\\\"/uploads/111.pdf\\\",
\\\"additionalData\\\":null,
\\\"icon\\\":null}
]\",
\"icon\":null}
]",
"icon":null}]"