модуль
Технические вопросы
7.x

Добрый день, коллеги!
Помогите решить следующую задачу:

bpm'online 7.5
Мне нужно создать модуль, который будет являть собой страницу с таблицей. Таблицу необходимо заполнить данными, сгенерированными в том же модуле (например, статично заданные демо-данные; в дальнейшем будет выполняться запрос к веб-сервису для получения данных).
На странице, например, контрагента я создам вкладку, и в эту вкладку мне нужно загрузить этот модуль с таблицей.

Нравится

4 комментария

Здравствуйте, Евгений!
В целом Вам необходимо создать модуль, расширяющий BaseSchemaModuleV2, в который будет загружаться страница с содержимым. Затем загрузить этот модуль в контейнер. Пример модуля:
[javascript]
define("ModuleName", ["BaseSchemaModuleV2"], function() {

Ext.define("Terrasoft.configuration.ModuleName", {
alternateClassName: "Terrasoft.ModuleName",
extend: "Terrasoft.BaseSchemaModule",

/**
* Инициализирует название схемы.
* @protected
* @overridden
*/
initSchemaName: function() {
this.schemaName = "PageName";
},

/**
* Заменяет последний элемент в цепочке состояний, если его идентификатор модуля отличается от текущего.
* @protected
* @overridden
*/
initHistoryState: Ext.emptyFn

});
return Terrasoft.ModuleName;
});
[/javascript]

На странице "PageName" необходимо реализовать отображение таблицы.
Загружать модуль в контейнер можно следующим образом:
[javascript]

var schemaName = "PageName";
var pageId = this.sandbox.id + schemaName;
this.showBodyMask();
this.sandbox.loadModule("ModuleName", {
renderTo: "ModuleNameContainer", //Id контейнера
id: pageId,
keepAlive: true
});
[/javascript]

Андрей, спасибо за ответ. К сожалению, с указанным способом возникли затруднения, и я реализовал модуль по-другому:

q

1

[javascript]
define("VisualModule", ["VisualModuleResources", "ViewUtilities", "ServiceHelper", "BaseModule", "ContainerList", "css!VisualModule"],
function(resources, ViewUtilities, ServiceHelper) {
Ext.define("Terrasoft.configuration.VisualModule", {
alternateClassName: "Terrasoft.VisualModule",
extend: "Terrasoft.BaseModule",

Ext: null,
sandbox: null,
Terrasoft: null,

getContainer: function() {
var itemsContainer = ViewUtilities.getContainerConfig("itemsContainer",
["items-container-class"]);
itemsContainer.items.push({
className: "Terrasoft.Button",
style: Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
classes: {textClass: ["cancel-all-class"]},
caption: "AddToCollection",
click: {bindTo: "onButtonClick"}
});
itemsContainer.items.push({
className: "Terrasoft.ContainerList",
id: "CON1",
idProperty: "Id",
selectors: {wrapEl: "#CON1"},
collection: {bindTo: "itemsCollection"},
defaultItemConfig: this.getItemConfig()
});
return itemsContainer;
},
getItemConfig: function() {
var itemConfig;
itemConfig = ViewUtilities.getContainerConfig("ItemContainer",
["item-container"]);
var itemTopContainer = ViewUtilities.getContainerConfig("itemTopContainer",
["item-top-container"]);

itemTopContainer.items.push({
className: "Terrasoft.Label",
caption: {bindTo: "displayValue"},
classes: {labelClass: ["button-caption-labelClass"]}
});
itemConfig.items.push(itemTopContainer);

return itemConfig;
},
getView: function() {
var viewItems = [];
var textEdit = {
className: "Terrasoft.TextEdit",
width: 100,
value: {"bindTo": "textValue"}
};
var bindedContainer = this.getContainer();

viewItems.push(textEdit);
viewItems.push(bindedContainer);

return this.Ext.create("Terrasoft.Container", {
id: "mainContainer",
selectors: {wrapEl: "#mainContainer"},
classes: {wrapClassName: ["main-container-style"]},
items: viewItems
});
},

getViewModel: function() {
var scope = this;
var sandbox = scope.sandbox;
var Terrasoft = scope.Terrasoft;
var viewModel = Ext.create("Terrasoft.BaseViewModel", {
values: {
textValue: "Some text",
itemsCollection: new Terrasoft.Collection()
},
methods: {
onButtonClick: function(){
var collection = this.get("itemsCollection");
var item = { value: "Id1", displayValue: "Name1"};
this.decorateItem(item)
collection.add(this.newGuid(), item);

},
decorateItem: function(item) {
item.sandbox = sandbox;
item.Terrasoft = Terrasoft;
},
newGuid: function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16); })
}
}
});
viewModel.Ext = this.Ext;
viewModel.Terrasoft = this.Terrasoft;
viewModel.sandbox = this.sandbox;
return viewModel;
},

render: function(renderTo) {
var view = this.getView();
var viewModel = this.getViewModel();
view.bind(viewModel);
view.render(renderTo);
}
});
return Terrasoft.VisualModule
});

[/javascript]

Загружаю модуль так:
[javascript]
var schemaName = "PageName";
var pageId = this.sandbox.id + schemaName;
this.sandbox.loadModule("VisualModule", {
renderTo: "SmrMediaplanPage6Tab", //Id контейнера
id: pageId,
keepAlive: true
});
[/javascript]

На страницу успешно загружается модуль, и даже текстовое поле получает привязку:
2

В коде добавлен контейнер типа Terrasoft.ContainerList, и сделана привязка к коллекции itemsCollection из ViewModel (itemsCollection: new Terrasoft.Collection())

При попытке добавить элемент в эту коллекцию:
[javascript]
var collection = this.get("itemsCollection");
var item = { value: "Id1", displayValue: "Name1"};
this.decorateItem(item)
collection.add(this.newGuid(), item);
[/javascript]

происходит ошибка в ContainerList.js:
не видит метода get()

1
23

Примеры кода я копировал из стандартных модулей, и там такой проблемы само собой не возникает. Скорее всего, я ещё что-то не учёл, но пока не понимаю что.

Как правильно забиндить ContainerList?

День добрый!
Так а откуда в Вашем item должен появиться метод get?
По идее, item должен быть экземпляром класса Terrasoft.BaseViewModel, а у Вас - это просто объект, в который добавлены несколько свойств.
Попробуйте так:
[javascript]
var item = this.Ext.create("Terrasoft.BaseViewModel", {
values: {
Id: "Id1",
Name: "Name1"
}
});
[/javascript]
И еще проверьте, есть ли значение в this.idProperty. Там должна быть строка с названием колонки-идентификатора.
Вместо вот этого страха:
[javascript]
newGuid: function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,
function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16); })
}
[/javascript]
Можно использовать метод Terrasoft.generateGUID().

Андрей, спасибо, это то, что нужно! :)
Сделал item как Terrasoft.BaseViewModel, и всё получилось.

Показать все комментарии

А знаете ли вы, уважаемые любители быстро перенести готовый стандартный модуль из одной системы в другую в замечательный модуль Custom, что теперь такая возможность у вас пропала?
Не будем говорить о переносе Проектов, Документов и прочая в Sales, так как это нехорошо:cool:, и необходимость в таком разделе должна толкать покупателя к приобретению более дорогого продукта, а не стимулировать программистов к работе.

А приведем пример законопослушный вполне - берем у клиента старенький Terrasoft 3.2.1 x25, в котором был модуль "Склад" - простенький совсем по нынешним меркам, но все же был и использовался. И попробуем перевести такого клиента на 3.4 XRM, в котором склада понятное дело нету. Ну нету и нету, наше дело сервисы выгрузить да в Custom залить, вот он и появится - но не тут то было. Уже при попытке сохранения сервиса таблицы tbl_OfferingMovement всякого хитреца ждет сообщение, что "Service 'tbl_OfferingMovement' must be located only in the module 'OfferingMovement'".
В итоге запрос не запустится, и так далее... Путь решения в общем-то простой, но требует усидчивости и внимательности - переименовываем таблицу в tbl_BestOfferingMovement:smile: и затем все упоминания, связи... в итоге получаем загруженный работающий модуль.
Или об этой особенности не знал только я? :wink:

Нравится

Поделиться

1 комментарий

Кстати в нелегком труде переименования поможет прекрасная бесплатная утилита от http://tr.infortech.ru/ под названием @Text Replacer.
Выгружаем все сервисы несчастного модуля в XML в некоторую папку, и запускаем @Text Replacer, говорим ему название этой папки и запускаем автоматическую замену по содержимому XML, например "Movement" на "BestMovement".
В этом случае поменяется и USI, и названия таблицы, и запросы подправятся, и так далее... останется только загрузить все сервисы обратно и скрипты поправить - уже в Администраторе, поиском/заменой "Movement" на "BestMovement" штатными средствами. Так будут исправлены названия обработчиков событий, переменные, названия сервисов, упомянутых в скриптах.

Показать все комментарии
документ
модуль
сканирование

Во многих компаниях, ведущих интенсивную работу с документами, существует потребность в сканировании документов прямо из системы Terrasoft. Для решения такой бизнес задачи в компании Лабитек была разработана специальная библиотека, которая может быть быстро добавлена в любой раздел системы.

Данная библиотека использует для полученного документа стандартную закладку "файлы". При этом для добавления сканирования Вам будет необходимо добавить всего одну строку кода!

Например:
function btnScanOnClick(Control) {
Scan('iq_FileInDocument', 'DocumentID', dlData.Dataset.Values('ID'));
}

Библиотека может быть предоставлена по запросу.

Нравится

Поделиться

6 комментариев

Как можно получить эту библиотеку?

Приложил библиотеку к сообщению в блоге. Также информация по сканированию (альтернативный вариант) доступна по ссылке: http://community.terrasoft.ua/node/2324

Горелов Виталий
Компания Лабитек

Виталий,
а библиотека от Лабитек потдерживает какие-то определённые сканеры?
Просто хотелось бы определится с выбором (Лабитек или WIA).
В компании три сканера, два новеньких самсунга и один древненький МФУ XEROХ...
--------------------
UPDATE:
В первом посте вложена версия для X15
Покопавшись немного выкладываю адаптированный сервис под 3.3.х

Позволю себе ответить за Виталия - библиотека использует TWAIN, а со сканерами обычно ставится драйвер поддержки, скорее всего и для древненького есть :) В общем пробуйте.
--------------------------------------------
Лабитек
Центр разработки приложений

2Валерий, спасибо большое)
Уже разобрался когда копался с переделкой...
---
Конфигурация:
TSCRM 3.3.1.59
Firebird 2.0 (v.2.0.3.12981)
ClientOS: Vista Home Premium
ServerOS: Windows 2003 Server

А, извиняюсь, не сообразил :)
--------------------------------------------
Лабитек
Центр разработки приложений

Показать все комментарии