Задача
Необходимо реализовать поиск из командной строки доступной на странице портальных пользователей, по базе знаний, не только по основному полю (название), но и по содержимому статьи и публичным тегам.
Решение
Поиск можно доработать в «строке поиска по базе знаний» страницы портального пользователя. Это отдельный элемент, похожий на командную строку, использующий ее вид, но реализация его логики содержится в схеме KnowledgeBaseSearchModule.
Эту страницу можно отладить и под обычным пользователем, в обычном интерфейсе, открыв ее как модуль данной ссылкой:
http://ваш-сайт/0/Nui/ViewModule.aspx#PortalMainPageModule/
Для реализации сложного фильтра вместо фильтра только по названию статьи, необходимо изменить следующий код, путем замещения базовой схемы KnowledgeBaseSearchModule:
/*sessionFilters.CustomFilters = {
value: value,
displayValue: value,
primaryDisplayColumn: true
};*/
var filters = Ext.create("Terrasoft.FilterGroup");
filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.CONTAIN, "Notes", value));
filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.CONTAIN, "Name", value));
filters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.CONTAIN, "Keywords", value));
filters.logicalOperation = Terrasoft.LogicalOperatorType.OR;
var serializationInfo = filters.getDefSerializationInfo();
serializationInfo.serializeFilterManagerInfo = true;
sessionFilters.CustomFilters = {
"null": {
"displayValue": value,
"filter": filters.serialize(serializationInfo)
}
};
Также для того, чтобы в колонку "Keywords" записывались публичные теги для последующего поиска по этой колонке, необходимо реализовать события изменения, добавления и удаления тегов базы знаний, путем создания их в замещающем объекте KnowledgeBaseInTagV2.
var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
Guid entityId = Entity.GetTypedColumnValue<Guid>("EntityId");
var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "KnowledgeBaseInTagV2");
var publicTypeId = "D6FB4DE6-0809-41FE-A84F-6D245CBC5F32";
esq.AddColumn("Tag.Name");
var entityFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal,
"Entity.Id", entityId);
var typeFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal,
"Tag.Type", publicTypeId);
esq.Filters.Add(entityFilter);
esq.Filters.Add(typeFilter);
var entityCollection = esq.GetEntityCollection(userConnection);
string allTags = string.Empty;
foreach (var entity in entityCollection) {
var tagName = entity.GetTypedColumnValue<string>("Tag_Name");
allTags += tagName + ", ";
}
using (DBExecutor executor = userConnection.EnsureDBConnection()) {
Update updateRelationshipQuery = new Update(userConnection, "KnowledgeBase");
updateRelationshipQuery.Set("Keywords", Column.Parameter(allTags));
updateRelationshipQuery.Where("Id").IsEqual(Column.Parameter(entityId));
updateRelationshipQuery.Execute(executor);
}
return true;
И последнее, после публикации данных схем необходимо заполнить колонку "Keywords" публичными тегами для уже существующих записей базы знаний следующим скриптом:
UPDATE KnowledgeBase
SET Keywords = ISNULL(res.Tags, '')
FROM (SELECT a.Id, Tags = (SELECT stuff((
select ', ' + Name from (SELECT t.Name FROM KnowledgeBaseTagV2 t WHERE
t.TypeId = 'D6FB4DE6-0809-41FE-A84F-6D245CBC5F32'
and t.Id
IN (
SELECT e.TagId FROM KnowledgeBaseInTagV2 e WHERE e.EntityId = a.Id
)
) tb FOR XML PATH('')), 1, 2, ''))
FROM KnowledgeBase a
GROUP BY a.Id) res
WHERE res.ID = KnowledgeBase.Id
Где 'D6FB4DE6-0809-41FE-A84F-6D245CBC5F32' идентификатор типа "публичный тег".
Необходимые условия
Версия приложения со страницей портального пользователя и базовой схемой KnowledgeBaseSearchModule.