Разработка
кастомизация
переопределение метода
замещение
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: [
			"",
			"
  • ", "class=\"ts-sidebar-selected-item\"", "", ">", "", "", "", "{$}=\"{.}\">", " {caption} ", " {availableEntities} ", "", "", "", "
  • ", "" ], }); 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, который загружается при старте. Более подробно о таком подходе см. пример в этой теме.

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