CS-Cart における AJAX の基礎
CS-Cart では、jQueryのAjaxメソッドに独自の拡張を行っています。コードは、js/tygh/ajax.jsファイルに記載されています。こちらを呼び出すには以下の手順で行います。
submitForm
(フォームのみ) :フォーム内のデータを抽出し、送信できるように準備します。request
:それぞれのコントローラーにAJAXリクエストを送信します (dispatchから解析されます)。jQueryのAjaxメソッドを使用します。response
:リクエストが正常に実行されると呼び出されます。実際のサーバの応答を処理し、結果を表示します。inProgress
:AJAX リクエストが進行中かどうかを判断します。clearCache
:レスポンスのキャッシュをクリアします。
サーバ上での AJAXリクエストの処理中に、AJAXリクエストのサブシステムの初期化がfn_init_ajax
( app/functions/fn.init.php )機能によって実行されます。
- AJAXクラス ( app/Tygh/Ajax.php )のオブジェクトが作成されます。
- AJAXリクエストの前後に必要な変換を実行します。
- さらに
response
に変換するためのJSON配列も生成します。
AJAX_REQUEST定数は、PHP コードで使用するためにtrueに設定されています。
PHPファイルでAJAX_REQUEST定数を使用すると、AJAXリクエスト時にのみ実行する必要があるコードを指定できます。
例:
if (defined('AJAX_REQUEST')) { fn_set_notification('E', fn_get_lang_var('warning'), $msg, true, 'insecure_password'); }
AJAXリクエスト スクリプトの実行が完了したとき、または終了関数exit()
が明示的に呼び出されたときに、AJAXクラス ( app/Tygh/Ajax.php ) のデストラクタが実行されます。デストラクタは、ドキュメントに表示すべき情報を JSON配列に渡し、その配列をresponse
JS 関数 ( /js/tygh/ajax.js ) に渡します。
コントローラーは次の形式で応答を返します。
data:
notifications:
id:
text
title
id:
text
title
...
html:
block_id:
block_content
block_id:
block_content
...
マイクロフォーマットでAJAXを呼び出す
AJAXリクエストはリンクとフォームによって送信できます。どちらの場合も、cm-ajax
それぞれの要素にマイクロフォーマットを割り当てる必要があります。
フォーム
フォームにcm-ajax
というクラスがある場合、そのコンテンツはアクション属性で定義されたURLにAJAXリクエストとして送信されます。
このようなフォームには、 result_ids
という名前の非表示の入力要素があります。この要素には、AJAXデータで更新される要素の識別子が含まれている必要があります。
以下は AJAX を利用したフォームの例です。
<!-- Form with the class cm-ajax; defines that AJAX requests should be sent to index.php -->
<form class="cm-ajax" action="index.php" method="post" name="product_form_817">
<!-- Hidden input field with the identifiers of the HTML elements to be updated -->
<input type="hidden" name="result_ids" value="my_id" />
...
<!-- When this submit button is clicked, an AJAX request will be sent to index.php -->
<input id="button_cart_817" type="submit" name="dispatch[checkout.add..817]" value="Add to cart" />
...
</form>
リンク
cm-ajax
のクラスを持つリンクは、クリックされると、href
で指定されたURLにAJAXリクエストを送信します。
更新する要素のIDは、data-ca-target-id
属性に指定する必要があります。
AJAX を利用したリンクの例
<a class="cm-ajax" data-ca-target-id="cart_items,checkout_totals,cart_status*,checkout_steps,checkout_cart" href="{""|fn_url}"><i class="icon-cancel-circle"></i></a>
追加のマイクロフォーマット
cm-ajax
のAJAXフォームとリンクにはマイクロフォーマットが必須です。ただし、CS-Cartでは開発者がAJAXをより細かく制御できるようにするオプションのマイクロフォーマットが多数あります。
AJAXリクエストを直接使用する
CS-Cartのコーディング・ガイドラインでは、明示的なメソッド呼び出しは推奨されていません。すべての JavaScript 関数は別々のファイルに配置し、CSSセレクター (id、class など) を使用してHTML要素に割り当てる必要があります。
それでも、$.ceAjax()
メソッドの直接インライン呼び出しを介して AJAXリクエストを送信できます。
<input id="enable_block_1" type="checkbox" name="enable_block_1" value="Y" onclick="$.ceAjax(‘request’, '{$index_script}?dispatch=block_manager.enable_disable&block_id=1&enable=' + (this.checked ? this.value : 'N'), {literal}{method: 'POST', cache: false}{/literal});" />
AJAX経由でコンテナを再読み込みする
CS-Cartでは以下のように、コンテナのコンテンツを動的にリロードできます。
cm-ajax
クラスとresult_ids
要素を含むフォームを送信します(マイクロフォーマットに関する記事を参照してください)。cm-ajax
クラスとdata-ca-target-id
属性を持つリンクを使用します(マイクロフォーマットに関する記事を参照してください)。$.ceAjax()
からカスタムリクエストを行ってください。
コンテナは適切にフォーマットされている必要があります。
id
は開始タグの最後の属性である必要があります。id
は閉じタグの前に「マジックコメント」を置く必要があります。
例:
<div class="foo" data-ca-bar="bar" id="foobar">
This content will be reloaded by AJAX
<!--foobar--></div>