メモ: 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
{
 ()
}
?>