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

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

 

Нравится

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

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

В данной статье описано отключение/замещение обработчика событий:

https://community.creatio.com/questions/disable-core-javascript-method-contractpagev2?_gl=1*1d49jeg*_gcl_au*MTYxNTAzNjkzMi4xNjkyOTU4NzI3

Отключение родительского обработчика в конце обсуждения по ссылке ниже:

https://community.terrasoft.ua/questions/raznica-vo-vremeni-v-aktivnost…

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

В EntityEventListener в методі OnSaving змінили значення поля:

entity.SetColumnValue("Count", 5);        

Запис зберігся успішно, але процес який був зав'язаний на поле Count - проігнорив.

Питання: Як змінити поле так, щоб процес запустився

Нравится

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

Доброго дня, Віталій!

Для вирішення вашого питання можу запропонувати такі варіанти:

​​​​​​​1. Побудуйте ваш процес на об’єкті (виведіть скрипт-таску):

    1) Advanced settings -> Needed object -> Events -> Saving -> Before record saved

    2) Advanced settings -> Needed object -> Open process -> виведіть у відкритому вікні Event sub-process -> у вікно додайте Message та впишіть інформацію з “Before record saved” -> додайте Script task та у код запишіть Entity.SetColumnValue("Count", 5);     return true;

2. Якщо перший варіант не підходить, то підкажіть, будь ласка, по якому об’єкту ви робили логіку? По кастомному чи базовому? У випадку базового – напишіть який саме об’єкт використовували.

​​​​​​​З повагою, Ангеліна

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

Добрый день!

 

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

Куда в код страницы добавить этот код, чтобы он отработал при получении сообщения?

function listener(event) { if (event.origin != 'http://javascript.ru') { // что-то прислали с неизвестного домена - проигнорируем.. return; } alert( "получено: " + event.data ); } if (window.addEventListener) { window.addEventListener("message", listener); } else { // IE8 window.attachEvent("onmessage", listener); }

Нравится

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

Добрый день!

Марат, все зависит от задачи. Вы можете разметить его как в BaseSection на init, так и в "ответе" ViewModule.aspx.

Ответ ViewModule.aspx частично формируется в конфигурации, в SectionHelper'е. Вам нужно сделать override класса ConfigurationSectionHelper. Там вы можете дописать свой JS, который отработает сразу после логона и входа в систему. Для примера обратите внимание на метод GetConfigurationScript

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

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



Имеется задача: Показать диалоговое окно подтверждения с кнопками OK и KO для подтверждения отмены Обращения (Case), если пользователь нажал на статус Cancel в DCM.

Если была нажата кнопка OK, то Case отменяется.

Если была нажата кнопка KO, то Case вернется к предыдущему статусу.

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

Я попытался отобразить диалоговое окно по событию OnSaving объекта Case.

Вот моя функция:

public override void OnSaving(object sender, EntityBeforeEventArgs e) {  
string status = UpdateData(sender);
if(status!="Canceled") {
base.OnSaving(sender, e);
  	} else {
    		//Todo: Show dialog with question
  		//Todo: Get response OK or KO
                /*if(response ="OK"){
                        base.OnSaving(sender, e);
                 }else{
                        e.IsCanceled = true;
        }*/
}
}

К сожалению, я не нашла никакой информации о том, как отобразить диалоговое окно на стороне сервера.

Я знаю способ отправки сообщений с клиентской стороны (this.showConfirmationDialog(message, function(returnCode)), но не знаю, как вернуть результат нажатия кнопки на сервер для завершения метода OnSaving.

private void SendMessage(object sender) {
       var entity = (Entity)sender; 
       var userConnection = entity.UserConnection;
      string senderName = "MySenderNameCase";  
      string message = JsonConvert.SerializeObject(new {test = "status"});
      MsgChannelUtilities.PostMessage(userConnection, senderName, message);
  }             

Пожалуйста, подскажите, как правильно выполнить эту задачу.

Спасибо.

С наилучшими пожеланиями,

Мария

Нравится

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

Мы делали подтверждение перехода Case на финальный статус на странице, выдавая showConfirmationDialog в функции Save.



 

this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.save(scopeArguments);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);

 

Мы делали подтверждение перехода Case на финальный статус на странице, выдавая showConfirmationDialog в функции Save.



 

this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.save(scopeArguments);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);

 

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

Спасибо за ваш ответ.

 

Это помогло решить задачу!

 

Mariia Prostiak,

 как все же у Вас получилось положить всплывающий вопрос в Save?

this.save(scopeArguments); - и что ложили в "scopeArguments". Если не сложно, можете написать код функции, есть такая же задача на решении?

Владимир Соколов,

 или подскажите Вы, как в Save реализовали данное всплавающее соощение не получив рекурсии

Александр Тыра,

 

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

Вечная рекурсия решается вызовом this.callParent(config) вместо this.save(scopeArguments);

Итого получается:

save: function(config) {
this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.callParent(config);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);
 
}

 

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

Коллеги всем доброго времени суток. Подскажите, кто нибудь работал с событийным слоем Entity.

Написал класс обработчик в качестве примера для обучения скомпилировал приложение упал сайт.

Вот пример класса обработчика:

 

using System;
using System.Web;
using Terrasoft.Core;
using Terrasoft.Core.Entities;
using Terrasoft.Core.Entities.Events;
 
 
namespace Terrasoft.Configuration
{
    [EntityEventListener(SchemaName = "Order")]
    public class OrderEntityEventListener : BaseEntityEventListener
    {
 
        private UserConnection _userConnection;
 
        private LogService _logService;
        public UserConnection UserConnection
        {
            get
            {
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                return _userConnection;
            }
 
            set { _userConnection = value; }
        }        
 
        public LogService LogService { get => _logService; set => _logService = value; }
 
        public OrderEntityEventListener()
        {
            LogService = new LogService(UserConnection);
        }
 
        public override void OnInserting(object sender, EntityBeforeEventArgs e)
        {
            try
            {
                base.OnInserting(sender, e);
 
                var systemUserName = UserConnection.CurrentUser.ContactName;
                var systemUserId = UserConnection.CurrentUser.ContactId;
                LogService.RecInfo($"LOG:[OnInserting]:systemUserId: {systemUserId}; systemUserName:{systemUserName}");
            }
            catch (Exception exception)
            {
                LogService.RecInfo($"LOG:[OnInserting]:Exception: {exception.Message}; {exception.InnerException}");
            }
 
        }
    }
}

Подскажите, что тут не так? Если кто работал, скинте пожалуйста примеры.

Заранее благодарен

Нравится

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

Добрый день, Алексей!

UserConnection необходимо получать из sender

Пример:

public override void OnSaved(object sender, EntityAfterEventArgs e) {

            base.OnSaved(sender, e);

            var entity = (Entity) sender;

            var userConnection = entity.UserConnection;

        }

Ошибка заключается в том, что слушатели изменений сущностей, работают не только при изменении значений через карточку (в данном случае есть HttpContext) но и в фоновом режиме (процессы, планировщик - без HttpContext).

Добрый день, Алексей!

UserConnection необходимо получать из sender

Пример:

public override void OnSaved(object sender, EntityAfterEventArgs e) {

            base.OnSaved(sender, e);

            var entity = (Entity) sender;

            var userConnection = entity.UserConnection;

        }

Ошибка заключается в том, что слушатели изменений сущностей, работают не только при изменении значений через карточку (в данном случае есть HttpContext) но и в фоновом режиме (процессы, планировщик - без HttpContext).

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