JavaScript-функция в BPMonline

Доброго времени суток!

Столкнулся с проблемой: добавил исходный код "MyTools", язык указал JavaScript. В коде написал функцию "MyFunction". В процессе, где нужно выполнение моей функции, пишу

Page.AddScript(script);

Что поместить в переменную script, чтобы вызвать MyFunction?

Нравится

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

Добрый день.

Примерно так:

Page.ExitButton.AjaxEvents.Click.OnClientEvent = myStringJavaScriptFunction;

Код поместить на событии Init страницы.

На сколько я понял, в переменной myStringJavaScriptFunction тело самой javascript-функции, а это не совсем то. Как раз таки, чтобы не плодить одни и те же функции по всей конфигурации, я создал в конфигурации исходный код, и хочу обращаться к нему примерно таким образом

Page.MyButton.AjaxEvents.Click.OnClientEvent = "Terrasoft.MyTools.MyFunction()";

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

Page.ContextHelpButton.AjaxEvents.Click.OnClientEvent = "Terrasoft.HelpContext.showHelp(null, '" + Page.ContextHelpButton.ClientID + "')";

В таком случае, к своей Source схеме Вы можете обратиться как

Terrasoft.Common.Configuration.MySourceScheme.MyMethod(); 

в случае c# класс должен быть статическим, в ином случае нужно изначально создать объект класса, а затем вызвать метод:

Terrasoft.Common.Configuration.MySourceScheme myClass = new Terrasoft.Common.Configuration.MySourceScheme();
myClass.myMethod();

т.е. аналогично

Page.ContextHelpButton.AjaxEvents.Click.OnClientEvent = "Terrasoft.Common.Configuration.MySourceScheme.MyMethod()";

Попробовал как Вы советуете, не вышло.

TSConfiguration.MySourceScheme.MyMethod();

Класс TSConfiguration.MySourceScheme виден, но методов у него нет.
Способ

Page.ContextHelpButton.AjaxEvents.Click.OnClientEvent = "Terrasoft.Common.Configuration.MySourceScheme.MyMethod()";

тоже не подошел, так как у объекта Terrasoft нет объекта Common или Configuration. Это можно увидеть в консоли.

Возможно, нужно его как-то регистрировать?

Page.AddScript(script);

где script - строка с методом JS, добавляет данный JS код на страницу в клиенте.
Соответственно, если вы добавите таким же образом JS код вызова какого либо метода, то он запустится.

Page.AddScrpit(myMethod);
Page.AddScript(executeMyMethod);

По поводу консоли - cs файлы (классы и методы) они на сервере, в консоли браузера (клиентский код) Вы их и не увидите.
Обращаться можно через Terrasoft.Configuration.MySourceScheme.

Дмитрий, в шапке темы я указал

"Constantine" написал:

добавил исходный код "MyTools", язык указал JavaScript. В коде написал функцию "MyFunction".

. После я указал, что способ
"Олейник Дмитрий" написал:

Page.AddScript(script);

где script - строка с методом JS, добавляет данный JS код на страницу в клиенте.


мне не подходит, так как мне придется везде, где нужен вызов моей функции, тупо делать копи-паст тела самой функции. Чтобы избавиться от перегрузки кода, я вынес ее (функцию) в отдельную схему, у которой указал язык JavaScript, а не C#.
То что классы и методы *.cs файлов в консоли я не увижу, это понятно. Задача и состоит, в том, чтобы перенести JavaScript код из моей схемы в клиентский код, так как функции, которые он исполняет, должны работать на клиентской стороне, а не на стороне сервера. Потому я приводил пример с

Page.ContextHelpButton.AjaxEvents.Click.OnClientEvent = "Terrasoft.HelpContext.showHelp(null, '" + Page.ContextHelpButton.ClientID + "')";

так как этот же метод

Terrasoft.HelpContext.showHelp(null, какой-то_там_ID)

можно выполнить и из консоли

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

У меня получилось так:

1. Source код схема С#:

namespace Terrasoft.Configuration
{
    public static class Alert
    {
		public static string RenderScript() {
				return "function myFunction() {alert(\"Hello World!\"");}"";

Спасибо, Дмитрий, за пример, но это не совсем то, что нам нужно было. Решение нашли сами

Из приведенных примеров не очень понял, как вызывать яваскрипт-функцию из элемента процесса Задание-сценарий.

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

Вот так:

Page.AddScript("function myFunction() {alert(\"Hello World!\"");}"");

Дмитрий, а в каком пространстве имен располагается класс Page?

Page - это текущая клиентская страница (т.е. процесс страниц системы).
Элемент "Скрипт" выполняется на сервере, там никакой клиентской логики нет... По идее, Вам необходимо создавать страницу (или использовать текущие) и уже в контексте их выполнять какой то клиентский код.
А можно уточнить Вашу задачу?

Дмитрий, задачу я описывал в обращении 0160719. Нужно автоматически сгенерировать документ после создания документа в рамках БП. То есть сначала элемент "Страница редактирования", потом "Задание-сценарий", вызывающий метод ReportUtilities.generateReport() для генерации документа, затем открытие карточки e-mail для отправки этого документа.

Добрый день.
А, так а зачем Вам JavaScript?
Вызовите Вашу функцию в рамках БП:

Terrasoft.Configuration.ReportUtilities.generateReport();

А вот пример Source-код схемы:

namespace Terrasoft.Configuration
{
    public static class ReportUtilities
    {
                public static string generateReport() {
                                return "Hello world!";
                        }
        }
}

Дмитрий, то есть есть нужно ещё и создать класс ReportUtilities?
Дело в том, что я думал, что он стандартный, мне нужно было сгенерировать печатную форму после сохранения записи...

Нет, смотрите, если в конфигурации в какой либо Source код схеме уже есть нужная Вам функция - разумеется, дублировать её не нужно.
Просто вызывайте её:

Namespace.StaticClass.StaticMethod();

т.е. если метод определен так:

namespace Terrasoft.Configuration
{
    public static class ReportUtilities
    {
                public static string generateReport() {
                                return "Hello world!";
                        }
        }
}

то вызывать так:

Terrasoft.Configuration.ReportUtilities.generateReport();

Это то, что я хотел сказать в прошлом посте.

Ага, а если метод не определен:

?

Повторюсь, мне нужно из элемента Задание-сценарий реализовать генерацию документа. Это возможно?

Можно.
Генерация документа - это создание новой записи?
Попробуйте просто написать insert запрос.
К примеру:

var str = "Test";
var insert = new Insert(UserConnection)
  .Into("ConfItemsCode")
  .Set("Name", Column.Const(str));
  insert.Execute();

Дмитрий, немного неточно выразился - генерация печатной формы. То есть создание документа Word, с подтягиванием в неё значений из записи документа.

Посмотрел код схемы WordReportUtilities, которая генерит отчеты. Все просто - необходимо создать объект этого класса, воспользовавшись конструктором, затем вызвать метод GenerateReport с двумя параметрами - айди шаблона, и айди записи, для которой нужно построить отчет.

Попробуйте так:

Guid templateId = new Guid("АйДи шаблон");
Guid recordId = new Guid("АйДи документа");
Terrasoft.Configuration.WordReportUtility myReport = new Terrasoft.Configuration.WordReportUtility(UserConnection);
var myRepGuid = myReport.GenerateReport(templateId, recordId);
Показать все комментарии