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