Composite C1:如何让页面树显示UrlTitle而不是Title(解决方案)

Composite C1: How to make the page tree to display UrlTitle instead of Title (Solution)

当 Composite C1 在内容透视图中显示站点和页面树时,它使用页面标题 属性 作为节点标签。这并不总是很舒服,尤其是当页面被翻译成不同的文化时,所以您甚至无法阅读这些标题并快速找到您要查找的页面。 这个想法是使用 UrlTitle 作为标签,所以每个树节点都代表页面的一部分 URL。 请参阅下面的解决方案。

我不想重新编译程序集,所以我的 hack 很丑,但只影响 javascript 和 aspx。

  1. 编辑/Composite/scripts/compressed/top.js.

    在那里找到 SystemTreeNodeBinding.prototype.onBindingAttach=function(){ 并在此函数的开头注入以下代码:

    if(window.treeNodeProcessor)window.treeNodeProcessor(this.node);
    

    现在您可以在显示之前修改树节点;你只需要创建你的全局函数 treeNodeProcessor.

  2. 编辑/Composite/top.aspx(top.aspx.cs也受影响,一起保存)。

    head 元素的末尾添加 javascript:

    <script type="text/javascript">
        function byKey(key) {
            return function(p) {
                return p.Key == key;
            }
        }
    
        window.treeNodeTitles = {
    <% WriteTreeNodeTitles(); %>
            "": ""
        };
    
        window.treeNodeProcessor = function(node) {
            if(node._data.PropertyBag) {
                var uri = node._data.PropertyBag.find(byKey('Uri')).Value;
                node._data.Label = window.treeNodeTitles[uri] || node._data.Label;
            }
        }
    
    </script>
    

    不幸的是,传递给 treeNodeProcessornode 对象中没有 UrlTitle。但是,每个页面 node 都有 PropertyBag 存储一个值,如 ~/page(a9d30645-02f7-4412-bd4e-6f3a02782481) ]乌里。因此,您必须自己查询 UrlTitle,WriteTreeNodeTitles 方法中的内容(见下文)。

  3. 编辑/Composite/top.aspx.cs.

    添加新方法:

    protected void WriteTreeNodeTitles()
    {
        using (var conn = new DataConnection())
        {
            foreach( string line in conn.Get<IPage>().Select( p => "            \"~/page(" + p.Id.ToString().ToLower() + ")\": \"" + p.UrlTitle + "\",\r\n" ) )
            {
                Response.Write( line );
            }
        }
    }
    

    当然,你必须添加一些用法:

    using System.Linq;
    using Composite.Data;
    using Composite.Data.Types;
    

因此,现在您的 top.aspx 包含页面 guid 类 url 到 UrlTitles 的映射,以及使用该映射修改页面树的 treeNodeProcessor 函数。