Создайте UserControl для отображения списка DocumentType в Umbraco 4.1 - PullRequest
2 голосов
/ 14 июля 2010

Я новичок в Umbraco и мне это до сих пор нравится, я понимаю, как это работает, но я хотел бы знать, как и как лучше всего создать пользовательские контролы, которые отображают некоторую информацию из базы данных umbraco?Когда все просто, я делаю это с шаблоном XSL, но теперь мне нужно больше возможностей.

Я пытаюсь создать UC, который подключается к базе данных Umbraco, получает все документы documentType "NewsItem" и перечисляет их вмой UC.

Я нашел это сообщение: Umbraco: список дочерних узлов в пользовательском управлении , но это не совсем так, поскольку я не хочу жестко кодировать идентификатор узла, я хочу найти свои новостив зависимости от DocumentType.

Я теперь, когда есть API для доступа к данным Umbraco, но не нашел никакого примера.Я также смотрю много видео на umbraco.tv, но до сих пор не знаю, как лучше всего это сделать.Существует также LINQ to Umbraco (http://our.umbraco.org/wiki/reference/api-cheatsheet/linq-to-umbraco), но не уверен, что это хороший способ сделать это.

Кроме того, есть ли способ проверить Usercontrol внутри другого WebProject? Что я имею в виду, чтобыподключиться к базе данных Umbraco в другом проекте, чтобы вам не приходилось заходить на сайт umbraco, чтобы проверить его?

Большое спасибо!

1 Ответ

4 голосов
/ 15 июля 2010

В вашем вопросе есть несколько областей, на которые я постараюсь ответить по одному.

  1. Использование umbraco.presentation.nodefactory для получения узлов определенного типа. В этом примере я предполагаю, что все ваши NewsItems являются дочерними элементами определенного узла в этом случае с идентификатором узла 1024.

    using umbraco.presentation.nodeFactory;
    
    namespace cogworks.usercontrols
    {
        public partial class ExampleUserControl : System.Web.UI.UserControl
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                var specificNode = new Node(1024);
                var childNodes = specificNode.Children;
    
                foreach(var node in childNodes)
                {
                    if(node.NodeTypeAlias == "NewsItem")
                    {
                        //Do something with your NewsItem node!
                    }
                }
            }
        }
    }
    

Это, вероятно, не самый эффективный способ, но, к примеру, все в порядке.

  1. Пример рекурсивного обхода дерева узлов и добавления найденных узлов в список:

    public static List<Node> SelectChildrenByNameRecursive(Node node, string docType)
    {
        var nodes = new List<Node>();
    
        foreach (Node child in node.Children)
        {
            FindChildrenByDocType(child, docType, ref nodes);
        }
    
        return nodes;
    }
    
    private static void FindChildrenByDocType(Node node, string docType, ref List<Node> nodes)
    {
        if (node.NodeTypeAlias == docType)
        {
            nodes.Add(node);
        }
    
        foreach (Node childNode in node.Children)
        {
            FindChildrenByDocType(childNode, docType, ref nodes);
        }
    }
    

Опять просто пример кода ...

  1. Тестируя Umbraco, вам всегда нужно будет работать в экземпляре Umbraco, поскольку nodefactory - это API поверх кэша содержимого памяти.

  2. Дополнительная литература

http://blog.hendyracher.co.uk/umbraco-helper-class/

http://our.umbraco.org/wiki/how-tos/useful-helper-extension-methods-(linq-null-safe-access)

...