Здравствуйте! По поиску вопрос уже поднимался, но рабочего решения так и нашел.
Задача заключается в следующем. Есть карточка счета/договора/и т.д. В карточке заполнено какое-либо справочное поле. Так вот, необходимо в зависимости от этого справочного поля отображать разный список печатных форм.
Было выяснено, что список доступных для печати форм формируется в методе initCardPrintForms в миксине ["PrintReportUtilities"]
Соответственно, я этот метод переопределил.
Добавив туда после вызова метода
this.preparePrintFormsMenuCollection(printFormsMenuCollection);
Вызов своего метода для скрытия формы:
this.hidePrintFormsMenuItem(printFormsMenuCollection);
В этом методе планировалось построчно проверять название (или id) отчета и в зависимости от этого скрывать конкретную форму из списка.
Планировалось использовать что-то типа такой конструкции:
hidePrintFormsMenuItem: function(printForms) {
printForms.eachKey(function(key, item) {
var formName = item.get("Caption");
switch (ЗНАЧЕНИЕ_СПРАВОЧНИКА) {
case value1:
if (formName!="Отчет1") item.set("Visible", false);
break;
case value2:
if (formName!="Отчет2") item.set("Visible", false);
break;
}
}, this);
},
Собственно вопрос в том, как получить значение нужного мне поля (справочника) в контексте текущего метода? А может есть готовое решение и не нужно изобретать велосипед?
Нравится
Хотел воспользоваться this.get("СПРАВОЧНИК").displayValue, но при первичной инициализации такого параметра еще нет. Вопрос остается открытым, как получить значение параметра с карточки раздела во время формирования списка печатных форм?
Добрый день, Павел!
Во-первых, нужно переопределить метод initCardPrintForms, в котором после вызова this.callParent(arguments) нужно забиндиться на видимость печатных форм. Сделать это можно так:
//получаем коллекцию всех печатных форм var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName); printFormsMenuCollection.each(function(item) { item.set("Visible", {bindTo: "getPrintMenuItemVisible"}); }, this);
А уже в самом методе getPrintMenuItemVisible описать логику и возвращать true - для тех, которые отображать и false, для которых не отображать.
getPrintMenuItemVisible: function(reportId) { //логика и возврат true/false }
Чтобы взять нужное вам поле и чтобы оно было инициализировано следует вызвать метод initCardPrintForms в самом конце onEntityInitialized (то есть после this.callParent(arguments)).
Также не забудьте, что при изменении поля от которого зависит видимость должен обязательно вызывать после изменения getCardPrintButtonVisible
Золотарев Артем Андреевич, спасибо за ответ. Смысл понятен, но появились проблемы. Если следовать вашему совету, и переопределить метод initCardPrintForms таким способом
initCardPrintForms: function(callback, scope) { this.callParent(arguments); //получаем коллекцию всех печатных форм var printMenuItems = this.get(this.moduleCardPrintFormsCollectionName); printFormsMenuCollection.each(function(item) { debugger; item.set("Visible", {bindTo: "getPrintMenuItemVisible"}); }, this); },
то this.get(this.moduleCardPrintFormsCollectionName); возвращает undefined
И как я понимаю, в следующей строке, где происходит перебор коллекции нужно обращаться к printMenuItems, а не к printFormsMenuCollection?
Попробуйте вызывать initCardPrintForms в конце onEntityInitialized, тогда коллекция должна подтянуться.
Да, нужно обращаться к printMenuItems, опечатался
Золотарев Артем Андреевич,
Дело в том, что, если initCardPrintForms добавить в конце onEntityInitialized, то initCardPrintForms выполняется два раза. А при повторном выполнении список отчетов уже сгенерирован на странице и получается, что толку смысла видимость строки уже нет. Нужно каким-то образом сгенерировать меню печати повторно.
сгенерировать меню печати повторно можно вызвав
this.getCardPrintButtonVisible()
У меня все равно не получилось добиться результата.
Если попытаться загрузить коллекцию печатных форм через
this.get(this.moduleCardPrintFormsCollectionName);
в методе initCardPrintForms после this.callParent(arguments), то коллекция не подгружается.
Если скопировать код метода initCardPrintForms и изменить видимость элементов непосредственно в printFormsMenuCollection, то во время второго вызова initCardPrintForms (когда уже прошла инициализация onEntityInitialized), новое меню не формируется и в консоль падает ошибка Uncaught TypeError: callback.call is not a function. Это на строке callback.call(scope || this); в методе initCardPrintForms.
Попробуй тогда использовать просто переопределенные методы либо initCardPrintForms, либо getCardPrintButtonVisible, там по идее уже должны быть доступны поля объекта.