Как получить список предварительного просмотра запроса в коде | Сад 1.7

В CMS есть настраиваемый тип контента «SideBarLinks». Я создал запрос, чтобы получить список элементов этого типа: «SideBarLinks», а также указал критерии сортировки и фильтрации. Это отлично работает при предварительном просмотре результатов запроса в CMS.

Есть ли способ получить тот же список в коде, скажем, в методе Action любого контроллера? Какой класс/услуги Orchard нужно запрашивать? И как выполнить всю эту фильтрацию, сортировку результатов запроса в методе контроллера?

До сих пор я запрашивал элементы контента, используя приведенные ниже коды, на которые я ссылался через блоги и другие форумы. Полная заслуга перед ними. Кажется, это инициализирует IOrchardServices и с помощью этой службы получает элементы.

public IOrchardServices Services { get; private set; }
public AdminController(IOrchardServices services, IShapeFactory shapeFactory) {
        Services = services;

        T = NullLocalizer.Instance;
        Logger = NullLogger.Instance;
        Shape = shapeFactory;
    } 

Это метод действия:

public ActionResult List(int id) {
            List<ContentItem> query = Services.ContentManager.GetAllVersions(id).ToList();
            if (!query.Any()) {
                return HttpNotFound();
            }

            return View(query);
        } 

Как получить элементы, специфичные для запроса?


person D Simm    schedule 09.10.2015    source источник


Ответы (2)


Это довольно широкий вопрос. Я бы определенно сказал, что лучше всего начать с исходного кода, ответ почти всегда находится в исходном коде.

Но вот идет. Первое, что вам нужно, это контент-менеджер.

private readonly IContentManager _contentManager;
public MyController(IContentManager contentManager) {
    _contentManager = contentManager;
}

Чтобы получить список определенного типа контента

_contentManager.Query(VersionOptions.Published, "SideBarLinks").List();

Чтобы получить список элементов контента по определенной части

_contentManager.Query<UserPart, UserPartRecord>().List();

Чтобы получить список и отфильтровать его

_contentManager.Query<UserPart, UserPartRecord>().ForVersion(VersionOptions.Latest).Where(e => e.UserName = "Bob").List();

Чтобы отфильтровать по другой части

_contentManager.Query<UserPart, UserPartRecord>()
    .Join<CommonPartRecord>()
    .Where(e => e.CreatedUtc > DateTime.Now.AddDays(-1))
    .List();

Чтобы загрузить больше данных во время запроса, которые нам понадобятся позже для отображения

_contentManager.Query<UserPart, UserPartRecord>()
    .WithQueryHints(new QueryHints().ExpandParts<ExtraUserPart>())
    .List();

Я думаю, что хорошее понимание того, как работает Orchard, важно для построения запросов. Orchard — очень ленивая система, она просто не пойдет и не присоединится к таблицам записей, если ей об этом не скажут. А благодаря тому, что он может хранить часть (если вы скажете) и данные полей в XML, если вам не нужно фильтровать или упорядочивать ваши данные, вам не нужно ни о чем беспокоиться, в Orchard есть все данные, которые вам нужны. . Если у вас есть данные, хранящиеся в классах записей, к которым вы хотите получить доступ позже, Orchard придется лениво загружать их позже, что приведет к большему количеству запросов к базе данных и серьезной потере производительности.

person Hazza    schedule 09.10.2015
comment
Я не думаю, что это то, что он имеет в виду. Вероятно, он имеет в виду что-то вроде _projectionManager.GetContentItems(queryId) - person devqon; 09.10.2015
comment
Спасибо Хазза. Приношу свои извинения, если это был очень расплывчатый/широкий вопрос. В следующий раз будет включать как можно больше деталей. - person D Simm; 12.10.2015
comment
Мое требование было добавлено, чтобы получить элементы по типу имени/содержимого. Ваш образец кода сработал для меня. Спасибо за помощь. Будет ссылаться на код, а также на правильное указание @devqon - person D Simm; 12.10.2015

Если вы хотите получить элементы контента, связанные с определенным запросом на панели инструментов, вы можете сделать следующее:

ввести проекционный менеджер:

private readonly IProjectionManager _projectionManager;
public MyController(IProjectionManager projectionManager) {
    _projectionManager = projectionManager;
}

получить элементы контента по конкретному запросу:

var contentItems = _projectionManager.GetContentItems(someQueryId);

Если вы взглянете на Orchard.Projections/Controllers/AdminController, вы увидите здесь действие предварительного просмотра:

public ActionResult Preview(int id) {
    if (!Services.Authorizer.Authorize(Permissions.ManageQueries, T("Not authorized to manage queries")))
        return new HttpUnauthorizedResult();

    var contentItems = _projectionManager.GetContentItems(id, 0, 20);
    var contentShapes = contentItems.Select(item => _services.ContentManager.BuildDisplay(item, "Summary"));

    var list = Shape.List();
    list.AddRange(contentShapes);

    return View(list);
}
person devqon    schedule 09.10.2015
comment
Спасибо devqon. Получение по идентификатору не было решением для моего проекта. Но ваше решение помогло мне понять, что такое Projection в Orchard, поскольку вы правильно указали мне на исходный код Projection/Queries. Спасибо !!! - person D Simm; 12.10.2015