2014-03-05 44 views
0

我試圖有條件地從其驅動程序中取消部件。我基本上有邏輯,如果遇到,應該顯示小部件,如果沒有,應該抑制它。該小部件從當前頁面內容項加載屬性,並基於某些屬性顯示或隱藏。我有所有的邏輯工作,唯一剩下的部分是壓制實際輸出。Orchard CMS有條件地隱藏小部件並取消區域

我試着返回null從司機,然而,這只是輸出一個空的小部件(其包裝)。我如何從視圖中完全刪除小部件?

最後,如果沒有任何條件小部件顯示,則此小部件所在的區域應該禁止。

這種類型的靈活性可能在果園嗎?最好從我的自定義模塊不是我的主題,我試圖從樣式中分離功能。

編輯:

這裏是我的情況,我試圖完成的上下文。我確信在Orchard內部有一種更簡潔的方式,比我天真地設計第一個復飛:我的客戶的撰稿人標籤頁(他們認爲合適)(使用標籤模塊/部分)。我已經創建了2個自定義內容類型,「推薦」和「優惠」,這兩種自定義內容類型都包含其他屬性中的標籤[這些由不同的撰稿人團隊管理]。

在網站的最「內頁」(我用一個層來確定合適的頁面),頁面的側邊欄得到一個「推薦」窗口小部件和「要約」窗口小部件。這些部件都運行相同的應用,但互不影響:

他們抓取當前頁面的標籤,然後拉一個隨機[見證|報價]有任何匹配的標籤爲好。有4種情況可以在給定任何內部頁面的情況下發生:顯示證言並且報價被隱藏(證言標籤匹配,報價標籤沒有),證言被隱藏並且報價被顯示,證言和報價顯示,最後都不顯示。前3個用例運行良好,第4個是我遇到的困難,因爲即使這兩個小部件都沒有(從它們各自的驅動程序返回null),邊欄[區域]仍然顯示。

+0

這正是圖層所做的。創建一個圖層,拋出顯示或隱藏小部件的規則,完成。 –

+0

我無法在圖層中包含邏輯,顯示的邏輯位於窗口小部件中(基於它所坐的當前頁面的屬性)。這是所有的工作(意味着小部件正確執行對邏輯,如果不符合,正確「隱藏」(從驅動程序返回null)。一個圖層可能有多個「條件」小部件。它應該仍然顯示,如果1小工具是顯示/活動,但如果所有小部件子項都不顯示,則摺疊 要進一步說明,請參閱 – MikeAtCodeSmart

+0

爲什麼不能在邏輯層中包含圖層規則?完全是*設計了哪些圖層。 –

回答

2

有關小部件的上下文:小部件應該是在網站的一些或全部頁面上可見的內容片段,並且提供的信息與頁面上的主要內容項目不直接相關(如果有這樣的事情)。

因此,您所描述的內容不應該作爲小工具來實現(所有必須做的事情才能使其工作證明更進一步),因爲它們確實是內容項的一部分。相反,你應該已經實現了一個部分或一個字段。然後,您可以通過指定頂級區域,使用放置方式簡單地放置這部分區域的形狀:<place the_shape_name="/the_zone_where_you_want_it:1"/>

+0

嘿伯特蘭,我覺得很多,還在學習:)。你能詳細闡述一下實施這個的正確方法嗎?如何創建零件工作?我創建了一個部分(包括引用[body],作者[text]的推薦部分),以及一個推薦類型,以便他們可以創建他們的推薦。我無法將評價部分添加到頁面類型中,有些頁面共享相同的「評論」(具有相同的標籤),並且評論不一定耦合到頁面。小部件是用來連接證言和頁面的,但是,其他地方可能會使用證明。 – MikeAtCodeSmart

+0

爲什麼你不能將評價部分添加到頁面類型? –

+0

因爲推薦書沒有耦合到頁面。這不會迫使內容管理者在不同的頁面上創建許多重複的推薦書嗎?因此,對於有5頁的網站的「部分」,其中應該顯示1個隨機證明(比如說)10,這將迫使他們創建50個證明,5個重複的10個。對於X頁面的不同部分以及Y個褒獎池。 – MikeAtCodeSmart

0

不幸的是,我不得不使用一個黑客位,以便爲我是一個積極的期限下,我可以與移動項目,但如果有更好的方法和/或解決方案,我會作爲測試我有機會和標誌作爲答案。

爲了得到它的工作,我重寫了我的主題內的Widget.Wrapper.cshtml文件。在那裏,我給顯示器(Model.Child)調用分配了一個變量,如果結果是空字符串,只需返回。這將刪除任何空白的小部件包裝標籤。 (我個人覺得應該果園默認情況下,這樣的行爲):

var child = Display(Model.Child); 

// -- NOTE: shape tracing breaks this logic! 
if (string.IsNullOrWhiteSpace(child.ToString())) { 
    return; 
} 

然後只需用@(child)

更換頁眉和頁腳之間的@Display(Model.Child)我加入下面的方法來我Layout.cshtml文件。

Func<dynamic, IHtmlString> CollapsableZone = x => 
{ 
    var display = Display(x); 
    string zoneName = x.ZoneName; 
    if (string.Equals(display.ToString(), string.Format("<div class=\"zone zone-{0}\"></div>", zoneName.HtmlClassify()), StringComparison.CurrentCultureIgnoreCase)) 
    { 
     return new HtmlString(string.Empty); 
    } 
    return display; 
}; 

簡單的函數將顯示調用分配給變量,檢查它是否爲空區標記並返回。然後,我爲每個分配給上述函數值的區域創建變量。我將所有@if (Model.ZoneName != null)替換爲@if (!string.IsNullOrWhiteSpace(zoneVariable)),並用@(zoneVariable)替換呼叫@Zone(Model.ZoneName)

這是工作的暫時。這是一個相當黑客和脆弱的解決方案,但我不得不轉向其他事情。