電子書籍の厳選無料作品が豊富!

こちらのページを参考に表示にsmartyを入れてみました。
http://www.phppro.jp/school/smarty/vol12/2
※smartyは3.0.6でzendは1.11.3です

indexActionで格納した変数はtplで表示されているので組込は
成功しているかと思うのですが下記のようなエラーが表示されます。

Warning: include_once(Smarty\Internal\Data.php)
Warning: include_once(Smarty\Internal\Template.php)

ファイルを確認すると確かに該当データがありません。

smarty3なのでフォルダ名がInternalではなくsyspluginsに変わって
いる事が原因かと思うのですがどのように対処すればいいでしょうか?

A 回答 (1件)

PHPには、autoloadといって、未定義のクラスのインスタンスを生成しようとした場合に、自動的にそのクラスがあるファイルを取得する記述が出来ます。


<?php
spl_autoload_register('my_autoload');

function my_autoload($class_name){

require_once $class_name . ".php";

}

$instance = new MyClassName();


?>

このようにすると、スクリプト中未定義であるMyClassNameをnewすると、存在しないので、autoloaderとして登録してある、my_autoload関数が呼ばれ、その中に記述してあるように、[MyClassName.php]をインクルードするように処理しています。
(当然、MyClassName.phpファイルが存在しなければエラーでこける。)
また、複数のautoloadが登録されている場合、
<?php
spl_autoload_register('my_autoload_one');
spl_autoload_register('my_autoload_two');
//こんな感じで。
?>
最初に登録されたものから順番に実行されます。


っていう前提のもと、ZendFrameworkは、Zend_Loaderとかそんなクラスでautoloadを登録しています。
そして、Zendはどの様に呼ぶかというと、
Zend_Http_Clientというクラスがあったとすると、「_」を「/」に変更して、拡張子をつけた物、つまり、

Zend/Http/Client.php
というディレクトリを探してくるように記述されています。

ソレとは全く別のルールでSmarty3は、自分のプラグインを呼ぶときに、例えば、テンプレート中にdataというプラグインを呼ぶ場合、
Smarty_Internal_Dataクラスを呼びます。そうすると、Smarty3が自前で実装しているautoloadでは、
sysplugin/smarty_internal_data.php
というディレクトリを探してくるように記述されています。


以上のことから、結論として、Zendがもっているautoloadが、最初に登録されてしまっているために、Smarty3のもっているautoloadが後回しにされてしまっているため、エラーが出ているものと推測出来ます。

従って、
dcx147さんが参考にされたURLに記載の15行目、
Zend_Loader::registerAutoload();
と記述のある部分よりも前に、23行目にある
require_once( SMARTY_DIR .'Smarty.class.php' );

を持ってくると、改善しそうです。

如何でしょうか。
    • good
    • 0
この回答へのお礼

的確な回答ありがとうございます。
おかげさまで問題解決です!本当にありがとうございました!

お礼日時:2011/02/06 14:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!