2011年5月3日火曜日

CakePHP 特定のModelだけconfigと違うPrefixを使う

CakePHPもWordPressも超便利だけど、例えばCakePHPで構築したWebアプリに、ニュースとかだけWordPressで投稿できたらいいなぁと思って試してみました。

テーブル名はCakePHPのPrefixが「cake_」でWordPress「wp_」だとします。

そもそも下記のようにやれば、Model自体は自身の名称とちがうテーブルは全然使えるんだけど
class Sample extends AppModel {
  public $useTable = 'example';
}

これだとPrefixが「cake_」前提なんですよね。無理矢理「wp_posts」とか指定すると「cake_wp_posts」で認識されてMissing Tableになっちゃう。

でも何とかできるでしょ〜、と思ってModelのソースをPrefixで検索したらすぐ出てきたww
↓これです。(cake/libs/model/model.phpの2827行目くらい)
function setDataSource($dataSource = null) {
  $oldConfig = $this->useDbConfig;

  if ($dataSource != null) {
   $this->useDbConfig = $dataSource;
  }
  $db =& ConnectionManager::getDataSource($this->useDbConfig);
  if (!empty($oldConfig) && isset($db->config['prefix'])) {
   $oldDb =& ConnectionManager::getDataSource($oldConfig);

   if (!isset($this->tablePrefix) || (!isset($oldDb->config['prefix']) || $this->tablePrefix == $oldDb->config['prefix'])) {
    $this->tablePrefix = $db->config['prefix'];
   }
  } elseif (isset($db->config['prefix'])) {
   $this->tablePrefix = $db->config['prefix'];
  }

  if (empty($db) || !is_object($db)) {
   return $this->cakeError('missingConnection', array(array('code' => 500, 'className' => $this->alias)));
  }
 }

$this->tablePrefix = $db->config['prefix']とかやってますね。このあたりを書き換えちゃえばいいわけで、自分のModel側で以下のようにしてみました。

class News extends AppModel {
 
 var $useTable = 'wp_posts';
 
 public function setDataSource(){
  parent::setDataSource();
  $this->tablePrefix = '';
 }
 
}

これでバッチリWordPress側のデータを取り扱えるはずです。

0 コメント:

コメントを投稿