FLATzブログ

[ZenCart]ZenCartでAjaxを使ってみる

このエントリをdel.icio.usに追加このエントリをはてなブックマークに追加 |2006年07月03日(月)18:27|nasu

那須です。


最近クライアントからAjaxを使ってくださいと言われる事があります。Ajax自体は技術的要素なので、それ自体をクライアントが使って欲しいと望んでるわけではなく、Ajaxにまつわる周辺の効果等が欲しいという風に解釈をしています。


フラッツでは最近、Ruby on Rails を使った開発が多くなってきたので、Ajaxを使ったインタフェースを用意する事も自然になってきました。ですが、PHPによる実装はまだ試行錯誤の状態です。そこで、ZenCartでAjaxを簡単に実装できるような改善を試みました。


手順としては次のような感じになりますが、概略のため、ピンと来ない部分が多いかもしれません。近いうちにサンプルやソースコードをアップしたいと思います。


■用意するもの


  • ajax_index.php
    (index.phpをコピー)
  • includes/templates/template_default/common/ajax_template_vars.php
    (main_template_vars.phpをコピー)
  • includes/templates/template_default/common/tpl_ajax_page.php
    (tpl_main_page.phpをコピー)
  • includes/modules/ajax/
    (新規作成)
  • includes/templates/template_default/ajax_templates/
    (新規作成)
  • prototype.js
  • お好みで scriptaculous.jsとその仲間たち

■手順:


1.ajax_index.php を修正

  • 出力コードをUTF-8に変更。※これ重要!!
  • ↓追加


    mbhttpoutput(‘UTF-8’);
    obstart(‘mboutput_handler’);

  • (header.phpの読込などの)不要な部分を削る

  •  require($template->get_template_dir('html_header.php',DIR_WS_TEMPLATE, $current_page_base,'common'). '/html_header.php');


     <?php require(DIR_WS_INCLUDES . 'application_bottom.php'); ?>
    </html>

    を削除

  • includes/modules/pages/ を指定している部分をincludes/modules/ajax/に変更

  •  $code_page_directory = DIR_WS_MODULES . 'pages/' . $current_page_base;


     $code_page_directory = DIR_WS_MODULES . 'ajax/' . $current_page_base;


  • tplmainpage.php を指定している部分を tplajaxpage.php に変更

  •  require($template->get_template_dir('tpl_main_page.php',DIR_WS_TEMPLATE, $current_page_base,'common'). '/tpl_main_page.php');


     require($template->get_template_dir('tpl_ajax_page.php',DIR_WS_TEMPLATE, $current_page_base,'common'). '/tpl_ajax_page.php');


  • maintemplatevars.php を指定している部分を ajaxtemplatevars.php に変更

  •  require($template->get_template_dir('main_template_vars.php',DIR_WS_TEMPLATE, $current_page_base,'common'). '/main_template_vars.php');


     require($template->get_template_dir('ajax_template_vars.php',DIR_WS_TEMPLATE, $current_page_base,'common'). '/ajax_template_vars.php');


    2.ajaxtempatevars.php を修正


    if (fileexists(DIRWSMODULES . ‘pages/’ . $currentpagebase . ‘/maintemplatevars.php’)) {
    $body
    code = DIRWSMODULES . ‘pages/’ . $currentpagebase . ‘/maintemplatevars.php’;



    if (fileexists(DIRWSMODULES . ‘ajax/’ . $currentpagebase . ‘/maintemplatevars.php’)) {
    $body
    code = DIRWSMODULES . ‘ajax/’ . $currentpagebase . ‘/maintemplatevars.php’;


    に変更


    $bodycode = $template->gettemplatedir(‘tpl’ . pregreplace(‘/.php/’, ”,$GET[‘mainpage’]) . ‘default.php’,DIRWSTEMPLATE, $currentpagebase,’templates’). ‘/tpl’ . $GET[‘mainpage’] . ‘default.php’;



    $bodycode = $template->gettemplatedir(‘tpl’ . pregreplace(‘/.php/’, ”,$GET[‘mainpage’]) . ‘default.php’,DIRWSTEMPLATE, $currentpagebase,’ajaxtemplates’). ‘/tpl’ . $GET[‘mainpage’] . ‘_default.php’;


    に変更


    3.tplajaxpage.php を修正


    < ?php require($body_code); ?>


    ↑の一文だけ残して全て削除


    ここまでで準備は完了です。次からは、具体的にAjaxを実装したい各モジュールとテンプレートでの作業になります。


    4.JavaScriptの読み込み


    Ajaxを利用したいページのjscriptmain.php(例えば、includes/modules/page/productinfo/jscript_main.php) でprototype.js を読み込む



    5.Ajaxを動かす


    Ajaxを動作させるための記述を行います。このとき作動させるサーバスクリプトを ajax_index.php としてください。


    onChange=”new Ajax.Updater(‘productinfoimage’,'ajaxindex.php’,{method:’get’, parameters:’mainpage=productsimage&productsid=’.$GET[‘productsid’],onComplete:function(res){Element.hide(‘productinfospinner’);}, onLoading:function(res){Element.show(‘productinfospinner’)}});”


    この例は、プルダウンを切り替えるとそれに応じた画像に切り替わると言うものです。


    ZenCart特有の mainpage=hoge 式処理の切り分けを踏襲するので、この辺りの修正はZenCartでページを追加する場合の手順とほぼ一緒になるかと思います。
    このとき、pages/ ではなく ajax/ を、templates/ ではなく ajax
    templates/ が用いられることに注意してください。


    ■問題点


    上の例からも分かるように、今はまだ Ajax.Updater()のようなよく使うメソッドですら手打ちしなくてはならず、ものすごく冗長になります。また、ZenCartはHTML埋め込み型のPHPのため、Ajaxを多用する事になると、1ファイルで HTMLとPHPにJavaScriptが絡んできて、かなり分かりづらいソースになる事が難点です。


    ■今後の課題


    以上から早急に解決すべき課題として


    • AJAXを扱うクラスか関数ライブラリをまとめる
    • PHPとの親和性を高めるため、JSONの採用

    を対応していく必要があります。


    ■おまけ


    Lightbox JS v2.0をOSCommerceで使っているサイトを発見した。OSCommerceにはもしかして標準装備?

    この記事に関するお問い合わせはこちら


    関連記事


    Trackback URL


    このページの先頭へ