Tridion和REL:更新页面内的页面文件名';杜尔酒店

Tridion和REL:更新页面内的页面文件名';杜尔酒店,tridion,odata,tridion-2011,tridion-content-delivery,Tridion,Odata,Tridion 2011,Tridion Content Delivery,我们有一个要求,页面的url需要本地化/翻译。我们现有的机制依赖于实际发布的url通过oData检索页面。用一个简化的例子来说明:我们在前端有一些逻辑,它接受请求url(没有文件扩展名,附加了.html扩展名,例如: /my-awesome-path/my-awesome-page 现在变成 /my-awesome-path/my-awesome-page.html 然后,逻辑使用查询从oData中提取页面 /odata.svc/Pages?$filter=url eq '/my-aweso

我们有一个要求,页面的url需要本地化/翻译。我们现有的机制依赖于实际发布的url通过oData检索页面。用一个简化的例子来说明:我们在前端有一些逻辑,它接受请求url(没有文件扩展名,附加了.html扩展名,例如:

/my-awesome-path/my-awesome-page
现在变成

/my-awesome-path/my-awesome-page.html
然后,逻辑使用查询从oData中提取页面

/odata.svc/Pages?$filter=url eq '/my-awesome-path/my-awesome-page.html'
我们有更多的逻辑来解析这个SEO友好的url,并获取MVC控制器函数参数和其他诸如此类的东西,但这与这里无关

我们的要求是,我们不能本地化页面以提供一个经过翻译的url,因为这意味着整个页面无法在父web出版物中管理

要获得指向页面文件名的本地化路径,我们只需将SGs本地化。困难在于页面文件名。在页面元数据上,我们有一个链接的“可本地化元数据”组件,该组件带有一个用于提供本地化页面文件名的字段

我们要做的是在发布/部署过程中更新页面的URL属性,以使用此链接元数据组件中的本地化页面文件名更新页面的已发布URL(假设我们在发布开始到部署承诺之间的任何阶段都可以访问本地化文件名字段的值)

我曾尝试通过自定义解析程序执行此操作,但是在这个级别上,似乎page.PublishedUrl属性已由CM建立,无法重写。因此更新page.FileName属性没有任何用处

我还尝试将Broker DB中PAGE表中的URL列直接更新为其他名称,但似乎一切都在继续工作,包括动态链接和取消发布页面。显然,编写存储扩展或部署器扩展以通过jdbc直接更新DB是不可接受的

以下是我正在考虑的选项: 1) 尝试部署器扩展并使用TridionAPI更新url属性 2) 尝试编写一个自定义呈现程序,执行url替换逻辑,而不实际更新代理中的url。我不赞成这样做,因为每次都需要请求时间处理


我的问题是:更新页面url属性最合适的方法是什么?编写一个使用Tridion API更新URL属性的自定义部署程序是否会像解析程序那样让我陷入死胡同?

也许是另一种选择:

存储本地化URL为页面提供了一个额外的元数据字段,为已发布页面保留相同的物理URL

我知道您的要求是避免子页面本地化,我喜欢wordpress中全局输入URL工作方式的方式,例如:

/mysite/
%postname%
/

在SDL Tridion中构建类似的东西会很酷,在SDL Tridion中可以提取内容标题并在内容URL中使用


无论哪种方式,如果您必须编写一个系统,该系统采用“友好URL”并查找实际URL,我认为这将非常简单。

根据Nuno上述评论中的要点,我决定不使用自定义部署器,并使用事件系统的两个事件订阅解决了此问题。在页面发布中,我首先本地化页面,从本地化链接元数据组件中获取本地化文件名并保存页面。然后在随后的事件中,我只需解除页面的定位。这是我的工作代码:

[TcmExtension(“发布或取消发布事件”)]
公共类PublishOrUnpublishEvents:TcmExtension
{
公共出版物或非出版物事件()
{
订阅(SetLocalizedPageFileName,EventPhases.Initiated);
订阅(UnlocalizePageOncePublished,EventPhases.Initiated);
}
public void SetLocalizedPageFileName(第页,PublishEventArgs参数,事件阶段)
{
字符串localFilename=GetLocalizedFileNameFromPageMetadata(第页);
如果(!string.IsNullOrEmpty(localFilename))
{
page.Localize();
如果(page.TryCheckOut())
{
page.FileName=本地文件名;
page.Save(true);
}
}
}
public void UnlocalizePageOncePublished(第页,SetPublishStateEventArgs参数,事件阶段)
{
字符串localFilename=GetLocalizedFileNameFromPageMetadata(第页);
如果(!string.IsNullOrEmpty(localFilename))
page.unlocize();
}
私有字符串GetLocalizedFileNameFromPageMetadata(第页)
{
string localFilename=string.Empty;
如果(page.Metadata!=null)
{
ItemFields=新的ItemFields(page.Metadata,page.MetadataSchema);
if(fields.Contains(“LocalizableMeta”))
{
ComponentLinkField localMetaField=字段[“LocalizableMeta”]作为ComponentLinkField;
Component=localMetaField.Value;
ItemFields compFields=新的ItemFields(component.Content、component.Schema);
if(compFields.Contains(“LocalizedPageFilename”))
{
SingleLineTextField fileNameTextField=compFields[“LocalizedPageFilename”]作为SingleLineTextField;
localFilename=fileNameTextField.Value;
}
}
}
返回localFilename;
}
}

谢谢你的建议,约翰。然而,我应该提到的另一个要求是,我们必须不超过1次odata点击才能获得页面。将其保存在custommeta中需要对CustomMetas实体进行一次点击,然后对Pages实体进行另一次点击。我们希望避免这种情况,并且只使用我们可以筛选的参数。我认为您可能需要在部署人员端执行此操作。YouC