2011-08-16 5 views
2

私のサイトには、顧客が購入しているアイテムを一覧表示するチェックアウトページがあります。基本リストの下には、詳細インボイスセクションがあり、それぞれの情報を見ることができます。今まで私は購入できる2種類のアイテムしか持っていなかったので、詳細なリストはかなり扱いやすいものでした。今では購入可能な4つの全く別のものを追加しています。だから質問:Sitecoreのサブレイアウトを使ってこの種のレンダリングを処理する良い方法は何ですか? (現在、私はリピータを使用し、適切なフィールドを表示/非表示にします)任意の数の異種アイテムをレンダリングする最良の方法は?

良いニュースは、注文の各広告申込情報に関連するSitecoreアイテムインスタンスがあることです。 Sitecore APIがオブジェクト指向の方法に適している場合は、問題のオブジェクトタイプごとにRender()メソッドを作成することがあります。もちろん、それぞれSitecore.Data.Items.Itemオブジェクトです。サブクラス項目?これはちょうどこの仕事のための過剰なもののようです...

私が考えてきたことは、それぞれの異なるアイテムタイプのサブライナ/ユーザーコントロールです。そしてそれらを動的に請求書ページのプレースホルダに追加します。これは合理的なようだ...思考?下側は、ユーザーコントロールをアイテムとマッチさせなければならない醜いコードです... TemplateIDに基づいていますか?

とにかくここにいくつかの提案を探しています。

答えて

2

Sitecoreデータを表すクラスを作成することは、不合理な考えではありません。これはそれを行うための完璧なシナリオです。プロジェクトをビルドするときはいつでも、テンプレート固有のフィールドアクセスが必要な場合に備えて、私は常にCustom Item Generatorを使ってクラスを生成しています。私はあなたのジレンマを見ることができるように、すべてをサブレイアウトとして行います。

フィールドのすべて/ほとんどが各製品固有のものですか?各製品インスタンスが使用する汎用製品テンプレートはありませんか?

これらは、(IMO最高に最悪の)私は自分自身の考えることができるオプションは以下のとおりです。

  1. がそれぞれ独自のテンプレートを表すクラスを作成します。 Custom Item Generatorが動作する可能性がありますが、初めて混乱させる可能性があります。 Sitecoreアイテムをコンストラクタに渡し、フィールドにアクセスするためのプロパティを作成する独自のクラスをいつでも作成できます。次に、通常の.NETコントロールを使用して、アイテムが使用するテンプレートに基づいてフロントエンドにデータをバインドし、テンプレートに対して強タイプのクラスを使用します。これはおそらく多くのif-elseの乱雑なコードになります。

  2. Sitecoreのユニークなテンプレートごとに一意のサブレイアウトを作成します。リピータでアイテムをループするアイテムに基づいて、アイテムのテンプレートに基づいて、new Sublayout()を使用してプレースホルダに適切なサブレイアウトを追加し、DataSourceをSitecoreアイテム(ここではcode to access the DataSource)に設定します。そうすることで、各固有のテンプレートに実装を抽象化することができます。

  3. #1で述べたように、テンプレートごとにクラスを作成しますが、すべてをインターフェイスで抽象化します。リピータのItemDataBoundでは、インターフェイス経由でデータを実装します。これは、フィールドの比較方法とテンプレートとの比較に大きく依存します。独自のフィールドをインターフェイスのメンバーに減らすように強制することができれば、テンプレートを表す各クラスはインターフェイスを実装するだけで済みます。これにより、インターフェイスを実装し続ける限り、独自のテンプレートを将来追加することができます。

+0

オプション#2の場合は、標準のUserControlではなく新しいSublayout()を使用しますか? Sitecoreは私にここで何かを買うつもりですか?私の腸は、内部論理の一部(黒い魔法?)が私から隠されているので、それはもっと障害になると私に言う。 – Bryan

+0

Sublayoutを使用している場合、実際のSitecoreアイテムをそのデータとともに 'DataSource'として渡すことができます(これをC#経由でアクセスする方法に関するリンクを提供しています)。通常のユーザーコントロールとして、特定のアイテムにどのようにアクセスしますか?私たちは文脈項目についてここでは話しません、そうですか?我々は、特定の項目化された詳細項目について話している。 –

+0

ああ、OK。私は通常、アイテムのプロパティをコントロールに追加して、リピーター内のアイテムのリストまたは配列をバインドし、Item = <%#Container.DataItem%>のようなテンプレートに設定できます。そうすれば、それは他のSitecoreコントロールと一致します。 – Bryan

1

これは、「コントロールのプレゼンテーション反転」Sitecoreパターン(Aware Webの名前)を使用するのに適しているようです。

http://www.awareweb.com/AwareBlog/Presentation%20Inversion%20of%20Control%20part%202.aspx

ブログの記事は、ユーザーが置かれた項目のコンテキストでこの多くの議論が、それはここにも動作します。各製品タイプのテンプレートがある場合は、カート内のアイテムをレンダリングできるコントロールを定義するそれぞれのプレゼンテーションの詳細を(おそらく別のデバイスに)定義できます。次に、アイテムからRenderingReferenceを読み込んで、ページに配置することができます。これにより、さまざまなタイプの製品に対して異なる出力を処理できる、柔軟で拡張可能なシステムが実現します。

これは、説明したソリューション(製品タイプごとにサブラインアウト)に近いですが、サブレイアウトをTemplateIDごとに条件付きロジックの代わりにデータ駆動することができます。 (プレゼンテーションの詳細にもダミーの「メインレイアウト」を割り当てる必要があります)。

+0

これは面白いです...リンクのおかげで! – Bryan

関連する問題