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

时间:2016-06-17 15:09:25

标签: c1-cms

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

1 个答案:

答案 0 :(得分:0)

我不想重新编译程序集,所以我的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>
    

    不幸的是,传递给node的{​​{1}}对象中没有UrlTitle。但是,每个页面treeNodeProcessor都有node,用于在 Uri 〜/ page(a9d30645-02f7-4412-bd4e-6f3a02782481)之类的值>。所以,你必须自己查询UrlTitle,在WriteTreeNodeTitles方法中做了什么(见下文)。

  3. 修改 /Composite/top.aspx.cs

    添加新方法:

    PropertyBag

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

    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 );
            }
        }
    }
    
  4. 所以,现在你的top.aspx包含了类似于页面guid的url到UrlTitles的映射,以及使用该映射来修改页面树的treeNodeProcessor函数。