TwitterAPIを使ってアプリケーションを作りたい!その4


その3でpaginateを使えるように改造!





・app/controllers/t_controller.php

<?php
class TController extends AppController {
public $uses = array('T');

public function index() {


if (isset($this->params['url']['q'])) {


//paginate['conditions']にqの値を渡してあげる、じゃないとモデルqの値が使えない
$this->paginate['conditions'] = array(
'q' => $this->params['url']['q'],
);

//この記述でモデルのpaginateが呼び出されるらしい!
//モデル内での実行結果をコントローラのpaginateメソッドでページネーションできるようにして、それを$dataに代入する
$data = $this->paginate('T');
} else {
$data = array();
$this->params['url']['q'] = null;
}

$this->set('data', $data);
$this->set('q', $this->params['url']['q']);

}
}



・app/models/t.php

<?php
//ライブラリのインポート
App::import('Core', 'HttpSocket');
App::import('Core', 'Xml');


class T extends AppModel {
const API_SEARCH = ' http://search.twitter.com/search.atom ';

//データベースを使用しない宣言みたいなの
public $useTable = false;


//コントローラーから直接は呼び出されてないけど、間接的に呼び出されてる?ってことかな?
public function paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra) {

$HttpSocket = new HttpSocket();
$query = array(
'q' => $conditions['q'],
'page' => $page,
'rpp' => $limit,
);

$ret = $HttpSocket->get(self::API_SEARCH, $query);

if ($ret) {
$Xml = new Xml($ret);
return $Xml->toArray();
}

return array();
}
}



・app/views/t/index.ctp
・ページネートのリンク(最後に追加してください)

<?php if(isset($paginator)): ?>
<?php echo $paginator->prev('<< '.__('prev', true), array('url' => array('controller' => 't', 'action' => 'index', '?' => array('q' => $q)), 'rel' => 'prev', 'class' => 'prev'));?>&nbsp;
<?php echo $paginator->next(__('next', true).' >>', array('url' => array('controller' => 't', 'action' => 'index', '?' => array('q' => $q)), 'rel' => 'next', 'class' => 'next'));?>&nbsp;
<?php endif; ?>



ってすると、できそうなものですが
SQL Error: 1146: Table 'test.ts' doesn't exist
エラーが出ます。


テーブルないよ。って言われてるんですが、使わないからつくってないよ。
むしろ public $useTable = false; で使わないって宣言してるので、大丈夫なはずでした。




全然わからなさすぎて、なけた。




原因:http://www.garacter.com/notes/CakePHP+Note:%E7%8B%AC%E8%87%AA%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/pi:252


結局、独自でページネート作ったら、paginateCount定義しろよ。ってことですね。



なので、モデルに追加です。


・app/models/t.php

//これ重要
public function paginateCount($conditions, $recursive, $extra) {

// PHP_INT_MAXなのかはちょっとわからんです。普通に123とかをreturnしても動きました。
return PHP_INT_MAX;
}





全体的に、FIND Twitterを解説してくれているありがたいブログ
http://webcache.googleusercontent.com/search?q=cache:SbS2xzRgNBUJ:planetcakephp.org/aggregator/items/2744-cakephpfindtwitter