Всем привет,
Есть кусок кода, который корректно работает в системе:
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.
Вероятно, если не прибегать к хакам, поможет добавление на портал этого раздела.