Разработка
кастомизация
переопределение метода
замещение
Sales_Creatio
7.16

Всем доброго времени суток.

Есть класс SideBar и я создал модуль NrbSideBarWithCountersModule который наследуется от него. 

define("NrbSideBarWithCountersModule", ["terrasoft", "ext-base"], function() {
	Ext.define("Terrasoft.controls.NrbSideBarWithCountersModule", {
		extend: "Terrasoft.SideBar",
		alternateClassName: "Terrasoft.NrbSideBarWithCountersModule",
		Ext: null,
		sandbox: null,
		Terrasoft: null,
		itemTplMap: [
			"caption",
			"imageUrl",
			"href",
			"domAttributes",
			"availableEntities"
		],
 
		itemTpl: [
			"<tpl if=\"visible != false\">",
			"<li data-item-index=\"{itemIndex}\"",
			"<tpl if=\"isSelected == true\">",
			"class=\"ts-sidebar-selected-item\"",
			"</tpl>",
			">",
			"<span class=\"vertical-strip\"></span>",
			"<tpl if=\"href\"><a target=\"_self\" class=\"sidebar-item-link\" href=\"{href}\"></tpl>",
			"<div id=\"sidebar-item-wrapper-{itemIndex}\" class=\"ts-sidebar-item-wrapper\">",
			"<div id=\"sidebar-item-image-{itemIndex}\" class=\"ts-sidebar-item-image\" data-item-marker=\"{caption}\" " +
			"style=\"background-image:url({imageUrl})\" <tpl foreach=\"domAttributes\">{$}=\"{.}\"</tpl>></div>",
			"<div id=\"sidebar-item-text-{itemIndex}\" class=\"ts-sidebar-item-text\"> {caption} ",
			"<div id=\"sidebar-item-counter-{itemIndex}\" class=\"ts-sidebar-item-counter\"> {availableEntities} ",
			"</div>",
			"</div>",
			"<tpl if=\"href\"></a></tpl>",
			"</li>",
			"</tpl>"
		],
 
	});
	return Terrasoft.NrbSideBarWithCountersModule;
});

В нём я добавил поле которое должно будет передаваться из модуля SectionMenuModule, также я создал новый модуль NrbSectionMenuModule в котором переопределил нужные методы.

define("NrbSectionMenuModule", ["ServiceHelper", "NrbSectionMenuModuleResources", "ModuleUtils", "MaskHelper",
		"LeftPanelUtilitiesV2", "CheckModuleDestroyMixin"],
	function (resources, ModuleUtils, ServiceHelper, MaskHelper, LeftPanelUtilities) {
		Ext.define("Terrasoft.configuration.NrbSectionMenuModule", {
			alternateClassName: "Terrasoft.NrbSectionMenuModule",
			override: "Terrasoft.SectionMenuModule",
			render: function (renderTo) {
				if (!Ext.isEmpty(viewModel) && !Ext.isEmpty(sideBar)) {
					sideBar.destroy();
				}
				sideBar = Ext.create("Terrasoft.NrbSideBarWithCountersModule", Terrasoft.deepClone(sideBarConfig));
				sideBar.bind(viewModel);
				sideBar.render(renderTo);
				MaskHelper.HideBodyMask();
			},
			getSideBarItems: function () {
				var config = [];
				var moduleStructure = Terrasoft.configuration.ModuleStructure;
				var modules = info && info.modules ? info.modules : Object.keys(moduleStructure);
				if (!modules) {
					return;
				}
				var availableSections = info.AvailableSections;
				var defaultIconUrl = Terrasoft.ImageUrlBuilder.getUrl(resources.localizableImages.DefaultIconSvg);
				modules.forEach(function (module) {
					if (module.moduleId !== Terrasoft.GUID_EMPTY) {
						var moduleName = module.moduleName ? module.moduleName : module;
						var moduleConfig = moduleStructure[moduleName];
						if (moduleConfig.hide !== "true") {
							if (!Ext.isArray(availableSections) || availableSections.indexOf(moduleName) >= 0) {
								var caption = moduleStructure[moduleName].moduleCaption;
								var tag = ModuleUtils.getModuleTag(moduleName);
								var imageId = moduleStructure[moduleName].imageId;
								var imageUrl = imageId ? getImageUrl(imageId) : defaultIconUrl;
								var itemUrl = Terrasoft.workspaceBaseUrl + "/Nui/ViewModule.aspx#" + tag;
								var count = this.getCountOfAvailableProjects();
								var itemConfig = {
									caption: caption,
									tag: tag,
									imageUrl: imageUrl,
									href: itemUrl,
									domAttributes: { "module-name": module.moduleName },
									availableEntities: count
								};
								if (!Terrasoft.Features.getIsEnabled("SectionMenuLink")) {
									itemConfig.href = null;
								}
								config.push(itemConfig);
							}
						}
					}
				});
				return config;
			},
 
			getCountOfAvailableProjects: function () {
				var requestConfig = {
					serviceName: "NrbProjectCounterService",
					methodName: "GetNumberOfAvailableProjects",
					callback: this.showResult
				};
				this.callService(requestConfig, this);
			},
 
			showResult: function (result) {
				console.log(result);
			},
		});
 
		return Terrasoft.NrbSectionMenuModule;
	});

Переопределение не даёт нужного результата и возник такой вопрос. Правильно ли тут использовать переопределение или лучше использовать наследование? 

И как я понял мне надо будет переопределить все модули которые взаимодействовали с SectionMenuModule и поменять на NrbSectionMenuModule?

Нравится

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

Модули не замещаются как карточки. То что создали свой модуль NrbSideBarWithCountersModule это ваш модуль. А левую панель так и продолжает выводить SectionMenuModule.

Динар, для того, чтобы Ваш класс заменил стандартный, нужно в нём указать override и название того, что он замещает. А затем упомянуть название Вашего модуля в замещённом BootstrapModulesV2, который загружается при старте. Более подробно о таком подходе см. пример в этой теме.

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

Доброго дня!

 

Мне нужна помощь, можете пошагово и подробно объяснить, как правильно переопределить метод? Я уже несколько часов пытаюсь это сделать и ничего не выходит. Заранее благодарен. 

Нравится

2 комментария
Лучший ответ

Добрый день!

Вам нужно добавить замещающий объект в своем пакете. В качестве родительского указываете "Лид". После этого переходите в дизайнер процессов и делаете замещение метода. Выглядеть это будет примерно вот так:

 

public override void UpdateLeadName()
{
	//тут могла быть Ваша реклама
	base.UpdateLeadName();
}

 

Добрый день!

Вам нужно добавить замещающий объект в своем пакете. В качестве родительского указываете "Лид". После этого переходите в дизайнер процессов и делаете замещение метода. Выглядеть это будет примерно вот так:

 

public override void UpdateLeadName()
{
	//тут могла быть Ваша реклама
	base.UpdateLeadName();
}

 

Для примера, в пакете  CoreLead так переопределяют соседнюю функцию LeadInserted из базового пакета Lead.

Тут базовая пустая:

public virtual void LeadInserted() {
}

Тут переопределили:

public override void LeadInserted() {
	base.LeadInserted();
	if (CanStartQualificationProcess()) {
		StartQualificationProcess();
	}
}

Вы, в свою очередь, аналогично переопределите нужную в пакете Custom, не забыв в начале или конце вызвать базовую (если того требует смысл).

Показать все комментарии
StringComparison
переопределение метода
7.13_()
service_enterprise

Добрый день, коллеги. 

Нужна ваша помощь. 

При внесении изменения в БП - "Отправка email сообщения контакту обращения", появляется ошибка. 

Правильно ли я понимаю, что нужно заместить какой-то класс? Какой, если так? 

Изображение удалено.

Нравится

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

Проводите вычисления через элемент "Задание-сценарий" 

Могли бы подсказать зачем, если процесс "из коробки" использует другой элемент? 

В новом (нынешнем) дизайнере процессов серьёзно урезали возможности формул. Если в 5.Х и ранних 7.Х там можно было написать кусочек C#-кода с вызовом функций, то сейчас — только функции из перечня в дизайнере формул.

Альтернативным решением может быть либо C#-скрипт, как посоветовал выше Айдар, либо же создание своего пользовательского действия, тоже написанного на C#, с последующим его запуском из элемента «Выполнить действие процесса» с нужными параметрами.

Если такое условие нужно один раз  — проще скрипт, действие же удобнее при многократном использовании.

Зверев Александр,

Т.е.: 

1) При обновлении версии приложения, БП, использующие подобные формулы, перестанут работать? 

2) Т.е. при отсутствии знаний С# аналитик решить вопрос не сможет?

1) Новый дизайнер процессов появился довольно давно. Если обновляете систему тех времён со своими доработками, нужно всё тестировать. Кстати, вспомнил, в старых версиях вообще не было элемента-формулы, произвольный код писался в условии потока.

2) Без знания C# он бы не решил и в старой версии, на Вашем скриншоте используются функции и элементы синтаксиса языка.

Также см. аналогичное обсуждение раньше.

Показать все комментарии
печатная форма
печать
переопределение метода
7.14_()
sales

Как переопределить метод Печати в разделах? 

 

Нравится

6 комментариев
Лучший ответ

Добрый день!

Нужно переопределить метод

generatePrintForm: function(printForm)

в вашем разделе. Само описание метода лежит в PrintReportUtilities

Добрый день!

Нужно переопределить метод

generatePrintForm: function(printForm)

в вашем разделе. Само описание метода лежит в PrintReportUtilities

Сидоров Александр В., 

Можно пример переопределения метода печти?

 

См. тут. Но для 7.13 и выше такое не подойдёт, поскольку переопределение модулей запретили.

Зверев Александр,

У меня развернуто именно 7.13 . Получается запрещено? Нельзя хотя бы видимость убрать в зависимости от значения какого ниб поля ? Было бы неплохо если бы разработчики дали возможность такие вещи сделать с помощью бизнес правил 

Можете завести идею прав на такую операцию. Стандартно такой не вижу.

Показать все комментарии
переопределение метода
события фильтры
фильтры
Технические вопросы
7.x

Здравствуйте.

Используется BPMonline sales comerce версии 7.6.
В разделе продажи есть стандартные фильтры, при изменении которых фильтруются вывод продаж в гриде, что и сразу отображается. Так же есть в этом разделе кнопка аналитика, где строятся графики и можно писать свои виджеты. Я написал виджет который рисует таблицу с нужными полями. Хочется также применять стандартные фильтры для отображения данных в моей таблице. Собственно вопрос, как получить значения этих фильтров и как правильно обрабатывать событие изменения фильтров для перерисовки моей таблици???

Пример клиентсткого модуля для виджета, который рисует таблицу:

define('SxClientUnitTable', ['ext-base', 'terrasoft', 'sandbox', 'SxClientUnitTableResources', "ChartModuleHelper", "css!SxClientUnitTableCss", "ServiceHelper"],
        function(Ext, Terrasoft, sandbox, resources, ChartModuleHelper, css, ServiceHelper, ConfigurationConstants) {
                function getViewModel() {
                                        return Ext.create('Terrasoft.BaseViewModel', {
                                //todo SysModuleAnalyticsChart deleted
                                                entitySchema: 'Order',
                                                methods: {
                                                        getChart: function(key) {
                                                                sandbox.publish('GenerateChart', key);
                                                        },
                                                        load: function() {

                                                        }
                                                }
                                        });
                                };
                var result = "";
                function generateMainView(renderTo) {
                       
                        var resultConfig = Ext.create('Terrasoft.Container', {
                                id: 'tableOtchetMetkiParamContainer',
                                selectors: {
                                        wrapEl: '#tableOtchetMetkiParamContainer'
                                },
                                renderTo: renderTo
                        });
                        return resultConfig;
                }
                function getInfoMetki(parameters) {

                        var serviceData = {
                                site: parameters[0].toString(),
                                ownerId: parameters[1].toString(),
                                startDate: parameters[2].toString(),
                                dueDate: parameters[3].toString(),
                                countryId: parameters[4].toString()
                        };
                       
                        ServiceHelper.callService("UsrOtchetMetkiGetCollectionConfigurationService", "GetCollectionOtchetMetki",
                                function (response) {
                                debugger
                                        if (response.status == 404) {
                                                this.showInformationDialog("\t Error: \n" + response.message);
                                        }
                                        else if(response.GetCollectionOtchetMetkiResult.length > 0){
                                                result = response.GetCollectionOtchetMetkiResult;
                                                var arrR = result.split(":");
                                                var htmlAdded = ""
МеткаКоличество заказовНа уточнении% уточн.Подтвержденные% Подтв.Завершенные% Заверш.Отмены% Отм.
;
                                                for(var i = 0; i arrR.length - 1; i++){
                                                        //get items
                                                        var strArr = arrR[i].split(" ");
                                                        var metkaOne = strArr[0].replace("{","");
                                                        var metka = metkaOne.replace("}","");
                                                       
                                                        htmlAdded += "" + metka + "" + strArr[1].toString() + ""  + strArr[2].toString() + "" + strArr[3].toString() + "" + strArr[4].toString() + "" + strArr[5].toString() + "" + strArr[6].toString() + "" + strArr[7].toString() + ""  + strArr[8].toString() + "" + strArr[9].toString() + "";
                                                }
                                                //end table
                                                htmlAdded += "";
                                                var el = Ext.get('tableOtchetMetkiParamContainer').setHTML(htmlAdded);
                                                var elemV = Ext.get('Module1');
                                                elemV.toggleCls('my-table');
                                        }
                                        else
                                                result = null;
                                }, serviceData, this);
                }

                var render = function(renderTo) {
                        var viewConfig = generateMainView(renderTo);
                        var viewModel = getViewModel();
                        var filters = getFilteres();
                        var ar = [];
                        ar.push("all");
                        ar.push("all");
                        ar.push("2016-05-01");
                        ar.push("2016-07-04");
                        ar.push("a570b005-e8bb-df11-b00f-001d60e938c6");
                        getInfoMetki(ar);
                       
                       
                        viewConfig.bind(viewModel);
                };
                return {
                        schema: 'Order',
                        methods: {
                               
                                getOrdersForFilter: function(){
                                        var items = [];
                                        var selOrders = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "Order"
                                        });
                                        selOrders.addColumn("SxMark.Name");
                                        selOrders.addColumn("SxCountry.Name");
                                        var filterByUser = Terrasoft.createColumnFilterWithParameter(
                                        Terrasoft.ComparisonType.EQUAL, "SxCountry.Name", "Россия");
                                        selOrders.filters.addItem(filterByUser);
                                        selOrders.getEntityCollection(function (response) {
                                        debugger
                                                if (response.collection.collection.length > 0)
                                                        items = result.collection.getItems();
                                                else
                                                        items = null;
                                        }, this);
                                        return items;
                                },
                                filterChanged: function( filter, eOpts ){
                                        debugger
                                        var c = [];
                                }
                        },
                        userCode: function() {
                               
                        },
                        init: function() {
                                debugger

                        },
                        render: render
                };
        }
)
;

Нравится

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

Скорее всего вам поможет SDK
https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/rabota-s-filtr…
Есть несколько примеров

К сожалению, ширина сайта не позволяет увидеть страницу целиком :(, поэтому скопируйте все содержимое, например в MSWord

Я решил данную задачу при помощи sandbox. Стандартные (Fixed и Custom) фильтры прикреплены к OrderSectionV2 и работать с ними (afterFiltersUpdated - переопределить метод изменение фильтров) только в этой схеме.

Показать все комментарии
bpm
SDK
вычисляемое поле
значение по умолчанию
переопределение метода
примеры
разработка

В SDK bpm'online в подраздел "Примеры решения типовых задач" добавлены решения кейсов, связанных с разработкой пользовательского интерфейса и бизнес-логики приложения.
Заходите на сайт Terrasoft Academy в раздел "Документация SDK" и узнайте как:

Статьи расположены в разделе "Разработка конфигураций на платформе" в подразделе "Примеры решения типовых задач"

Нравится

Поделиться

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