AjaxHelperを試す

CakePHP1.2alphaのAjaxHelperが使いやすいかどうか、試しました。まだalpha版なので(?)機能は少なく、そして構造的に間違っているような気がしなくもナイ。

準備

Rails同様、prototype.jsとscript.aculo.usをサポートしている様子。script.aculo.usからダウンロードして、app/webroot/jsに配置します。

 class AjaxtestController extends AppController{
  var $helpers = array("html","form","ajax","javascript");
 }

 <head>
  <?= $javascript->link('prototype') ?>
  <?= $javascript->link('scriptaculous') ?>
 </head>

で、必要なファイルを読み込んで、AjaxHelperが、使えるようになる。APIリファレンスがナイとどうしようもないので、phpDocumentorで生成しておきます。

 > pear install PhpDocumentor
 > phpdoc -d cake/libs/ -t docs/api

それと、必ずハマるのは、CakePHPのスタックトレース出力。アレのせいでJavaScriptが動かないことが多々あります。私もそのおかげで、ずーっとぜんっぜん動かなくて、小一時間ハマッていました。

Ajaxをやるときは、ぜひとも define('DEBUG', 0 ) で!
もちろんバグがあるとウンともスンとも言わなくなるので、サーバログなり、FireBugなり使います。(サーバログは出すけどHTML出力はしない、っていう設定ナイか?)

AjaxHelperを試す

phpdocをざっと見回すと、どうやら基本的なAjax.UpdaterとEvent、マクロはオートコンプリート/ドラッグ&ドロップ/スライダーあたりしか対応していないようで、AjaxHelperはscript.aculo.usの機能を網羅しているわけではなさそうです。でもまあ、ただのお助けメソッドですから、Helperがなければ生でJavaScript書くだけなので。。


■Ajax.Updater

 <?= $ajax->div('cart_div') ?>
 <?= $ajax->divEnd('cart_div') ?>

 <?= $ajax->link( "カゴに入れる", "#",
         array( "url"=> "add_action/{$item_id}" ,
         "update" => "cart_div" )) ?>

これで、add_actionアクションの結果を、cart_divプレースフォルダに、AjaxUpdateするリンクができます。
正直、$ajax->div は無用の長物でして、素直に、
<div id="cart_div"/> とHTMLを書いたほうが良さそう。

■Ajax.Autocompleter

 View:
  <?= $ajax->autoComplete('Item/title', 'complete_action',
              array( 'frequency'=>0.5, 'size'=>50 ) ) ?>

 Controller:
  function complete_action(){
    $dao = new Item();
    $phrase = $this->params['data']['Item']['title'] . '%';
    $this->set( 'items', $dao->findAll( "title LIKE '{$phrase}'") );
    $this->layout=false;
  }

 アクションのレンダーView:
  <ul>
   <? foreach($items as $item){ ?>
    <li><?= $item['Item']['title'] ?></li>
   <? } ?>
  </ul>

Cakeの $ajax->autoCompleteは、
RailsのJavaScriptMacrosHelper.text_field_with_auto_complete
と同等の機能になります。

ここでかなり気になったのは、$ajax->autoCompleteの第3引数のarray。この引数で指定する属性が、HTMLタグに対するものと、Ajax.Autocompleterの設定値と、混在してる。

AjaxHelperのメソッドは、全体的にそういう風にできていて、ソースを読むと属性名で(一生懸命)振分けをしているようです。
リファレンスには、「この引数にはHTMLオブション+autoCompleteオプションが使える」などの注意書きはあるので、よく読む必要アリ。
それと、その副作用で、指定しても認識してくれない属性もあります。使える属性が、リファレンスに確かにちゃんと書いてはありますが・・。

もはや検証する気が失せましたw。後はどちらかといえば
script.aculo.usの話なので、このくらいにしておく。

まとめると、

 ・ヘルパーメソッドの名前と、生成するHTML+JSにギャップがある。
   ・そもそも"AjaxHelper"っていう名前が???

 ・引数$optionsの意味が明確じゃない。

  → だからトライ&エラーの繰り返し。
  → そんな時間があるなら、生でJS書いちゃうよ。

最後に

  短く書ければいいってもんじゃない!

とだけ申し上げておきます。


コメント

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: