Fatal error: Cannot redeclare class pager in ... vendor/pear/HTML/Pager/Pager.php on line 53
Akelosはデフォでvendor/以下にPEARやADODBなどのライブラリファイルを保持してます。
まぁ、これがシステム側に入っているのと干渉・衝突すると、お題のようなエラーが発生します。
例えばうっかり
require_once('Pager.php');
とかしちゃうと、システムのPEARに入っているのが取られちゃったりして、しかもその後、Akelosのpagenation_helper()ではAkelosの保持するPagerがrequireされちゃうので、ディレクトリの位置が異なるためrequire_once()の効果もなくなります。
っつーか、いくらメジャーバージョンが上がったとはいえディレクトリ位置を移すPEARのPagerもどうかとは思いますが。
じゃぁどうするか?AK_APP_VENDOR_DIRを使ってフルパス指定すればよいのか?
否。
例えばPager.phpそれ自体の中では、フルパス指定でなく、include_pathを前提としてrequireしている「かも」しれないからです。Pager.phpでなくとも他のライブラリではあり得るかもしれません。
include_pathからシステムのPEARを外すのも良いですが・・・。
なんかむかつくので、Controllerに $helpers_not_use というメンバ変数を追加して、使用したくないヘルパを記述。今回であればpagenate_helper.phpなのでこんな感じで。
app/application_controller.php :
<?php class ApplicationController extends AkActionController { ... var $helpers_not_use = "pagination"; ... }
そしてAkActionControllerをQuickHack.
function getDefaultHelpers() { if($this->helpers == 'default'){ $available_helpers = Ak::dir(AK_LIB_DIR.DS.'AkActionView'.DS.'helpers',array('dirs'=>false)); $helper_names = array(); + if (isset($this->helpers_not_use)) { + $not_use_helpers = Ak::toArray($this->helpers_not_use); + } foreach ($available_helpers as $available_helper){ + $_name = str_replace('_helper.php', '', $available_helper); + if (in_array($_name, $not_use_helpers)) { + continue; + } $helper_names[$available_helper] = AkInflector::classify(substr($available_helper,0,-10)); } return $helper_names; }elseif (is_string($this->helpers)){ return Ak::stringToArray($this->helpers); } return $this->helpers; }
以上。