...

Использование собственных функций в сценариях контекстных переменных

Тема в разделе "Разработчикам", создана пользователем Ekkeir, 29 янв 2018.

  1. Ekkeir

    Ekkeir New Member

    Добрый день, продолжаю эксперименты с community версией.

    Производится попытка воспроизвести следующий сценарий:
    • в контекстной переменной SelectedUser есть некий выбранный пользователь
    • есть контекстная переменная SelectedUserInitials типа строка, куда хочется записать ФИО выбранного пользователя в нужном специфичном формате
    • в сценариях процесса написано несколько вариантов функций, которые возвращают ФИО в нужном формате
      • string GetSelectedUserInitials(Context context)
      • string GetUserInitials(EleWise.ELMA.Security.Models.User user)
    • в свойствах контекстной переменной SelectedUserInitials указан тип вычисления значения "Сценарий на C#)
    При этом, при любом из следующих вариантов текста сценария в свойствах контекстной переменной SelectedUserInitials
    • GetSelectedUserInitials(context);
    • GetUserInitials(SelectedUser);
    Возвращается ошибка о том, что имя функции отсутствует в данном контексте. (для первого варианта также возвращается ошибка об отсутствии context в текущем контексте.

    Каков принятый в ELMA способ использования собственных функций в сценариях контекстных переменных?

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

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

    P.S. если верно интерпретирую эту тему, то сценарий контекстной переменной должен быть полноценным в использовании.
     
  2. akarimov

    akarimov Member

    Функции из сценариев проекта и настройки поля контекста принадлежат разным классам (P_Название_класса_процесса и P_Название_класса_процесса_Scripts) и разным пространствам имен (EleWise.ELMA.Model.Entities.ProcessContext и EleWise.ELMA.Model.Scripts). В файле настройки контекста ссылки на Model.Scripts нет, поэтому надо прописывать имя функции полностью
    EleWise.ELMA.Model.Scripts.P_Название_класса_процесса_Scripts.НазваниеФункции.
    Поскольку класс скриптов не статический, функция должна быть объявлена как статическая, ну или надо откуда то в неё передать экземпляр объекта "Модуль сценариев".
    А вот насчет желания не костылить, наверное надо начать с более раннего - а зачем в контексте хранить специальное отображение имени пользователя? Для генерации документов по шаблону/отправки сообщений (первое что приходит на ум) можно пользоваться функциями шаблонизатора помоему там было и насчет вытаскивания инициалов
     
    1 это нравится
  3. Ekkeir

    Ekkeir New Member

    Во-первых, большое спасибо за подробный ответ!

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

    Отображение нужно по следующим соображениям:
    1. Как простой пример более сложного случая контекстной переменной, значение которой должно как-то хитро получаться из уже существующих, что было бы удобнее выделить в отдельную функцию, а не вмещать в две видимые строчки в карточке контекста.
    2. Вы совершенно правы, используется для генерации документа по шаблону. Навскидку не удалось найти подробной справки, поэтому пришлось решать вот так вот. Спасибо за совет, нашел-таки соответствующую функцию шаблонизатора и переориентировал процесс на нее.
     
  4. akarimov

    akarimov Member

    Даже интересно стало какой нибудь конкретный пример такого посмотреть, причем кроме прочего для эффективности этой функции она должна использоваться в двух или более местах, иначе одинаково с точки зрения стоимости где её держать в поле вычисляемом или в коде сценариев.
    По вычисляемым полям за несколько лет работы с ELMA у меня накопился ряд претензий к ним почему стараюсь их не использовать, ну разве что для формирования наименования у объектов где оно носит формальный характер.
    1. Вычисляемое поле или нет визуально непонятно пока не залезешь в его кишки, что вместе с скажем так небыстротой дизайнера доставляет минимум удовольствия.
    2. В отличие от версионности процессов настройки свойств не версионируются как я понял, во всяком случае если было невычисляемое поле, ты его сделал вычисляемым - обнулятся/изменятся все значения этого поля в процессах ранних версий.
    3. Что-то было не очень устраивающее меня с временем вычисления, не вспомню уже конкретный кейс, но был случай когда вычисляемое поле обновлялось позже чем этого ожидал работающий с формой чел. Сбивало с толку.
    Поэтому в большинстве случаев предпочтительнее сценарии на изменение значения. Жаль конечно что в community их нет.
     
  5. Ekkeir

    Ekkeir New Member

    Постараюсь не забыть сообщить, как только столкнусь. Пытался думать на будущее )

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

Поделиться: