メモ: CakePHPでPEAR
CakePHPのPagenatorが、モデルベッタリ感丸出しでけしからんので、PEAR::Pagerを使おうと。
で、
外部ライブラリとして導入しようと。
よく使ってたPEARライブラリを、 ~/app/vendors に放り込む。
~/app/vendors/Pear.php、な感じで放り込む。
まずPagerクラスが見つからないと、さんざん言われたので、
<?php /* * コントローラ: NyansController * 説明: Nyansコントロール */ App::import('Vendor', 'pear_init'); //<-- こうでもしないとPagerが見つからない。 App::import('Vendor', 'Pager', array('file'=>DS.'Pager'.DS.'Pager.php') ); //<-- こうでもしないとPagerが見つからない。 class NyansController extends AppController { var $name = 'Nyans'; var $scaffold; var $uses = null; function index($limit=100,$page=1,$keyword='') { $ext = array(); if( !empty($limit) ) { $ext[] = $limit; } if( !empty($page) ) { $ext[] = $page; } if( !empty($keyword) ) { $ext[] = $keyword; } list($kawayusu) = $this->requestAction('/master_of_nyans/verykawayusu/'.implode("/",$ext)); $this->set('kawayusu',$kawayusu); $params = array( 'itemData' => $kawayusu, 'perPage' => $limit, 'delta' => 10, // for 'Jumping'-style a lower number is better 'append' => true, 'separator' => ' | ', 'clearIfVoid' => false, 'urlVar' => 'page', 'useSessions' => true, 'closeSession' => true, //'mode' => 'Sliding', //try switching modes 'mode' => 'Jumping', ); $pager = & Pager::factory($params); pr($pager); } } ?>
読み込めたかと思うと、Pagerクラス内からJumpingやSlidingが見つからない、と。
とても気持ち悪かったが、Pagerの一部を変更。
<?php class Pager { function Pager($options = array()) { (略) } function &factory($options = array()) { $mode = (isset($options['mode']) ? ucfirst($options['mode']) : 'Jumping'); $classname = 'Pager_' . $mode; //$classfile = 'Pager' . DIRECTORY_SEPARATOR . $mode . '.php'; #<------- 問題箇所 $classfile = dirname(__FILE__)."/" . $mode . '.php'; #<------- Pager.phpから見てどこにあるか、って感じで。 if (!class_exists($classname)) { include_once $classfile; } if (class_exists($classname)) { $pager =& new $classname($options); return $pager; } $null = null; return $null; } }
Pager最新版の 2.4.7の中をみても、ini_set()でPear用ディレクトリをinclude pathに含めることを前提にしてあるようだった。
CakePHPによってincludePathがアレされてる感じだったので、自分でini_set()使って定義するという手は却下。
同様に、Pager/Jumping.php, Pager/Sliding.php 内で、 Pager/Common.phpを呼ぶ箇所があり、これを修正。
<?php //require_once 'Pager/Common.php'; require_once ( dirname(__FILE__)."/" . 'Common.php' ); class Pager_Jumping extends Pager_Common { (略) } ?>