回答が遅れて申し訳ありません。掘り下げ始めてから時間がかかりました。調査結果を共有したいと思います。
私の会社では、ATG の提案に基づいてセール価格を実装しました。これは、atg/commerce/pricing/ItemPriceInfo で、"List Price" リストから listPrice を、"Sale Price" リストから salePrice を入力することを意味します。
サイト全体で商品価格を表示するには、次のロジックを適用して販売価格を優先することで、両方のリストから選択する必要があります。
isOnSale() && getSalePrice() < getListPrice ? getSalePrice() : getListPrice();
問題は、BCC で新しいプロモーションを作成し、BCC がデフォルトで PDML ルールに次のような XML タグを追加するため、最高 (または最低) 価格のアイテムにプロモーションを適用するオプションを選択したときに発生します。
< up-to-and-include number="1" sort-by="priceInfo.listPrice" sort-order="descending" >
お気づきかもしれませんが、PDML が行うトリックは、「priceInfo.listPrice」に基づいてすべてのアイテムをソートし、最初のものを選択することです。
PDML が評価されると、ATG はこの XML タグを atg/commerce/pricing/definition/UpToAndInclusiveElem のインスタンスによってマップします。そこで、メソッド「evaluate」は、atg/commerce/pricing.definition.CompoundPricingModelExpression にあるメソッド「resolveCollectionList」を呼び出し、最後に同じクラスのメソッド「sortList」を呼び出します。
- これは私にとってはうまくいったハッキーなアプローチですが、私はすでに落としました:
5.a UpToAndInclusiveElem.class を逆コンパイルし、メソッド sortList の独自のバージョンを追加しました。このメソッドはパラメーター「sortBy」を受け取るため、条件を追加して、その値が「priceInfo.listPrice」の場合、カスタムの新しい属性「priceInfo」に変更しました。 。最終価格"
5.b すでに atg/commerce/pricing/ItemPriceInfo クラスを拡張しているので、ステップ 2 で説明したように、セッターと、使用する販売価格があるかどうかを評価するカスタム ゲッターを使用して、「finalPrice」という新しい属性を追加しました。
これで、PDML ルール内のその XML タグを使用したプロモーションが、プロモーションを最高 (または最低) 価格のアイテムに適用するたびに、カスタムの UpToAndInclusiveElem の sortList メソッドが sortBy パラメータを置き換えて、getter メソッドが販売価格を考慮する「priceInfo.finalPrice」を使用します。 .
なぜ私はこのアプローチをやめるのですか?
- クラスをオーバーライドする方法は、クラスがクラスパス内のプロジェクトに追加される順序に依存しているため、危険に感じます
- 最適な Java コードであるとは保証できない逆コンパイル ツールを使用しました
- 後で別のATGバージョンでこのフローが変更された場合、問題が発生する可能性があります
私は何をするつもりですか?
ItemPriceInfo クラスからカスタム クラスに追加した "priceInfo.finalPrice" の定義を保持します。
カスタム属性を「priceInfo.listPrice」ではなく「priceInfo.finalPrice」にハードコーディングするようにプロモーション テンプレートを変更する方法を見ていきます。
私の質問を読んで返信してくれた人々に感謝します。私の発見とアプローチがあなたに役立つことを願っています.
もちろん、自信を持って質問したり提案したりしてください。