9

私は Tridion にかなり慣れていないので、コンテンツ エディターがコンポーネントを作成し、複数の日付範囲 (利用可能な日付) をそれに割り当てることができる機能を実装する必要があります。これらは、検索機能を提供するためにブローカーから照会する必要があります。

当初、これは単一の開始日と終了日のみを必要としていたため、個別のメタ データ フィールドとして実装されていました。

複数の開始日と終了日を割り当てることができるように、スキーマの「使用可能な日付」メタデータ フィールド内に埋め込みスキーマを使用することを提案しています。

ただし、フィールドが複数の値を許可するようになったため、データは、単一の値しか許可されていなかったときのように「KEY_DATE_VALUE」列の日付値としてではなく、「KEY_STRING_VALUE」列のカンマ区切りの値としてブローカーに保存されます。開始値と終了値。

例えば。
KEY_NAME | KEY_STRING_VALUE終了日
| 2012-04-30T13:41:00, 2012-06-30T13:41:00
start_date | 2012-04-21T13:41:00, 2012-06-01T13:41:00

単純なクエリ ロジックを使用して、日付に基づいて検索に必要なアイテムを取得できなくなったため、ブローカーのクエリで問題が発生しています。

これらのコンマ区切りの日付を解析し、それらに基づいて検索する C# ロジックを書き始める前に、過去に同様の要件/経験があり、必要なコード解析の量を減らすために別の方法でこれを実装した人がいるかどうか疑問に思っていました。ブローカーのクエリを使用して検索を完了します。

私は Tridion 2009 でこれを開発していますが、5.3 Broker を使用しているため (従来の理由から)、クエリは現在次のようになっています (単一の開始日/終了日):

query.SetCustomMetaQuery((KEY_NAME='end_date' AND KEY_DATE_VALUE>'" + startDateStr + "') AND (ITEM_ID IN(SELECT ITEM_ID FROM CUSTOM_META WHERE KEY_NAME='start_date' AND KEY_DATE_VALUE<'" + endDateStr + "')))";

どんな助けでも大歓迎です。

4

2 に答える 2

10

戻ってきて、他の誰かが同じシナリオに直面した場合に、私が最終的にこれにどのようにアプローチしたかについて詳しく説明したかっただけです.

クライアントにフィールドのセット数を提案しました (Miguel の提案による) が、クライアントはそのレベルの制限に満足していませんでした。

したがって、開始日と終了日を含む埋め込み可能なスキーマを実装することになり、最も柔軟性が高くなりました。ただし、Broker API の制限により、Broker DB に直接アクセスする必要がありました。理想的ではありませんが、クライアントは必要な機能を取得するためのアプローチに同意しました。明らかに、将来的にアップグレードが行われた場合は、これを再検討する必要があります。

日付と利用可能な期間のすべての処理は C# で行われたため、ソリューションのパフォーマンスは実際にはかなり優れています。

私が発見した問題の原因の 1 つは、埋め込みスキーマを使用してフィールドに複数の値がある場合 (つまり、この場合は複数の開始日と終了日)、メタデータがCUSTOM_METAテーブルのKEY_STRING_VALUE列に格納されることです。 . ただし、フィールドに値が 1 つしかない場合 (つまり、開始日と終了日が 1 つ)、これらは、埋め込み可能なスキーマではなく単一のフィールドを使用した場合と同じように、 KEY_DATE_VALUE列に日付として格納されます。Tridion が採用するのは理にかなったアプローチのように思えますが、クエリと解析コードを作成するときに少し複雑になります。

于 2012-04-30T13:34:34.490 に答える
3

これは複雑なシナリオです。すべての DCP を調べてそれらの文字列を解析し、検索条件に一致するかどうかを判断する必要があるためです。

ブローカーでそのメタデータ (カンマ区切り) を単一の値に変換する方法がありますが、フィールドの名前は異なる Range1、Range2、....、RangeN にする必要があります。パッケージの XML 構造を変更し、それらの各文字列を異なる値 (1、2、..、n) に変換します。Deployer 拡張機能に慣れておらず、シナリオを 100% 解決できない場合、この拡張機能には時間がかかることがあります。

これの問題は、これらの値を取得するためにいくつかの条件を適用する必要があり、設定する必要がある制限が常にあることです (必要なだけ値を追加できるユーザーに対して)。

サンプル:

query.SetCustomMetaQuery((KEY_NAME='end_date1'
query.SetCustomMetaQuery((KEY_NAME='end_date2'
query.SetCustomMetaQuery((KEY_NAME='end_date3'
query.SetCustomMetaQuery((KEY_NAME='end_date4'

おそらく、これを達成するための最も速くて簡単な方法は、代わりに複数値フィールドを使用し、異なるフィールドを使用することです。これは最も一般的なシナリオではなく、ビジネス要件の影響があることは理解していますが、開発を簡素化できます。

私の以前のコメントは、Broker API のみを使用するという文脈でのものでしたが、アーキテクチャの一部である場合は検索エンジンを利用できます。ブローカー データベースのインデックスを作成し、データをマッサージできます。検索エンジン API を使用すると、コンポーネント/コンポーネント テンプレートの ID を抽出し、ブローカー API を使用して適切な情報を取得できます。

于 2012-04-25T15:31:38.097 に答える