さして目新しいことでもないですが簡単な小ネタでも。
トグルスイッチを切り替えるたびにDBを書き換えることは簡単にできます。
cakePHP2.0+jQueyMobile1.2でのトグルスイッチのDBへの反映のやり方です。いいやり方か分からないですが何かの助けになればと。
cakePHPのアクションは
1 2 3 4 |
public function toggleValid($id){ if (!is_numeric($id)) return false; $this->{モデル名}->query("UPDATE {$this->table} SET valid = (CASE valid WHEN 1 THEN 0 ELSE 1 END) WHERE id = ?", array($id)); } |
こんな感じです。これをコントローラに記述して /{コントローラ名}/toggleValid/{ID} にアクセスするたびにvalidカラムが0と1に交互に変わります。CASE文で判定すればいろいろできて便利なのでcakePHPでSQL組み立てるやり方が分からないときはとりあえずqueryファンクション使っちゃいます。
そしてこの関数はコントローラーでなくモデルに書くべきものなので実際にはモデルに書いてます。またjQueryMobileと組み合わせているので下のようになります。
[共通読み込みJavaScriptファイル]
1 2 3 4 5 |
$('#_favorite_people').live('pageinit', function(){ $('#_favorite_people .ui-slider-switch').live('change', function(){ $.post('/favorite_people/update_valid/'+$(this).data('id')); }); }); |
このファイルはjQueryMobile特有の処理をしています。最初のイベントバインドはDOMキャッシュを有効にしたままJavascriptを実行させるため、data-role=”page”の属性を持つコンテナにidを割り振り、そのページコンテナの初期イベントを監視しています。
[ビューファイル(index.ctp)]
1 2 3 4 5 6 7 8 9 |
<?php echo $this->Form->input('FavoritePerson.valid', array( 'type'=>'select' ,'data-role'=>'slider' ,'label'=>false ,'options'=>array('0'=>'OFF', '1'=>'ON') ,'value'=>$valid ,'data-id'=>$id )); |
$validと$idはコントローラからセットしておいてください。data-idはjQueryMobileではおなじみのHTML5の独自データ属性です。これでデータIDをjQueryへ渡すのが簡単です。
[AJAX呼び出し先コントローラー]
1 2 3 4 5 6 |
public function update_valid($id){ $this->autoRender = false; if ($this->request->is('post')){ $this->FavoritePerson->toggleValid($id); } } |
[モデル]
1 2 3 4 |
public function toggleValid($id){ if (!is_numeric($id)) return false; $this->query("UPDATE {$this->table} SET valid = (CASE valid WHEN 1 THEN 0 ELSE 1 END) WHERE id = ?", array($id)); } |