Всем привет,
Есть кусок кода, который корректно работает в системе:
var hash = NetworkUtilities.getEntityUrl("SomeObject", record.get("SomeObject.Id")); this.sandbox.publish("PushHistoryState", {hash: hash});
Но в портале самообслуживания hash получается пустым и ничего не происходит. У пользователя есть доступ к объекту - он видит записи если открыть их напрямую (объект прописан в справочниках доступа объектов для портальных пользователей).
Кто-нибудь может подсказать в чем может быть проблема и как заставить работать код в портале?
Нравится
Проверьте что у пользователей портала есть права на доступ к объекту (хотя бы на чтение), а так же что ваш объект добавлен в справочник [Список объектов, доступных пользователям портала] и что нужные колонки указаны а справочнике [Список доступных полей объектов на портале]
При необходимости внесите изменения, сбросьте рэдис и перезайдите в систему.
Код этой функции getEntityUrl можно открыть в конфигурации, в схеме NetworkUtilities:
/** * Creates a relative URL to open the card of the entity. * @throws {Terrasoft.ArgumentNullOrEmptyException} Throws an exception if not specified the schema name or * the entity ID. * @inheritdoc NetworkUtilities#getEntityConfigUrl */ getEntityUrl: function(config) { if (arguments.length > 1) { config = { entitySchema: arguments[0], primaryColumnValue: arguments[1], typeColumnValue: arguments[2], operation: arguments[3] }; } let url = ""; var entityConfig = this.getEntityConfigUrl(config); if (entityConfig) { url = Terrasoft.combinePath( entityConfig.cardModule, entityConfig.cardSchema, entityConfig.operation, entityConfig.primaryColumnValue ); } return url; },
А она вызывает getEntityConfigUrl:
/** * Creates a configuration object values for the U R L to a card entity. * @throws {Terrasoft.ArgumentNullOrEmptyException} Throws an exception if not specified * the schema name or the entity ID. * @param {Object} config Config object. * @param {String} config.entitySchema The name or ID of the schema entity. * @param {String} [config.entitySchemaName] The name of the schema entity. Alias for @entitySchema. * @param {String} config.primaryColumnValue The entity identifier. * @param {String} [config.typeColumnValue] The value of the column type. * @param {String} [config.typeId] The value of the column type. Alias for @typeColumnValue. * @param {String} [config.operation] Operation. * @return {Object} Returns the configuration object values for the U R L to a card entity. */ getEntityConfigUrl: function(config) { const configArg = arguments.length === 1; const entitySchema = configArg ? config.entitySchema || config.entitySchemaName : arguments[0]; const primaryColumnValue = configArg ? config.primaryColumnValue : arguments[1]; const typeColumnValue = configArg ? config.typeColumnValue || config.typeId : arguments[2]; const operation = configArg ? config.operation : arguments[3]; var entitySchemaName = Terrasoft.isGUID(entitySchema) ? this.getEntitySchemaName(entitySchema) : entitySchema; if (!entitySchemaName) { throw Ext.create("Terrasoft.ArgumentNullOrEmptyException"); } var moduleStructure = Terrasoft.ModuleUtils.getModuleStructureByName(entitySchemaName); var entityStructure = Terrasoft.ModuleUtils.getEntityStructureByName(entitySchemaName); if (!entityStructure && !moduleStructure) { return null; } var pages = entityStructure.pages; if (typeColumnValue && moduleStructure && moduleStructure.attribute && !Ext.isEmpty(pages)) { var typePage = Terrasoft.where(pages, {"UId": typeColumnValue}); pages = Ext.isEmpty(typePage) ? pages : typePage; } var cardModule = moduleStructure && moduleStructure.cardModule ? moduleStructure.cardModule : "CardModuleV2"; var cardSchema = pages[0].cardSchema; var configUrl = { cardModule: cardModule, cardSchema: cardSchema, entitySchemaName: entitySchemaName, operation: operation || Terrasoft.ConfigurationEnums.CardOperation.EDIT, primaryColumnValue: primaryColumnValue }; return configUrl; },
Вероятно, в ней выполнение идёт по ветви, которая возвращает null. Попробуйте у себя отладить JS в браузере, чтобы выяснить, чего именно на портале не хватает и можно ли это обойти, модифицировав скрипт.
Проверьте что у пользователей портала есть права на доступ к объекту (хотя бы на чтение), а так же что ваш объект добавлен в справочник [Список объектов, доступных пользователям портала] и что нужные колонки указаны а справочнике [Список доступных полей объектов на портале]
При необходимости внесите изменения, сбросьте рэдис и перезайдите в систему.
Григорий Чех,
Спасибо за ответ.
Странно как раз то, что доступ к объекту есть и объект указан в справочниках. Косвенным подтверждением этого является то, что я могу открыть карточку объекта через адресную строку и могу видеть и даже менять данные на этой карточке под портальным пользователем.
Тёскин Дмитрий Валерьевич,
Тогда только отлаживатся и смотреть почему возращает пусто или сделать костыль (для портала зашить нужный url)
Ещё точнее, на портале в JS объект Terrasoft.configuration.ModuleStructure содержит только 3 стандартных портальных раздела, и для SomeObject функция ничего не возвращает. Посмотреть наполнение на портале и в обычной системе можно, введя в консоли браузера Terrasoft.configuration.ModuleStructure.
Логика наполнения списка реализована в C#-схеме ConfigurationSectionHelper.
Вероятно, если не прибегать к хакам, поможет добавление на портал этого раздела.