Customer や Basket リソースなど、サーバー側で変更を行う Shop API リソースをカスタマイズできます。これらのリソースは、独自のスクリプトコードでサーバー側のロジックを強化できる拡張ポイント、あるいはフックを提供します。
カスタマイズ可能な各リソースには、before、after、modifyResponse の拡張ポイントが用意されています。拡張ポイント before と after をそれぞれ使用し、サーバーが処理を実行する前または後にカスタムコードを実行します。レスポンスドキュメントに最終変更を適用するには、modifyResponse 拡張ポイントを使用します。さらに、特殊なコンビニエンスフックを使用すると、買い物カゴの計算や特殊な注文手続き手順などの操作を実行できます。これらのコンビニエンスフックを使用すると、複数の after 拡張ポイントに重複するコードを含めなくても、買い物カゴ計算コードを 1 つの場所に配置できます。
サーバーがリクエストドキュメントと Script API オブジェクト (変更されるリソースを表す) を渡します。カスタムコードで両方を操作できますが、通常リクエストドキュメントで入力の検証が行われます。
サーバーがリソースを変更
サーバーは、before 拡張ポイントで処理されたリクエストドキュメントを使用して、Script API オブジェクトに適用します。
サーバーが登録済みの after 拡張ポイントコードを呼び出す
サーバーは、(before 拡張ポイントによる変更が行われた後) リクエストドキュメントと Script API オブジェクトを渡します。ここでカスタムコードで変更の追跡を行うか、Script API オブジェクトを変更できます。たとえば、買い物カゴを再計算できます。リクエストドキュメントは再処理されないため変更しないでください。ここでは通知の目的で提供されています。
サーバーがレスポンスドキュメントを作成する
サーバーは、(afterafter 拡張ポイントによる変更が行われた後) Script API オブジェクトの値をレスポンスドキュメントにコピーします。
サーバーが登録済みの modifyResponse 拡張ポイントコードを呼び出す
サーバーは、(after 拡張ポイントによる変更が行われた後) 前のレスポンスドキュメントと Script API オブジェクトを渡します。このフックタイプは、レスポンスドキュメントに最終変更を加えることのみを目的としています。このフックタイプで Script API オブジェクトを変更しないでください。これはトランザクションコンテキストで実行されないためです。変更すると、ORMTransactionException および HTTP 500 フォールトを引き起こします。
1/* basket_hook_scripts.js */23importPackage(dw.order);4importPackage(dw.system);56exports.beforePUT = function(basket,doc)7{8 // verify address9 ...1011 if(valid)12{13 doc.companyName="Salesforce";14 return new Status(Status.OK);15}1617 return new Status(Status.ERROR);18}1920exports.afterPUT = function(basket,doc)21{22 // calculate basket by calling the convenience hook, which returns a status object23 return dw.system.HookMgr.callHook("dw.order.calculate", "calculate", basket);24}2526exports.calculate = function(basket)27{28 // do calculation29 ...3031 return new Status(Status.OK);32}