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。
编辑/Composite/scripts/compressed/top.js.
在那里找到 SystemTreeNodeBinding.prototype.onBindingAttach=function(){
并在此函数的开头注入以下代码:
if(window.treeNodeProcessor)window.treeNodeProcessor(this.node);
现在您可以在显示之前修改树节点;你只需要创建你的全局函数 treeNodeProcessor
.
编辑/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>
不幸的是,传递给 treeNodeProcessor
的 node
对象中没有 UrlTitle。但是,每个页面 node
都有 PropertyBag
存储一个值,如 ~/page(a9d30645-02f7-4412-bd4e-6f3a02782481) ]乌里。因此,您必须自己查询 UrlTitle,WriteTreeNodeTitles 方法中的内容(见下文)。
编辑/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 函数。
当 Composite C1 在内容透视图中显示站点和页面树时,它使用页面标题 属性 作为节点标签。这并不总是很舒服,尤其是当页面被翻译成不同的文化时,所以您甚至无法阅读这些标题并快速找到您要查找的页面。 这个想法是使用 UrlTitle 作为标签,所以每个树节点都代表页面的一部分 URL。 请参阅下面的解决方案。
我不想重新编译程序集,所以我的 hack 很丑,但只影响 javascript 和 aspx。
编辑/Composite/scripts/compressed/top.js.
在那里找到
SystemTreeNodeBinding.prototype.onBindingAttach=function(){
并在此函数的开头注入以下代码:if(window.treeNodeProcessor)window.treeNodeProcessor(this.node);
现在您可以在显示之前修改树节点;你只需要创建你的全局函数
treeNodeProcessor
.编辑/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>
不幸的是,传递给
treeNodeProcessor
的node
对象中没有 UrlTitle。但是,每个页面node
都有PropertyBag
存储一个值,如 ~/page(a9d30645-02f7-4412-bd4e-6f3a02782481) ]乌里。因此,您必须自己查询 UrlTitle,WriteTreeNodeTitles 方法中的内容(见下文)。编辑/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 函数。