再帰的なメニュースキーマを設計するには?


29

深さがあらかじめわかっていない階層メニューのコンテンツを格納するためのスキーマを定義したいとします。メニュー項目を単なるリンク/キャプションのペアにします。この構造体は自己完結型です。すなわち、ページ/構造体グループの階層に関連するではなく、であるため、メニュー項目に埋め込みスキーマを使用するのが妥当と思われます。

上記の音は理論的には聞こえますが、実際は少しトリッキーです。

  1. のMenuItem埋め込まれたスキーマを作成し、それが多値アイテムフィールド参照自体です作ってみました:ここに私が試したし、持っているものですUIはこの状況を認識しており、埋め込み可能なフィールド設定で利用可能なオプションから現在のスキーマを隠すため、これは最初から機能しませんでした。

  2. はMenuItemEvenとしてのMenuItemをクローン化し、それらをcrossreferenceしようとしました。 UI です。しかし、コンポーネント作成フォームは壊れているように見えます。スキーマを選択しても、それは何も表示されず、「通常の」埋め込み不可能なフィールドでもありません。 (スキーマ設計UIを破ることなく、これらのスキーマを完全に消滅させるためには、頭脳的な作業が必要です。最も簡単なのは、それぞれの "不可逆的な履歴ロールバック"です)。

  3. 唯一の選択肢は、レベルごとに専用の埋め込みスキーマを作成することでした。明らかに、これは、構造が無限の深さを持つことを可能にする初期条件を緩和すること(および再帰の考え方全体を捨てること)を必要とした。

埋め込まれたスキーマの再帰が許可されていない理由を直感的に、それは明らかだ。そこでも、このようなエンティティは、コンテンツレベルの「組み込みスキーマ」としてではない、とフィールドの全階層が最低の終了まで事前にインスタンス化されなければなりません。

しかし、Tridionで再帰スキーマが不可能な「公式の」理由はありますか? UIの制限だけではないですか? XML/XSDの欠点?

38

XSDはこれを可能にし、非常によく使用されるパターンです。 Tridion CME/FieldBuilderはそれを理解しませんので、カスタムスキーマとそのエディタを作成する必要があります。

これまでは、コンポーネントリンクを使用してこれを行っていました。定義したのと同じように階層を作成しますが、メニューの各エントリはコンポーネントで表され、子コンポーネントへのリンクがあります。

これは明らかに視覚的に表現するのが難しいため、この実装は、編集者が作成中のメニューの完全な階層を「見る」ことができるカスタムページで行われました。パブリッシュ時に、この階層は完全なナビゲーションツリーを持つ1つのXMLファイルに「フラット化」されました。

Tridion 2009以降では、メニュー構造を表すためにカテゴリとキーワードの階層を使用する方が良いかもしれません。

  0

おかげヌーノ、 これは、最終的な判決である:UIを介して.. 1.技術的には可能、しかし... 2.ありませんか? 20 2月. 132013-02-20 09:26:00

  0

実際、UIはXMLを理解しません。なぜなら、それは「Tridion Web Schema」に基づいていないからです。 20 2月. 132013-02-20 20:10:30

+3

+1 Tridion 2009以降のバージョンのメニュー構造を表すためにカテゴリおよびキーワード階層を使用することを提案します。このアプローチは非常に柔軟で、必要に応じてナビゲーション構造を構造グループ階層と異なるものにします。 07 3月. 132013-03-07 10:36:47


5

私はこのパターンを、ハンバーガーメニューからの「スライドアウト」タイプのナビゲーションで再び見ることができ、2つのフォローアップの考慮事項を提供することができます。

  1. ネストされたアイテムは、構造に基づいていない編集済み(手動で作成されたもの)ですが、既存のコンテンツに関連している可能性があります。したがって、コンポーネントの他のコンポーネントへのリンクだけでなく、も、これらのリンクを既存のページまたはコンポーネントに追加します。
  2. "flat"スキーマに、すべてのリンクが含まれているようにします。これは、階層を作成するときのテキストのインデント方法と似ています。
  3. 構造グループの代わりにフォルダを使用してください。
  4. コンポーネントプレゼンテーション
  5. コンポーネントからリンクされている各ページのページメタデータからリンクさ

    • コンポーネント:

第1のアプローチは、各ページの参照を次にかもしれない関連コンテンツを持っているだろう「メイン」コンポーネント

これらはNunoの手法と同様に公開時にフラット化されます。どのアプローチでもコンポーネントリンクを持つキャッチは、それらを解決し、異なるコンポーネントで同じコンポーネントを処理するときですが、それは別の議論です。

フラットのアプローチは、ドキュメントで行うことを複製します。レベル2、レベル1

  • 項目1.1レベル2
  • 項目1.2で

    • 項目1.0:(ワード、OneNoteの、TREXなどに)テキストを持つ階層を作るとき、私たちはインデントを使用しますレベルでの
      • 項目1.2.1 3
  • それをレベル2.0でem 2.0を使用します。

しかし、(リッチテキスト形式の領域で箇条書きを手動で作成することを考慮しない限り)スキーマには「インデント」オプションがありません。 :

Using radio buttons to mimic indents

プロには追加のスキーマをするためのロジックを処理するために必要に詐欺で必要とされていないとの内側にそのリンクのすべてを持っている形である「インデント。」

最後に、ネストが無限になり、編集者がフォルダ間でアイテムを切り取り、コピーして貼り付けることができるため、フォルダ内のコンポーネントも機能する可能性があります。

どのアプローチでも、これらのコンポーネントをページやSEO情報を管理するものと統合することをおすすめします。

更新:いずれの場合もパフォーマンスを考慮してください。 Webサイトとその編集者向けに設計されたWebコンテンツ管理システムとして、Content Manager Explorerのリストとフォームでは数百から数千ものアイテムがうまく機能しています。非常に大きなフォームは、アイテムに影響を与えるだけでなく、アイテムを管理することもできます(無限のスクロールは間違いなく理想的です)。

  0

興味深いアプローチ。これにより、1つのコンポーネントで完全なナビゲーションを作成することができますが、CMEのナビゲーションをレビューしている編集者にとってはやや面倒です。また、潜在的に、非常に大きなナビゲーション構造で少し遅い負荷になる可能性があります。 08 1月. 152015-01-08 03:38:26

  0

ええ、それはあなたが項目ごとに持っているより多くのフィールドがより面倒です。単一の(コンポーネント)リンクの場合、One Noteの "pages"を動かすような感じになります。パフォーマンスに注意を払うつもりです。 13 1月. 152015-01-13 01:25:28


2

あなたの質問には、組み込みスキーマが考慮されている設計について特に言及していますが、タクソノミーを使用して同じ問題を解決することもできます。あなたが言うように、必要なのは名前の値のペアだけです。キーワードを使用すると、これらのクラスと階層も取得できます。コンポーネントリンクのようなものを追加したい場合は、適切なメタデータをキーワードに追加することでこれも可能です。

タクソノミを公開した後、メニューのデータはコンテンツ配信APIを介して利用できるようになります。