0

更新: バートランドの提案と私自身の調査結果に基づいて、元の質問を大幅に変更しました。今では、完全に間違っていた私自身の盲目的な蛇行とオーチャードに関する解説の代わりに、そのテキストで不完全な解決策を提供しています!

テキストの代わりに画像を使用したメニュー、1 つの標準、およびホバー/選択時の別のメニューを表示する必要があります。サイトの要件には、エンドユーザーがメニュー項目の画像を管理できる必要があると記載されています。標準のナビゲーション モジュールは HTML メニュー項目を提供するようになりましたが、これはエンド ユーザーが望んでいるものではありません。顧客は、サイトの多くのメニューを構成するための非常にシンプルで直感的なインターフェイスを望んでおり、すべてのメニューは画像ベースです。

バートランドのアドバイスに基づいて、コンテンツ メニュー項目がコンテンツ タイプであることを認識した後、管理インターフェイスに新しいコンテンツ パーツを作成しました (コードではなく、最終的に必要になったときにパーツとコンテンツ タイプのコードを書きたいだけです..管理インターフェイスとテンプレート/CSS を使用するだけで、Orchard をどこまで使用できるかを実際に確認したいと考えています)。

そこで、2 つのコンテンツ ピッカー フィールド (イメージとホバー イメージ) を追加したメニュー イメージ パーツを作成しました。次に、この部分をコンテンツ アイテムの管理インターフェイスのコンテンツ メニュー アイテムに追加しました。

そのためのドライバーを作成していないため、メニュー項目テンプレートに渡されたモデルには、@Model.Href のような簡単にアクセスできるプロパティがありません。これまでのところ、次のコードで MenuItemLink-ContentMenuItem.cshtml をオーバーライドしました。 :

@using Orchard.Core.Common.Models
@using Orchard.ContentManagement
@{
    var contentManager = WorkContext.Resolve<IContentManager>();
    var itemId = Model.Content.ContentItem.ContentMenuItemPart.Id;
    ContentItem contentItem = contentManager.Get(itemId);
    ContentField temp = null;
    var menuImagePart = contentItem.Parts.FirstOrDefault(p => p.PartDefinition.Name == "MenuImagePart");
    if (menuImagePart != null)
    {
        temp = menuImagePart.Fields.First();
    }
}

<span>@temp</span>
<a href="@Model.Href">@Model.Text</a>

これにより、リンク内のメニューに期待されるタイトルが生成され、その前に次のテキストがスパンされます。

Orchard.Fields.Fields.MediaPickerField 

したがって、上記のすべてのコード (現在のコンテンツ マネージャーと ContentMenuItemPart を表す ContentItem の ID を取得し、コンテンツ マネージャーを使用して ContentItem 自体を取得し、そのパーツを linqing して MenuImagePart を見つけます (Get を使用して取得することはできません)タイプが必要であり、MenuImagePart はタイプではないため、管理インターフェイスで作成されたものです)、最後にデバッグ目的で最初のフィールドを取得します(これは、作成した MenuImagePart の Image フィールドである必要があります...)。 ..上記のすべてのコードにより、実際にMeny Image Partのメディアピッカーフィールドにアクセスできました...

MediaPickerField URL プロパティを読み取る方法を見つけることは、私ができないことであり、確かに私を非常に鈍感で愚かにしていることです。MediaPickerField にキャストしようとしましたが、上記のテンプレート コード内から名前空間にアクセスできません。次のディレクティブを追加できるようにするために、テーマにどの参照を追加すればよいかさえわかりません。

@using Orchard.Fields.Fields

4

1 に答える 1

2

私はついにこの仕事に成功しました (Bertrand の指示のおかげです)。

更新: また、Bertrand のおかげで、循環して実行されていたソリューションが洗練され、モデルで既に利用可能になったときにコンテンツ マネージャーからコンテンツ アイテムをクエリするようになりました...現在、コンテンツ アイテムの動的な性質などを活用しています。 . そして、私は最終的にこのソリューションに満足しています.

Menu Image という名前の新しいコンテンツ パーツを作成し、これを Content Item Menu という名前のコンテンツ タイプに追加し、最後に Content Item Menu テンプレートをオーバーライドする必要がありました。この最後の部分は本当にトリッキーなものでした。バートランドの指示がなかったら、次のコードは臭くて気が遠くなるようなものになっていたでしょう。テンプレートは次のようになりました。

@using Orchard.Utility.Extensions;
@using System.Dynamic
@{

/* Getting the menu content item
***************************************************************/

var menu = Model.Content.ContentItem;

/* Creating a unique CSS class name based on the menu item
***************************************************************/

// !!! for some reason the following code throws: 'string' does not contain a definition for 'HtmlClassify'
//string test = menu.ContentType.HtmlClassify();
string cssPrefix = Orchard.Utility.Extensions.StringExtensions.HtmlClassify(menu.ContentType);
var uniqueCSSClassName = cssPrefix + '-' + Model.Menu.MenuName;

/* Adds the normal and hovered styles to the html if any
***************************************************************/

if (menu.MenuImagePart != null)
{

    if (!string.IsNullOrWhiteSpace(menu.MenuImagePart.Image.Url))
    {
    using(Script.Head()){
    <style>
        .@uniqueCSSClassName {
            background-image: url('@Href(menu.MenuImagePart.Image.Url)');
            width: @{@menu.MenuImagePart.Image.Width}px;
            height: @{@menu.MenuImagePart.Image.Height}px;
            display: block;
        }
    </style>
    }
    }
    if (!string.IsNullOrWhiteSpace(menu.MenuImagePart.HoverImage.Url))
    {
    using(Script.Head()){
    <style>
        .@uniqueCSSClassName:hover {
            background-image: url('@Href(menu.MenuImagePart.HoverImage.Url)');
            width: @{@menu.MenuImagePart.HoverImage.Width}px;
            height: @{@menu.MenuImagePart.HoverImage.Height}px;
        }
    </style>    
    }
    }
}
}    
<a class="@uniqueCSSClassName" href="@Model.Href">@Model.Text</a>

私が理解できなかった唯一のことは、HtmlClassify を拡張メソッドとして使用できずmenu.ContentItem.HtmlClassify()、メソッドを標準の静的メソッドとして呼び出すことに頼らなければならない理由です (コメント `// !!! のある行を参照してください)。次のコードがスローする理由'...)

バートランドに再び感謝します!

于 2012-09-17T08:31:33.033 に答える