ラベル WordPress の投稿を表示しています。 すべての投稿を表示
ラベル WordPress の投稿を表示しています。 すべての投稿を表示
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側のデータを取り扱えるはずです。
2011年2月15日火曜日

CakePHP viewにelementを埋め込む

WordPressではサイドバーを共通化する場合は(というかブログだから当然サイドバーは共通ですよね)
get_sidebar();

//もしくは定義済みの定数と組み合わせて

include TEMPLATEPATH . '/header2.php';

とか書いたりしますが、CakePHPではどうやるんだろう?とおもってググッてみたら出てきた。
CakePHP View::element() | パン好きのエンジニア
ちょっと違うけど、”View::element()”というメソッドがあった。
Viewの中の一部をelementとして切り出すらしい。

viewフォルダの中を見てみたら確かに /view/element/ というディレクトリがあった。
試しにview内で echo $this->element(); としてみたら読み込むじゃないかァァ
まさに期待通り。

で、データも渡したいなぁと思ってマニュアル見たら
element(string $elementPath, array $data, bool $loadHelpers)
お、二番目に array $data がある。CakePHP的に考えれば、こうゆうときは array('変数名' => '中身') でしょう。と思って試してみたらこれも期待通り!こんな感じでview.ctpからelement.ctpに渡せる
$this->element('sidebar', array('hoge' => 'Hello!'));
もちろんcontrollerでsetした値もそのまま使えるし、繰り返しHTMLパターンがあるなら管理しやすい……と、ここまで書いてて、よく見たら詳しく日本語化されたマニュアルを発見!
http://book.cakephp.org/ja/view/97/Elements
おお!キャッシュも使えるのか♪至れり尽くせりだな。