CakephpでPaginator->numbersのリンク先を変える

cakephp 2.6でPaginator->numbersのリンク先を変えるのに調べてみました

参考) Paginator — CakePHP Cookbook 2.x ドキュメント

Config\routes.php
でurlをセットした時に調べました

routes.phpを

    $defaults = array('controller' => 'sample');
    Router::connect('/sample', $defaults);
    Router::connect('/sample/:type/:mode', $defaults);

なんてしたときに

Viewでpaginator->numbersを表示させると

    <?php echo $this->Paginator->numbers(); ?>

sample/type/mode にアクセスした時
ページャーのリンク先が sample?page=2 とかになってほんとは sample/type/mode?page=2
にしたいってときは

    <?php echo $this->Paginator->numbers(array('type'=>$type, 'mode'=>$mode)); ?>

sample/type/mode?param=100 にアクセスした時
ページャーのリンク先が sample/type/mode?page=2 になるので
クエリパラメータ残して sample/type/mode?param=100&page=2 にしたいときは

    <?php echo $this->Paginator->numbers(
            array(
                'type'=>$type, 'mode'=>$mode,
                array('?'=>array('param'=>'100'))
            )
    ); ?>

と ? の配列を追加してやるとできました

コアのソースコードを読んでみつけました

CakephpでOracleのrowidも取る

CakephpでOracleのrowidが取りたかったので調べました

モデルのvirtual fieldを使うといいようです
バーチャルフィールド — CakePHP Cookbook 2.x ドキュメント

モデルに追記

     public $virtualFields = array('rowid'=>'rowid');

これでfindとかすれば、rowidも合わせて取れました

Cakephpのコントローラーでpaginateをトップページに飛ばす

ページ制御 — CakePHP Cookbook 2.x ドキュメント
であるように存在しないページにアクセスされた時の処理を書いてみました

試行錯誤した結果、これで..

$this->Paginator->settings = $paginate;
try {
    $companies =  $this->Paginator->paginate($mainModel);
} catch (NotFoundException $e) {
    $whiteList = $this->Paginator->whitelist;
    $key = array_search('page', $whiteList);
    if ($key !== false) {
        unset($whiteList[$key]);
    }
    $this->Paginator->whitelist = $whiteList;
    $companies =  $this->Paginator->paginate();
}

whiteListからpageを外してpageの指定を無視させてます
アドレスが
http://sample.net/page:2
とか残ったままですが、最初のページ(page:1)が表示されます

うーん、もっといいやりかたがあるような気がします

Ubuntuにphpenvで複数バージョンのphpをいれる

諸事情で古めのphpが必要になったので、phpenvを試してみました
エラーでまくりでかなり時間かかりましたが、手順をまとめておきます

必要なものをいれます
$ sudo aptitude install -y libxml2 re2c autoconf bison libxml2-dev libcurl4-dev libjpeg62 libjpeg62-dev libreadline6-dev libpng12-0 libpng12-dev libtidy-dev libxslt-dev libltdl-dev libltdl7 libltdl7-dev libmcrypt-dev openssl libcurl4-openssl-dev

phpenv、php-buildを落としてきます

$ curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
$ git clone git://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
$ echo ‘export PATH=”$HOME/.phpenv/bin:$PATH”‘ >> ~/.bashrc
$ echo ‘eval “$(phpenv init -)”‘ >> ~/.bashrc
$ exec $SHELL -l

configureのオプションを修正
$ vim ~/.phpenv/plugins/php-build/share/php-build/default_configure_options

enable-fpm
を消して
–with-apxs2=/usr/sbin/apxs
を追記

$ phpenv install -l
でバージョンを確認

$ phpenv install 5.3.29
でだめだったので

rootになって試しました(phpenvを入れなおしたかも)
$ sudo -s
$ phpenv install 5.3.29
で入りました

php.iniが
~/.phpenv/versions/5.3.29/etc/php.ini
にあります

date.timezone = Asia/Tokyo
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock

を追記

phpenv-apache-versionをいれます
$ git clone https://github.com/garamon/phpenv-apache-version ~/.phpenv/plugins/phpenv-apache-version

バージョンセット
$ phpenv apache-version 5.3.29

apache再起動して完了

苦労しました..

(参考)
ubuntuにphp-buildでphp5.5を入れるためにシェルスクリプトと格闘した記録 | hirobanex.net
phpenvの導入して複数バージョンのPHPを管理する – Qiita
Hunting Field: もう一度php-5.3.8を入れる
ubuntuにphp-buildでphp5.5を入れるためにシェルスクリプトと格闘した記録 | hirobanex.net