Ошибка при инициализации детали в карточке раздела на портале
Версия 7.12.4.
Добавил деталь в р. "Обращения портала"
При инициализации детали получаю ошибку:
После отладки выявлено, что ошибка связана с вызовом не существующего сallback в методе initDetailRunProcessButtonMenu миксина ProcessEntryPointUtilities.
В результате этой ошибки деталь не отображается в карточке Обращения на портале.
Нравится
Если в стандартной детали логика этой же функции initDetailRunProcessButtonMenu отрабатывает нормально, дело может быть в неверно созданной Вашей. Попробуйте в обоих случаях посмотреть в отладчике запуск этой функции и посмотреть, в чём разница.
/** * Initializes "Run process" menu items in detail. * @param {Function} callback Callback function. * @param {Object} scope Execution context. * @protected */ initDetailRunProcessButtonMenu: function(callback, scope) { var processButtonMenu = this.get("RunProcessButtonMenuItems"); if (!processButtonMenu) { processButtonMenu = this.Ext.create("Terrasoft.BaseViewModelCollection"); this.set("RunProcessButtonMenuItems", processButtonMenu); } if (Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection()) { this._initDetailAvailableProcessList(processButtonMenu, callback, scope); } else { callback.call(scope); } },
Возможно, для стандартной детали до else и не доходит.
Илья, добрый день.
В том то и дело, что
Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection() и проверяет, не является ли пользователь пользователем портала, и в интерфейсе сотрудника возвращает true, и как следствие выполняется this._initDetailAvailableProcessList(processButtonMenu, callback, scope);
НО если пользователь является пользователем портала, то выполняется callback.call(scope);, а callback в этот метод не передается и равен undefind
Т.о. при выводе детали для пользователя портала получаем ошибку
Сравните с другой деталью тоже на портале, как там работает эта функция.
Мотков Илья,
Деталей на портале нет.
Вопрос в том, почему в initDetailRunProcessButtonMenu не передаётся callback
Видимо, потому и не передаётся, что деталей нет и никто не планировал запускать там эту функцию. Посмотрите, во отладке что это за анонимная функция, которая её вызывает и в чём разница в запуске на портале и в обычном разделе.
Мотков Илья,
Метод initDetailRunProcessButtonMenu вызывается в BaseGridDetailV2 в методе initData и не принимает аргументы (см. https://yadi.sk/i/UoJ5M8kHo9s1kw)
Но в условии else вызывается callback.call(scope);, который по определению вернёт ошибку( т.к. initDetailRunProcessButtonMenu не принимает аргументов)
Сам метод initDetailRunProcessButtonMenu описан в схеме-миксине ProcessEntryPointUtilities
Я пытаюсь указать на баг базовой функциональности, который ограничивает использование деталей на портале пользователей.
Для себя временной решение я уже нашёл, но хотелось бы получить исправление в коробочной версии.
Либо переделайте initData, чтобы передавала в функцию эти два параметра, либо в самой initDetailRunProcessButtonMenu добавьте проверку на заполненность параметра, либо, если initData — это единственное место в системе, где функцию initDetailRunProcessButtonMenu вызывают и else не сможет отработать в принципе, исключите нижнюю ветвь.
Мотков Илья,
Илья, решение я уже нашёл (заместил
BaseGridDetailV2 и метод initDetailRunProcessButtonMenu.)
Целью этой публикации на community является обратить внимание поддержки Terrasoft на не корректную реализацию метода initDetailRunProcessButtonMenu и на проблемы, которые, эта реализация вызывает.
Чтобы это по возможности было исправлено в следующих релизах.
Кстати, в следующих релизах обещают полностью новый портал, так что может и не потребуется ничего исправлять, если в логике не для портала функция вызывается правильно, с параметром.
Если же вызывается тоже без, но в обычном разделе до else никогда на доходит, то надо эту ветвь просто вырезать.