2sxc: заполнить выпадающие значения строки из кода / API
В приложении модуля 2sxc я хочу получить значения для "String Drop Down Values" из функции или внешнего веб-API, а не с введенным списком значений.
Это возможно по умолчанию или кто-то может дать мне несколько советов, с чего начать?
(РЕДАКТИРОВАТЬ / ДОБАВИТЬ) Является ли создание контента пользовательским типом ввода единственным способом, или есть какой-то более простой способ?
3 ответа
Так что в основном ваш код работает внутри Angular, который также имеет загруженный 2sxc4ng. Есть как минимум 3 способа решить вашу проблему.
- Вы можете использовать объект sxc, который совпадает с $2sxc(moduleId)
- Вы можете использовать IID
- вы можете просто использовать $http, так как он уже предварительно загружен с идентификатором модуля в заголовках
Использование $ http довольно понятно - и если вы проследите за связью, вы увидите, что moduleid уже включен в заголовки.
чтобы получить доступ к iid или объекту sxc, вы должны поместить их как зависимости в этой строке
.controller("FieldTemplate-String-Nn-Int-Json-List", function($scope, $filter, $modal, appId, debugState, eavAdminDialogs, $http)
так что тебе нужно
.controller("FieldTemplate-String-Nn-Int-Json-List", function($scope, $filter, $modal, appId, debugState, eavAdminDialogs, $http, iid, sxc)
Это должно сделать это.
Создание пользовательского типа ввода является единственным способом на данный момент. Так как многие люди ищут что-то подобное, было бы здорово, если бы вы тогда спонсировали / делали это:)
Я приложил пример приложения с небольшим описанием.
Все вещи уже описаны хорошо по этой ссылке: http://2sxc.org/en/blog/post/configurable-custom-input-type-dynamic-data-content
Я просто изменяю этот пример, чтобы использовать строковое и основное изменение кода в угловом контроллере, и мой код выглядит так:
var url;
var controlSettings = $scope.to.settings["string-nn-json-list"];
if (controlSettings) url = controlSettings.jsonUrl || null;
// if null set default apiUrl
if (url === null) url = "http://www.mocky.io/v2/57aae03e120000be10739d3b";
$http({
method: 'GET',
url: url,
headers: {
'TabId': undefined,
'Pragma' : undefined,
'RequestVerificationToken' : undefined,
'Cache-Control' : undefined,
'Debugging-Hint' : undefined,
'ContentBlockId' : undefined,
'ModuleId' : undefined,
}
}).then(function successCallback(response) {
$scope.json_list_data = response.data;
});
Для внешних данных json api я использую это: http://www.mocky.io/v2/57aae03e120000be10739d3b созданный на www.mocky.io, и это jsonUrl по умолчанию для "string-nn-json-list". Вы можете изменить этот URL в настройках поля.
EDIT (1)
Я пытаюсь получить moduleId с помощью IID в контроллер, но безуспешно..
(function() {
"use strict";
angular.module("nnStringFromIntJsonData", [])
.config(function(formlyConfigProvider, defaultFieldWrappers) {
})
.controller("FieldTemplate-String-Nn-Int-Json-List", function($scope, $filter, $modal, appId, debugState, eavAdminDialogs, $http) {
// What to change in this code
// that I can get iid (moduleId) in this part of code?
debugger;
})
.run(
function($templateCache) {
})
})();
Что я должен изменить (добавить) к этому коду, чтобы iid был доступен?
EDIT (2)
Один из способов, но с потерей безопасности (я использую только для чтения не важных данных), заключается в том, что вы удаляете атрибуты контроллера Api:
[DnnModuleAuthorize] и [ValidateAntiForgeryToken] и оставить только [HttpGet]
и при вызове из пользовательского контроллера типа ввода используйте что-то вроде:
var url = "/DesktopModules/2sxc/API/app-api/{ControllerName}/{MethodName}";
$http.get(url).then(function successCallback(response) {
$scope.json_list_data = response.data;
});
Я действительно не знаю, что я делаю... Кажется, что больше я учусь меньше, я знаю:-(и код с системой try / error, чтобы получить что-то частично полезное...