我有一個「促銷」小部件,它包裝內置的通用頁面查看器Web部件。編輯可以將促銷小部件添加到他們的頁面以鏈接到該網站中的任何其他頁面。它們添加的促銷小部件將使用鏈接頁面的名稱和該頁面的預告圖像進行呈現。如何編寫轉換以支持多種不同的頁面類型?
窗口小部件被配置爲顯示Path字段,以便編輯可以選擇他們正在提升的頁面,並將TransformationName字段的默認值設置爲「CMS.MenuItem.Promo」。 TransformationName
字段被標記爲不可編輯。
我真的很希望編輯能夠在網站的任何頁面上指向他們的促銷小部件,而不必擔心他們指向的節點類型,所以我想讓CMS .MenuItem.Promo轉換支持任何頁面類型。
我的想法是添加自定義的轉換方法,如:
namespace CMS.Controls
{
public partial class CMSTransformation
{
public string GetTeaser()
{
TreeNode node = this.get_the_current_node_somehow...();
Page page = new PageFactory().GetPage(node);
return page.GetTeaserRelativeURL();
}
然後我可以只包括在改造下面,編輯就不需要關心他們有什麼類型的節點:
<img src="<%# GetTeaser() %>" />
我已經有PageFactory
設置和工作(它使用一些其他的代碼) - 它是所有開關node.ClassName
並返回一個新的頁面對象:
public Page GetPage(TreeNode node)
{
switch (node.ClassName)
{
case CMS_Event.PageType:
return new CMS_Event(node);
case CMS_MenuItem.PageType:
return new CMS_MenuItem(node);
// etc
例如CMS_MenuItem就是:
public class CMS_MenuItem : Page
{
public const string TeaserField = "MenuItemTeaserImage";
private readonly TreeNode node;
public CMS_MenuItem(TreeNode node)
{
this.node = node;
}
public override string GetTeaserRelativeURL()
{
var guid = node.GetValue<Guid>(TeaserField, Guid.Empty);
return AttachmentURLProvider.GetAttachmentUrl(guid, node.NodeAlias);
}
是否有可能得到一個變換方法裏面TreeNode
對象?如果是這樣,我可以使用我現有的代碼來獲取預告片圖像,而不管我有什麼節點類型。
如果在轉換方法中無法獲得TreeNode
,那麼無論當前頁面類型如何,都可以使用最簡潔的方式獲取字段?
我知道GetNotEmpty()
和GetColumnName()
轉換方法,但每次嘗試並獲取字段時都必須傳遞12個列名的列表,這似乎相當醜陋。
感謝您的回答鮑里斯,這聽起來像它應該工作 - 但它似乎像我的宏沒有在TransformationName字段中被調用。我在我的CustomMacros.cs中添加了一個Utils.PageType()。我使用宏上的斷點將Visual Studio調試器附加到站點。如果我在頁面中包含「{%Utils.PageType()%}」,那麼會觸發該斷點,但是如果我呈現包含變換名稱「{%Utils.PageType()%} Promo」的窗口小部件,沒有命中。所以它看起來像TransformationName字段中的宏沒有被調用? – George
我也嘗試將TransformationName設置爲「{%classname%}。Promo」,並且當我將通用頁面查看器指向事件時,不會調用現有的CMS.Event.Promo轉換。 – George
如果我沒有記錯,必須將宏設置爲給定字段的默認值,並且該字段不能被編輯器編輯。否則,這將是一個安全漏洞,如果在編輯器可訪問的字段上解析宏。 –