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

1) Нужно передать значение (Id выбранной записи) со страницы детали в страницу проекта, задействованной в бизнес процессе. Я так понял нужно использовать sandbox и messages. Подскажите подробнее как их использовать?

2) Добавил на деталь свою кнопку. Как по нажатию этой кнопки осуществить дальнейшее прохождение страницы проекта по бизнес процессу. Банальный this.acceptProcessElement(); не помогает.

Скриншот во вложении.

Нравится

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

Добрый день!

Посмотрите похожие темы на community. Подобные задачи уже решались.
http://www.community.terrasoft.ru/forum/topic/11626
http://www.community.terrasoft.ru/forum/topic/13314
http://www.community.terrasoft.ru/blogs/12691
http://www.community.terrasoft.ru/forum/topic/10554

Здравствуйте. С первым вопросом разобрался. Удалось передать сообщение по нажатию кнопки. Но это не удобно. Скажите, а можно передать сообщение по событию выделения записи в детали(событие типа onClick)? Функцию получения выделенной строки - this.getActiveRow() нашел. А где прописать событие не разобрался.

И еще вопрос по messages. Как отловить на основной странице, что сообщение из детали пришло? Т.е есть ли такое событие прихода сообщения?

Решил реализовать следующим образом: добавить кнопку в активную строку и по нажатию послать сообщение основной форме. В основной форме отловит сообщение и отправиться дальше по процессу. Что удалось найти:

Нашел на форуме, что можно добавить кнопку в активную строку.

{
	"operation": "insert",
	"name": "DataGridActiveRowTestAction",
	"parentName": "DataGrid",
	"propertyName": "activeRowActions",
	"values": {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.BLUE,
		"caption": {"bindTo": "Resources.Strings.TestRowButtonCaption"},
		"visible": true,
		"tag": "call"
	}
}

И потом переопределить метод onActiveRowAction:

onActiveRowAction: function(buttonTag, primaryColumnValue) {
	switch (buttonTag) {
		// замещение базового метода посылаем сообщение основной странице
		case "call":
			this.sandbox.publish("GetContactDetailActiveRecordId", this.get("TestParameter"),       [this.sandbox.id]);
			break;
		default:
			this.callParent(arguments);
			break;
	}
},

Который объявлен в BaseSectionV2 (Базовая схема раздела).

Проблема:
1) при объявлении кнопки выходит сообщение, что DataGrid не является контейнером для других объектов. Подскажите, что делаю не так?

2) Как отловить в основной форме, что пришло сообщение из детали?
За ранее спасибо.

Добрый день!

Для получения идентификатора текущей записи детали в родительской карточке редактирования используя механизм подписки/публикации сообщений между соответствующими модулями - алгоритм будет примерно следующий:

Для начала необходимо в коде карточки и детали добавить адресное сообщение с одним и тем же названием, но в карточке с типом "Подписка", а в детали - с типом "Публикация". Например, для карточки редактирования:

messages: {
"GetContactDetailActiveRecordId": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.SUBSCRIBE
}
}

Для детали точно так же, только в свойстве direction необходимо указать Terrasoft.MessageDirectionType.PUBLISH.

Далее при инициализации карточки редактирования (метод init) нужно подписаться на это сообщение, а в функции обратного вызова получить значение из детали и сохранить его в атрибут модели карточки:

init: function() {
this.callParent(arguments);
this.sandbox.subscribe("GetContactDetailActiveRecordId", function(recordId) {
this.set("ContactDetailActiveRecordId", recordId);
}, this, [contactDetailSandboxId]);
}

Значение contactDetailSandboxId Вам необходимо определить самостоятельно (оно формируется в зависимости от названия детали). В коде детали оно хранится в свойстве this.sandbox.id.

Наконец, в коде детали, при обработке нажатия на кнопку необходимо просто опубликовать сообщение, передав значение текущей записи:

onButtonClick: function() {
this.sandbox.publish("GetContactDetailActiveRecordId", this.get("ActiveRow"), [this.sandbox.id]);
}

Здравствуйте, Олег.
Да, все получилось именно так, спасибо.

"Наконец, в коде детали, при обработке нажатия на кнопку необходимо просто опубликовать сообщение, передав значение текущей записи:"

Подскажите, как передать сообщение не по кнопке, а при выборе записи в DataGrid?

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

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

"Демьяник Алексей Олегович" написал: В случае выбора записи в DataGrid, сообщение будет генерироваться при выборе любой записи в любом гриде, что замедлит работоспособность системы.

Здравствуйте, Алексей.
Хорошо. Понял. Подскажите а можно кнопку в DataGrid встроить? И как?

Добрый день!

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

Здравствуйте, Олег. Я так реализовал уже. Но это не совсем удобно. Подскажите как встроить кнопку в датагрид? В предыдущих версиях можно было. В крайнем случае, если нельзя, как кнопку в детали выделить? Другим цветом например?

Олег, добрый день!

Попробуйте следующий вариант реализации:

в скрипте детали в блок diff добавить дополнительные свойства для DataGrid (название и заголовок кнопки привожу в качестве примера, Вы можете изменить их на свои):

{
	"operation": "merge",
	"name": "DataGrid",
	"values": {
		"activeRowAction": {"bindTo": "onActiveRowAction"},
		"activeRowActions": [
			{
				"className": "Terrasoft.Button",
				"style": this.Terrasoft.controls.ButtonEnums.style.BLUE,
				"markerValue": "myButtonAction",
				"tag": "myAction",
				"caption": "MyButton"
			}
		]
	}
}

После этого при выделении активной строки в детали должна появиться синяя кнопка с заголовком MyButton.

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

Далее в методах той же детали необходимо реализовать метод onActiveRowAction. Данный метод в качестве аргументов принимает тэг кнопки и значение ключевой колонки выделенной строки. Насколько я понял из предыдущих сообщений, Вам этой информации достаточно, но если необходимо получить какие-либо другие значения выделенной строки, можно вызвать метод this.getActiveRow(), который возвращает всю модель выделенной строки:

methods: {
	onActiveRowAction: function(buttonTag, primaryColumnValue) {
		if (buttonTag === "myAction") {
			// весь код ниже можно убрать, он демонстрирует, что значения
			// primaryColumnValue и activeRowId равны
			var activeRow = this.getActiveRow();
			var activeRowId = activeRow.get("Id");
			console.log(primaryColumnValue);
			console.log(activeRowId);
			// дальше Ваша реализация
			...
		}
	},
	...
}

Здравствуйте, Олег.
Спасибо. Получилось то, что нужно. Скрин во вложении.

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