Добрый день, подскажите пожалуйста, как заместить модуль DuplicatesSearchUtilitiesV2 на пользовательский. Прочитал что модули замещать нельзя. Создал новый модуль DevDuplicatesSearchUtilitiesV2, изменив прежний. Но никак не могу понять, как теперь заместить схему AccountPageV2, так чтобы в ней использовался новый модуль вместо прежнего, не смог нигде найти ответа на этот вопрос. Подскажите пожалуйста как можно реализовать такое замещение.

Нравится

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

Добрый день.
После того как вы создали свой модуль по аналогии с DuplicatesSearchUtilitiesV2, вам необходимо указать его в зависимости в замещенной схеме AccountPageV2.

Инициализировать его как миксин и использовать в методах как любой другой миксин.

 

Пример:

https://i2.paste.pics/8754cbb41c209e369590912c418fbfbb.png

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

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

Есть класс 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, который загружается при старте. Более подробно о таком подходе см. пример в этой теме.

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

Здравствуйте, уважаемые коллеги. Возник вопрос по мобильному приложению bpm'online.
Появилась необходимость заметить метод initialize из модуля "Terrasoft.view.BaseGridPage.View".

Сталкивался ли кто-то с подобной задачей? Помогите, пожалуйста. Пробовал создавать модуль, в котором писал extend: "Terrasoft.view.BaseGridPage.View", и подключал его в манифест. Сама схема подгружается, но метод вызывается только из родительской схемы.

Нравится

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

Федоровский Роман Дмитриевич,

Тогда для этой цели используйте override:

Ext.define("Terrasoft.BaseGridPageViewOverride", {
	override: "Terrasoft.BaseGridPageView",
 
	/**
	 * @protected
	 * @overridden
	 */
	initialize: function() {
		/* Your code */
		this.callParent(arguments);
	}
 
});

Только, пожалуйста, обращайте внимание на указанные области видимости методов (ни в коем случае не перекрывайте приватные методы).

Добрый день! Можете описать свою бизнес-задачу? Для какой цели вы хотите заменить initialize() в Terrasoft.view.BaseGridPage.View? Объясню свой вопрос: для ряда задач нет необходимости в расширении базовых классов или их замещению. Например, для изменения стилей страниц можно воспользоваться утилитным методом Terrasoft.util.writeStyles().

S.Kalishenko,

Мне нужно добавить элемент вроде QR-кода на экран, который будет на постоянной основе находиться на экране в момент открытия любого раздела в целях безопасности, для этого я в div главного окна из JS я добавляю автогенерируемый qr-код. Как применять стили страниц я понимаю.

Федоровский Роман Дмитриевич,

Тогда для этой цели используйте override:

Ext.define("Terrasoft.BaseGridPageViewOverride", {
	override: "Terrasoft.BaseGridPageView",
 
	/**
	 * @protected
	 * @overridden
	 */
	initialize: function() {
		/* Your code */
		this.callParent(arguments);
	}
 
});

Только, пожалуйста, обращайте внимание на указанные области видимости методов (ни в коем случае не перекрывайте приватные методы).

А как сгенерировать сам QR-код, пример есть здесь.

Большое спасибо! Это решило все мои проблемы. Прошу прощения за столь длительный ответ

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

Здравствуйте. Была необходимость в добавлении дополнительного поля поиска в LookupPage. 

На данный момент решил задачу путем замещения модуля LookupPageViewGenerator и изменения в нем метода getFilteringControlsConfig

Проблема в том, что для выполнения этих действий пришлось копировать весь код из модуля LookupPageViewGenerator и добавлять свои небольшие изменения. 

Вопрос: можно ли как-то заместить или расширить этот модуль не копируя весь код, чтобы просто изменить тот метод, который мне нужен? Если да, то как потом его использовать на странице, например "Обращения"?

Нравится

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

Посмотрите здесь уже обсуждалась подобная тема.

Если Вам нужно использовать окно подобного вида не везде, то Вы можете реализовать свое кастомное окно и вызывать его в методе openLookup.

Кастомное окно можно реализовать не как замещенное, а как наследник от LookupPageViewGenerator и переопределить нужные методы.

Также мне не совсем понятно, если Вы действительно замещали LookupPageViewGenerator, то зачем тогда копировали весь код, ведь могли переопределить только нужные методы?

 

Посмотрите здесь уже обсуждалась подобная тема.

Если Вам нужно использовать окно подобного вида не везде, то Вы можете реализовать свое кастомное окно и вызывать его в методе openLookup.

Кастомное окно можно реализовать не как замещенное, а как наследник от LookupPageViewGenerator и переопределить нужные методы.

Также мне не совсем понятно, если Вы действительно замещали LookupPageViewGenerator, то зачем тогда копировали весь код, ведь могли переопределить только нужные методы?

 

Лучше клиентские модули не замещать

В 7.13.1 добавлен запрет на создание и установку новых замещающих клиентских модулей.

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

В вашем случае лучше унаследовать свой модуль от LookupPageViewGenerator создать свою страницу справочника скопировав LookupPage со всеми зависимястями заменив LookupPageViewGenerator на свой вариант

И дальше на странице Обращения в атрибутах указать lookupListConfig параметр lookupPageName:

"EmployeesNumber": {
                        dataValueType: Terrasoft.DataValueType.LOOKUP,
                        lookupListConfig: {
                            orders: [{columnPath: "Position"}],                            lookupPageName: ВашаСтраницаLookupPage 
                        }
                    },

 

Таким образом ваш вариант будет вызыватся лишь там где вы в атрибутах явно зададите lookupPageName что вы и хотели!

 

 

 

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

Привет всем, такой вопрос
Как можно заместить родительское сообщение в дизайнере процессов ?

Мне нужно заместить сообщение InvoiceSaved так что бы запускалось только моё сообщение без родительского.

(Это мне нужно для того что бы отключить автонумерацию после сохранения счета)

Нравится

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

Примерно так:

Заместить объект  добавить обработку сообщения InvoiceSaved  Добавить необходимую обработку (скопировать из родительского) и не вызывать родительскую обработку (те оборвать провал к родителю)

Чтобы отключить автонумерацию можно просто удалить системные настройки или что еще проще просто спрятать поле номер. Или вам нужно чтобы нумерация осталась но номер присваивался не автоматом?

Григорий Чех,

Мне нужно в определённых условиях обнулять номер и так что бы он не обновлялся и счетчик не шёл дальше.
Я сделал дочерний процесс который работает в место этого, проблема была в том что после моего процесса начал выполнятся этот (родительский), мне нужно было его как то убрать, мне тут подсказали какой командой это можно сделать:

context.Process.ActivatedEventElements.Remove("InvoiceSaved");

 

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

Есть стандартный бизнес-процесс поиска клиента системой. Поиск осуществляется только среди Контактов и Контрагентов. Как реализовать такой же поиск у Лидов? Есть ли возможность замещения стандартного бизнес-процесса?

Нравится

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

Здравствуйте! Процессы не замещаются, но в версии 770 их можно отключить. Уточните, пожалуйста, название процесса, который Вы хотите заместить?

SysCustomerIdentificationProcess

Добрый день!
Пожалуйста, опишите подробнее бизнес-задачу, которую Вам необходимо решить добавлением поиска и через лиды. Зачем это необходимо и как должно выглядеть для пользователя.
Спасибо!

есть деталь средства связи. стандартный функционал позволяет использовать ее для звонков на телефоны Контактов и Контрагентов. мне нужно реализовать такую же деталь, но для Лидов. при звонке запускается стандартный БП SysCustomerIdentificationProcess. в нем поиск абонента происходит только среди Контактов и Контрагентов. задача добавить в этот БП поиск и среди Лидов.

От техподдержки как-то была получена следующая инструкция по замене БП:
вариант деактивации БП - выполнение запроса к БД следующего вида:

update SysSchemaProperty set Value = 'False' --для активации заменить False на True
where SysSchemaId = (select id from sysschema where name ='YourProcessName') -- тут название схемы БП
and Name = 'Enabled'

инструкция по копированию и изменению БП
1. В разделе "Конфигурация" экспортируем процесс, который нужно скопировать.
2. С помощью текстового редактора (лучше использовать более "продвинутый", чем стандартный Блокнот в Windows, например, Notepad++) открываем полученный файл.
3. Нам необходимо поменять 3 параметра: UId - по всему файлу, Name - в 2х местах и Caption - в одном месте.
3.1. Меняем UId. Чтобя сгенерировать новый UId можно перейти на сайт http://www.guidgenerator.com/ или аналогичный и сгенерировать идентификатор. Затем меняем по всему файлу существующее значение на новое. Должно быть куча замен.
3.2. Меняем Name. Параметр Name должен представлять собой строку, содержащую только символы латинского алфавита без пробелов, например, CreditCardRegistrationTest. Заменить нужно в 2х местах в строках:
"Name": "CreditCardRegistrationByUserCustom",
и
\n \"A2\"": \""CreditCardRegistrationByUserCustom\""

Это позволило заменить родительский БП на свой с минимальными трудозатратами. Главное, если это в пакет включать, добавлять скрипт на деактивацию БП.
Замечу, что инструкция относится к 7.2, может в более новых версиях как-то поменялось.

Валентин,

Чтобы решить задачу

"Медведев Валентин Николаевич" написал:задача добавить в этот БП поиск и среди Лидов.
Вам необходимо:

1. В БП создать метод, который будет выполнять поиск лидов по средству связи и записывать результат в [CTISearchResult]
В качестве примера реализации используйте SearchAccounts/SearchContacts.

2. В тело БП добавить элемент "Задание-сценарий", в котором вызвать созданный на предыдущем шаге метод поиска лидов. Пример кода следует посмотреть в SearchAccountsStartsWithNumberScriptTask.

Обратите, пожалуйста, внимание, что "Задание-сценарий" нужно добавить в три ветки:

Наталия, так и сделал. Но так как БП системный, создал новую системную настройку, в которой вызываю модифицированный SysCustomerIdentificationProcess. так же заместил CtiCustomerInfoUtilities и подправил код там.

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