cakephp雑記帳 ITかあさん

ITかあさん

Cakephp1.3 pagenateのAjax通信

Cakephpに限らず、最近ページ送りはTwitterの『もっと見るボタン』のようにするのが最近の流行りです。
これはページングをAjax通信することで実現可能なのですが、あちこち確認しながら何とか実現することが出来ました。
今回はCakephp pagenateのAjax通信にて 表示する方法について触れたいと思います。

基本的な考え方

ページ送りをAjax通信する基本的な考え方は以下の通り。
クリックしたら、本来ページを送るはずだった内容をload

$(function(){
$('#pagination .next').click(function() {
var url = 送りたい先のURL;
$('表示したい場所').load(url);
});
});

Twitter風なもっと見るボタンの実装

elements/list.ctp

<?php foreach($lists as $list): ?>
<?php echo $list['List']['title'];?>
<?php endforeach; ?>

elements/paginator.ctp
Twitter風なので、次へボタンだけです。(と、いうか Ajaxでページ送りした場合、戻るボタンって..)

<div id=’pagination’>
<?php echo
$paginator->next(__(‘次’, true).’ >>’, array(), null, array(‘tag’ => ‘span’, ‘class’ => ‘disabled’));
?>
</div>

lists_controller.php

<?php
class ListsController extends AppController {
var $uses = array('List');
var $helpers = array('Javascript');
var $components = array('RequestHandler');//必ずこれを呼んでね

function index($id = NULL){

$this->paginate = array(
'sort'=>'List.id',//ソート
'limit'=>10,//1ページあたりの表示件数
'direction'=>'desc',//昇順か降順か,
)

$this->set('new',$this->paginate);

if($this->RequestHandler->isAjax()) {
$this->render('/elements/list');
return;
}


}
}

view/list/index.ctp
<div class="hoge"></div>には、
次へボタンを押したときに読み込まれた内容が表示される場所です。

<div class="posts">
<?php echo $this->element(‘new’);?>
<div class="hoge"></div>

Javascript(と、いうかJquery)
ちょっと考え方にコツがいるのですが、
.nextをクリックすると、.hogeにurlの内容が表示される。
一度次へボタンを押されたあとにもう一度押されることが無いよう、
一度次へボタンをクリックされたらその要素をは削除して、
そのさらに次にクリックされた時の内容を表示するための
<div class="hoge"></div>
を用意してあげるのが、一連の流れ。

$(function(){
$('#pagination .next').click(function() {
var url = $(this).attr("href");
$(this).remove();
$('.hoge:last').load(url);
$(".hoge").after('<div class="hoge"></div>');
return false;
});
});

CakePHP layout使用時のtitleタグ

CakePHPの layout、あれは便利ですよね!
共通のlayoutを利用していても、titleタグは個別に設定できます。

contllor

function test($id = null) {
    $this->set('title', 'hogehoge');
}

ctp

<head> 
<title><?php echo $title;?></title>
</head>

って、変数 にテキスト代入するのと何ら変わりません。

何だ、悩んで損をしました。

cakephpでSQLを使いたい

$test = $this->Model->query($sql);

sqlをそのまま使いたい!そんな時query()を使うとよい!

query() メソッドの主な使い道

  • 単発でちょっとしたINSERT・UPDATEを行いたい
  • bind/unbindをせず、
    サクッとSELECT文を実行したい

いずれにしても、ちょっとサクッとSQLで実行したい時に力を発揮しそうです。

cakephp hasmany conditions

modelでhasmany conditions設定

結構悩んで、調べながらなんとか出来たのでメモ。

class Shop extends AppModel
{
var $hasMany = array(
'Girl' => array(
'className' => 'Girl',
'foreignKey' => 'shop_id',
'conditions' => array('Girl.mobile' => 'true'),
),
);
}

これだと必ずShop modelのデータが
‘conditions’ => array(‘Girl.mobile’ => ‘true’)
の条件になる。

Controller内で個別にhasmany conditions

さっきのmodelから’conditions’ => array(‘Girl.mobile’ => ‘true’),を削除して、

function test(){
$con = array('Girl.mobile' => 'true');//条件配列で
	$this->Shop->hasMany['Girl']['conditions']=$con;
}
$post = $this->Post->find('all',$con);

これでやればよし!

今日のまとめ

hasmany conditionsについては応用が利くようにController内で個別にhasmany conditionsってやったほうがいいかも。仮にユーザーが自由に検索する動的なものでも対応できます