Thursday, December 30, 2010

cakephp で smarty を使う

こちらのページにある Steps に従って、cakephp で smarty が使えるようにする。

How to use Smarty with Cake (SmartyView) | The Bakery, Everything CakePHP

  1. SmartyView をダウンロードする
  2. $ cd ~/Sites/cakephp1.3/app/views/
    $ wget -O smarty.php 'http://cakeforge.org/snippet/download.php?type=snippet&id=405'
  3. smarty をダウンロードする
  4. smarty は既にダウンロードして /usr/local/lib/php/Smarty/ にコピーしてあるので、そこからコピーしてくる。
    $ cd ~/Sites/cakephp1.3/app/vendors/
    $ mkdir smarty
    $ cd smarty
    $ cp /usr/local/lib/php/Smarty/Smarty.class.php .
  5. tmp ディレクトリ内に smarty/compile, smarty/cache ディレクトリを作る
  6. $ cd ~/Sites/cakephp1.3/app/tmp/
    $ mkdir -p {smarty/compile,smarty/cache}
    $ chmod 777 smarty/compile smarty/cache
  7. app_controller.php を編集する
  8. $ cd ~/Sites/cakephp1.3/cake/libs/controller/
    $ vi app_controller.php
    class AppController extends Controller {
      var $view = 'Smarty'; // 追記
    }
    

これで、インストール完了!

早速、自分の cakephp プロジェクトのトップページにアクセスしてみる。

http://127.0.0.1/cakephp1.3/

Warning (2): include(/Users/yasu/Sites/cakephp1.3/app/vendors/smarty/sysplugins/smarty_internal_data.php) [http://php.net/function.include]: failed to open stream: No such file or directory [APP/vendors/smarty/Smarty.class.php, line 793]
Warning (2): include() [http://php.net/function.include]: Failed opening '/Users/yasu/Sites/cakephp1.3/app/vendors/smarty/sysplugins/smarty_internal_data.php' for inclusion (include_path='/Users/yasu/Sites/cakephp1.3:/Users/yasu/Sites/cakephp1.3/app/:.:/usr/lib/php') [APP/vendors/smarty/Smarty.class.php, line 793] Fatal error: Class 'Smarty_Internal_Data' not found in /Users/yasu/Sites/cakephp1.3/app/vendors/smarty/Smarty.class.php on line 85

想定外のエラー。Σ(´∀`;)

よくある。よくある。

落ち着いて /Users/yasu/Sites/cakephp1.3/app/vendors/smarty/Smarty.class.php の85行目を見てみる。

85:class Smarty extends Smarty_Internal_Data {

すると、Smarty クラスは Smarty_Internal_Data クラスを継承していることが分かる。早速、Smarty_Internal_Data クラスがどこで定義されているのか探してみる。

$ cd ~/Sites/cakephp1.3
$ ack Smarty_Internal_Data
app/vendors/smarty/Smarty.class.php
85:class Smarty extends Smarty_Internal_Data {

見つかった!けど、これって、継承しているとこだ。なので、smarty は、/usr/local/lib/php/Smarty/ の下に置いたので、そこで検索をしてみる。

$ cd /usr/local/lib/php/Smarty/
$ ack Smarty_Internal_Data
sysplugins/smarty_internal_data.php
16:class Smarty_Internal_Data {
400:class Smarty_Data extends Smarty_Internal_Data {

見つかった。どうやら、/usr/local/lib/php/Smarty/sysplugins/smarty_internal_data.php で定義されているらしい。

Fatal Error の前の Warning を見ると、include_path が '/Users/yasu/Sites/cakephp1.3:/Users/yasu/Sites/cakephp1.3/app/:.:/usr/lib/php' となっているので、ここに /usr/local/lib/php/Smarty/ を入れればいいんじゃないかって想像した。

(というか、/usr/lib/php/ を見ると PEAR とか XML とか色々と大事そうなライブラリが沢山入ってるな。。。寧ろ、smarty を /usr/lib/php/Smarty/ 以下にインストールした方が良かったんじゃないか?)

という訳で、/etc/php.ini を編集して、Apache を再起動。

# vi /etc/php.ini
include_path = ".:/usr/local/lib/php/Smarty/"
# apachectl stop
# apachectl start

ダメだったorz

include_path に /usr/local/lib/php/Smarty/sysplugins/ を追加してみたけど、それでもダメだったorz

最初の方の warning を見ると「/Users/yasu/Sites/cakephp1.3/app/vendors/smarty/sysplugins/smarty_internal_data.php の読み込みに失敗している」ということが分かる。

なので、/usr/local/lib/php/Smarty/ フォルダ内のすべてのファイルを /Users/yasu/Sites/cakephp1.3/app/vendors/smarty/ にコピーすることにした。

$ cd ~/Sites/cakephp1.3/app/vendors/smarty/
$ cp -r /usr/local/lib/php/Smarty/* .

そして、自分の cakephp プロジェクトのトップページに、再度、アクセスしてみる。

おおっ、なんか表示が変わりましたょ!


でも、相変わらず、なんか表示が変じゃない??

とりあえず、最初の warning にある 'assign_by_ref' ってなんだろう?

ぐぐったら、以下のリンク先にあるように、'assign_by_ref' は Smarty3.0 で 'assignByRef' に変わったとのこと。Smarty2.6.25以前を使えば問題ないとのことだが、今更 smarty のパージョンを変更するのも面倒なので、そっとしておく。

サクサクPHP: CakePHPでSmartyを使う設定にてハマった。際のメモ


閑話休題。本題に戻って表示が変なのを何とかしよう。

なんか、php のコードがそのままでちゃっている感じですね。これって、smarty を使わないデフォルトの状態で正常に表示されるトップページの内容を、smarty を使って表示しようとしているから表示が変になっているのではないかと想像した。



で、、、色々といじってみたが、結局、分からず仕舞いで挫折したorz

他にもやることが沢山あるので、今回はこの辺にしておこう。。。(・∀・;)

CakePHPでSmartyで使う方法(2010年2月現在) - YouのMacとかプログラムとか映像編集とか

ここのリンク先を見て、/app/views/layouts/default.tpl, /app/controllers/sample_controller.php を作成し、default.tpl の内容が表示されることは確認したのだが、/app/views/sample/index.tpl の内容が表示されず、また、php のコードがそのまま表示されるのを直すことが出来なかった。

またの機会にチャレンジしたい。また、どこか間違っているところがあったら、ご教授頂けると幸いです。

因みに、今回の環境は、以下の通りです。

  • Mac OS X version 10.6.5
  • PHP 5.3.3
  • CakePHP 1.3.6
  • Smarty 3.0.6
  • SmartyView 1.0.0.7


くやしいー。(´Д`;)

No comments:

Post a Comment