Вопрос

Здравствуйте, коллеги!

Столкнулся с проблемой описанной здесь:

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

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

Также добавлял кнопку на страницу секции (ProductSectionV2) со свойством visible: false (так как на странице раздела она не должна быть видна), но при переходе на страницу товара (ProductPageV2) кнопка остается невидимой, хотя свойство visible: true.

Может кто-нибудь объяснит, в чем проблема. Заранее благодарен.

У меня такой же вопрос

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

Ну собственно, вам необходимо воспользоваться вот этими 2-мя статьями:

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-na-stranicu-redaktirovaniya-v-sovmeshchennom-rezhime

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-v-rezhime-dobavleniya-novoy-zapisi

Тогда она и не будет исчезать при обновлении страницы.

Ну собственно, вам необходимо воспользоваться вот этими 2-мя статьями:

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-na-stranicu-redaktirovaniya-v-sovmeshchennom-rezhime

https://academy.terrasoft.ru/documents/technic-sdk/7-14/kak-dobavit-knopku-v-rezhime-dobavleniya-novoy-zapisi

Тогда она и не будет исчезать при обновлении страницы.

ProductSectionV2 не означает что это раздел, он так же используется и при просмотре карточки, так что там тоже нужно кнопку делать

Здравствуйте, спасибо за ответ. А метод onClick этой кнопки тоже в обоих местах прописывать? Если да - в ProductSectionV2 не доступны необходимые мне поля/действия карточки (даже через getActiveRow. А если описать только в ProductPage то переходе в карточку из раздела кнопка не активна.

Страница карточки и страница раздела — две разные схемы и кнопки на них — тоже разные. Если кнопка находится на странице раздела, то её обработчик пишется на этой странице, аналогично и с кнопкой на странице карточки. 

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

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

По ответам выше я добавляю кнопку в схему раздела тоже. Тогда, если переходить в конкретную карточку с раздела, кнопка не работает (так как её обработчик на схеме карточки, а сама она подгрузилась видимо со схемы раздела).

Сама кнопка (Сохранить и отправить) должна сохранять и менять стадию продукта на другую. В схеме раздела я не знаю как получить доступ к атрибуту карточки Stage.

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

Решил проблему при помощи https://academy.terrasoft.ru/documents/technic-sdk/7-14/obmen-soobshcheniyami-mezhdu-modulyami-komponent-sandbox. Если кнопка рендерится со страницы раздела то при нажатии на нее отправляется сообщение на страницу карточки где запускается нужный обработчик кнопки. Параметры видимости кнопки также передаются по сообщению.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день.

Возникла потребность реализовать кнопку, аналогичную кнопке со стадиями в разделе Обращения:

Никак не могу понять, как задать значения в списке, которые будут отображаться при нажатии на кнопку.

Коллеги, был ли у кого-то опыт реализации данной задачи?

 

Пробовала делать следующим образом: в секции diff прописала

{
	"operation": "insert",
	"parentName": "ActionButtonsContainer",
	"propertyName": "items",
	"name": "TestButton1",
	"values": {
		"itemType": this.Terrasoft.ViewItemType.BUTTON,
		"style": this.Terrasoft.controls.ButtonEnums.style.GREEN,
		"caption": "Test!!!!!!",
		"click": {"bindTo": "onResolvedButtonTest"},
		"classes": {
			"textClass": ["actions-button-margin-right"],
			"wrapperClass": ["actions-button-margin-right"]
		},
		"menu": {
			"items": {"bindTo": "ButtonMenu"}
		}
	}
}

В секции attributes прописала:

"ButtonMenu": {
	dataValueType: this.Terrasoft.DataValueType.COLLECTION
}

Но я не совсем понимаю как мне наполнить коллекцию ButtonMenu значениями, которые должны отображаться в выпадающем списке на кнопке?

 

У меня такой же вопрос

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

Вообще добавление подменю выглядит так:

var MenueItems = this.Ext.create("Terrasoft.BaseViewModelCollection");
this.getButtonMenuItem({
	"Click": { "bindTo": "ClickEvent" },
	"Tag": tag,
	"Caption": caption,
	"Enabled": true,
	"Visible": true
})
this.set("ButtonMenu", MenueItems);

 

В моём случае я заполнял выпадающий список значениями справочника по этому добавил функцию initMenueItems в init страницы

initMenueItems:function(){
	var self = this;
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "SchemaName"
	});
	esq.addColumn("Name", "Name");
	esq.addColumn("Id", "Id");
	esq.filters.add("Type", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Type", "{TypeId}"));
	esq.getEntityCollection(function (response) {
		if (!response.success) return;
		var data = response.collection;
		var MenueItems = self.Ext.create("Terrasoft.BaseViewModelCollection");
		data.collection.items.forEach(function (item) {
			MenueItems.addItem(self.getButtonMenuItem({
				"Click": { "bindTo": "ClickEvent" },
				"Tag": item.values.Id,
				"Caption": item.values.Name,
				"Enabled": true,
				"Visible": true
			}));
		});
		self.set("ButtonMenu", MenueItems);
	});
}

 

Если вопрос еще актуален, статично можно добавить так:

{
                "operation": "insert",
                "parentName": "OpportunityPageOfferTabContentGroup",
                "propertyName": "items",
                "name": "getOfferEngButton",
                "values": {
                    "itemType": Terrasoft.ViewItemType.BUTTON,
                    //"classes": {textClass: "actions-button-margin-right"},
                    "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                    "caption": {bindTo: "Resources.Strings.UsrGetOfferButtonCaption"},
                    "menu": {
                        "items": [{
                            "caption": {"bindTo": "Resources.Strings.UsrGetOfferEngButtonCaption"},
                            "click": {"bindTo": "getOfferEng"}
                        }, {
                            "caption": {"bindTo": "Resources.Strings.UsrGetOfferRusButtonCaption"},
                            "click": {"bindTo": "getOfferRus"}
                        }]
                    }
                }
            },

Спасибо. Попробовала сделать обоими способами, все получилось!

Всё можно сделать еще прозаичнее, к обычной кнопке в diff добавляем свойство 

"menu": {
	"items": {"bindTo": "ButtonMenuItems"}
},

где ButtonMenuItems это атрибут 

attributes: {
	"ButtonMenuItems": {
		dataValueType: this.Terrasoft.DataValueType.COLLECTION
	}
},

куда в свою очередь, необходимо добавлять через метод addItem, элементы вот как-то так

var collection = this.get("ButtonMenuItems");
var menuItem = this.Ext.create("Terrasoft.BaseViewModel", {
	values: {
		"Caption": "Заголовок пункта меню",
		"Click": {bindTo: "actionMethod"}
	}
});
collection.addItem(menuItem);

 

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте! Столкнулся со следующей проблемой.
На страницу редактирования контакта добавляю кнопку(при нажатии выводится имя контакта) при помощи такого кода:

define("ContactPageV2", [], function() {
        return {
                entitySchemaName: "Contact",
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                diff: /**SCHEMA_DIFF*/[
        {
                       
                        "operation": "insert",
                       
                        "parentName": "ActionButtonsContainer",
                       
                        "propertyName": "items",
                       
                        "name": "Name",
                       
                        "values": {
                               
                                itemType: Terrasoft.ViewItemType.BUTTON,
                               
                                caption: { bindTo: "Resources.Strings.Name"},
                                click: { bindTo: "getName"},
                               
                                "layout": {
                                        "column": 1,
                                        "row": 6,
                                        "colSpan": 1
                                },
                                style: "red"
                        }
        }
]/**SCHEMA_DIFF*/,
                methods: {
                        getName: function() {
                                var name = this.get("Name");
                                this.showInformationDialog(name);
                        }
                },
                rules: {}
        };
});

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

Может кто-нибудь объяснит в чем проблема. Заранее благодарен.

У меня такой же вопрос

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

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

Воспользуйтесь статьей https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-dobavit-knop….

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

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добавляю в кнопку "Действие" свой пункт, все по фэн-шую, то есть SDK.
Вот фрагмент:

actionMenuItems.addItem(this.getActionsMenuItem({
        Type : "Terrasoft.MenuSeparator",
        Caption : ""
}));
// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
actionMenuItems.addItem(this.getActionsMenuItem({
// Привязка заголовка пункта меню к локализуемой строке схемы.
        "Caption" : {
        bindTo : "Resources.Strings.UsrCheckOrder"
},

Неожиданная проблема в том, что при первом запуске виден текст локализованной строки "Проверить заказ", а после отрабатывания процесса, или закрытии-открытии окна с заказами, текст пропадает, но пункт в меню все равно есть, и по нажатию на него отрабатывает процесс.
А текста не видно.. что нужно проверить? :(

У меня такой же вопрос

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

Здравствуйте, Алексей Владимирович.

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

Пожалуйста..

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails", "ProcessModuleUtilities", "NotificationsModule"],
	function(resources, GeneralDetails, ProcessModuleUtilities, NotificationsModule) {
	return {
		entitySchemaName : "Order",
		details: /**SCHEMA_DETAILS*/{},/**SCHEMA_DETAILS*/
		diff: /**SCHEMA_DIFF*/[],/**SCHEMA_DIFF*/
		attributes: {},
		methods: {
			getActions : function() {
				// Вызывается родительская реализация метода для получения
				// коллекции проинициализированных действий базовой страницы.
				var actionMenuItems = this.callParent(arguments);
				// Добавление линии сепаратора для визуального отделения пользовательского действия от списка
				// действий базовой страницы.
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				// Добавление пункта меню [Проверить заказ] в список действий страницы редактирования.
				actionMenuItems.addItem(this.getActionsMenuItem({
						// Привязка заголовка пункта меню к локализуемой строке схемы.
						"Caption" : {
							bindTo : "Resources.Strings.UsrCheckOrder"
						},
						// Привязка метода обработчика действия.
						"Tag" : "CheckOrderPay"
						// Привязка свойства видимости пункта меню к значению, которое возвращает метод isAccountPrimaryContactSet.
						//"Visible": { bindTo: "isAccountPrimaryContactSet" }
					}));
				actionMenuItems.addItem(this.getActionsMenuItem({
						Type : "Terrasoft.MenuSeparator",
						Caption : ""
					}));
				return actionMenuItems;
 
			},
			// Метод-обработчик выбора действия.
			CheckOrderPay : function() {
				// Получение идентификатора заказа.
				var OrderId = this.get("Id");
				// Объект, который будет передан в качестве аргумента в метод executeProcess.
				var args = {
					// Имя процесса, который необходимо запустить.
					sysProcessName : "UsrCheckOrder",
					// Объект со значением входящего параметра для процесса.
					parameters : {
						idOrder : OrderId
					}
				};
				// Запуск пользовательского бизнес-процесса.
				ProcessModuleUtilities.executeProcess(args);
				//Terrasoft.configuration.NotificationsModule.onShowNewNotificationClick();
				//this.Location.Reload(false);
			}
		},
		rules : {},
		userCode : {}
	};
});

В Resources.Strings.UsrCheckOrder Заголовок и значение одинаковы, Проверить заказ
Строчка с Visible закоментирована в точности как указано, но функции, указанной там, в теле схемы нет..

Здравствуйте, Алексей Владимирович.

Мы проанализировали Ваш код. Данное поведение возникает у Вас, по причине того, что используя статью http://academy.terrasoft.ru/documents/docs/technic/SDK/7.7.0/AddActionT… Вы не выполнили пункты начиная с 6-го. После добавления локализированной строки в OrderSectionV2 данная проблема возникать не будет.

Спасибо за анализ, но я не повторяю типовое задание, а делаю свое, и у меня нет необходимости контролировать видимость пункта в зависимости от статуса заказа.
При любом статусе кнопка видна, по задумке.
Сейчас ситуация такова:
1. Ctrl+F5
2. Создаю заказ. Текст пункта виден.
3. Сохраняю заказ.
4. Открываю на редактирование только что созданный заказ - текст не виден.
5. Ctrl+F5 и открываю заказ опять - текст виден.
6. Закрываю заказ кнопкой "Закрыть".
7. Открываю заказ, текст пункта не виден.

Я понимаю, что, возможно, я где-то что-то не так сделал. Мне интересно что делать дальше?
Сейчас вот подумалось, что надо сделать новую локализуемую строку и попробовать ее назначить вместо прежней. Сделаю, отпишусь.

Увы, ситуация не изменилась, текст пропадает.
data-item-marker и текст, с ним совпадающий, показывается только в первый раз после полной перезагрузки.
Попробую пересоздать замещающую схему.

Здравствуйте, Алексей Владимирович.

Копирую Ваш код предварительно изменив его для ContactPageV2 и добавляю локализированную строку.

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

При открытии контакта элемент отсутствует.

Добавляем замещающую схему раздела с такой же локализированной строкой.

В результате элемент не пропадает.

Сергей, Спасибо! Урок усвоен :redface:

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Не получается добавить кнопку в карточку редактирования Лида рядом с Сохранить и тп
В файл LeadPageV2, в diff добавил

{
                "operation": "insert",
                "parentName": "LeftContainer",
                "propertyName": "items",
                "name": "CalculateButton",
                "values": {
                        "itemType": Terrasoft.ViewItemType.BUTTON,
                        "caption": "Calculate",
                        "classes": {"textClass": "actions-button-margin-right"},
                        "click": {"bindTo": "GetDeliveryPrice"},
                        "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                        "visible": "true"
                },
                "index": 2
        },

Кнопка не появляется. Какие еще действия необходимо проделать?

У меня такой же вопрос

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

Кнопка, которую вы прописали, будет появляться на странице редактирования при добавлении записи, например.

Я думаю то, что вам нужно это замещение LeadSectionV2. Попробуйте:

{
	"operation": "insert",
	"name": "CalculateButton",
	"parentName": "CombinedModeActionButtonsCardLeftContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": "Calculate",
		"style": Terrasoft.controls.ButtonEnums.style.GREEN,
		"visible": true
	}
}

"Толмачев Дмитрий Юрьевич" написал:

Кнопка, которую вы прописали, будет появляться на странице редактирования при добавлении записи, например.

Я думаю то, что вам нужно это замещение LeadSectionV2.


Спасибо. Попробовал Ваш способ. С тем же результатом, не появляется кнопка

Здравствуйте, Эмин.

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

В Google Chrome нажмите F12, правой кнопкой на кнопке перезагрузки страницы - Очистка кэша и аппаратная перезагрузка.
Либо попробуйте в режиме Инкогнито.

"Безродный Андрей" написал:После добавления кнопки необходимо полностью очистить кэш страницы, чтобы браузер выгрузил старый код и загрузил обновленный.

Добрый день, Андрей.
Все эти действия я проделывал и раньше.
Попробовал добавить кнопку в Заказы. Кнопка добавилась корректно

diff: /**SCHEMA_DIFF*/[
			{
					"operation": "insert",
					"name": "CalculateButton",
					"values": {
			                "itemType": Terrasoft.ViewItemType.BUTTON,
			                "caption": "Calculate",
			                "style": Terrasoft.controls.ButtonEnums.style.BLUE,
			                "visible": true,
							"click": {"bindTo": "GetDeliveryPrice"},
			        },
					"parentName": "CombinedModeActionButtonsCardLeftContainer",//"CombinedModeActionButtonsSectionContainer",
					"propertyName": "items",
				},
		]/**SCHEMA_DIFF*/,

Но тот же самый код в Лидах. И кнопка не появляется. Подозреваю, что кнопка "Квалифицировать" мешает отрисовке.

Здравствуйте, Эмин.

Попробовал на 7.5.0.627.

Получилось:

[URL=http://fastpic.ru/view/60/2015/0319/b7c3974c7ba4bdb754f6e43695dc8920.pn…]

Код замещающего клиентского модуля:

define("LeadSectionV2", ["LeadSectionV2Resources", "terrasoft", "ProcessModuleUtilities", "LeadConfigurationConst",
		"ControlGridModule", "BaseProgressBarModule", "css!BaseProgressBarModule",
		"css!LeadQualificationModuleStyles"],
	function(resources, Terrasoft, ProcessModuleUtilities, LeadConfigurationConst) {
		return {
			entitySchemaName: "Lead",
			diff: /**SCHEMA_DIFF*/[
				{
                                        "operation": "insert",
                                        "name": "CalculateButton",
                                        "values": {
                                        "itemType": Terrasoft.ViewItemType.BUTTON,
                                        "caption": "Calculate",
                                        "style": Terrasoft.controls.ButtonEnums.style.BLUE,
                                        "visible": true,
                                },
                                        "parentName": "CombinedModeActionButtonsCardLeftContainer",//"CombinedModeActionButtonsSectionContainer",
                                        "propertyName": "items",
               },
			]
		};
	});

"Безродный Андрей" написал:Попробовал на 7.5.0.627.

Получилось


Спасибо, кнопка появилась. Но возникла следующая проблема:
Функция обработки нажатия кнопки прописана на LeadPageV2. Существует ли способ вызова этой функции из LeadSectionV2? Т.к. в LeadSectionV2 не удается получить значения полей через this.get().

Эмин, здравствуйте.

Вместо this.get('Id') попробуйте написать this.get("ActiveRow")

"Безродный Андрей" написал:

Эмин, здравствуйте.

Вместо this.get('Id') попробуйте написать this.get("ActiveRow")


Спасибо. Да, ActiveRow тоже работает. Т.е. Id я получить могу. Но мне нужны значения полей, которых нет на Section(с помощью this.getActiveRow("") можно получить только значения со страницы реестра), есть только в карточке редактирования. Понятно, что с помощью запроса к бд я получу все необходимые данные. Но как-то глупо получается. Вот она карточка, в ней все данные уже лежат, а я вынужден делать запрос к базе, чтобы еще раз их получить

Эмин,

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

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

Войдите или зарегистрируйтесь, чтобы комментировать