Zend Framework では、フレームワークの機構はそのまま利用して、テンプレートエンジンのみを Smarty に切り替えて使用することができ、その使用例は ZendFramework マニュアルの ビュースクリプト – Zend_View にも掲載されています。
しかし、どうやら Smarty2 を対象としているようで、マニュアルに掲載されているサンプルスクリプトをそのまま使用して、Smarty3 をテンプレートエンジンとするとワーニングが発生してしまいます。
スポンサーリンク
Smarty3 で PHP ワーニングが発生
なお、以下の PHP ワーニングが発生したのは Zendframework-1.11.11、Smarty3.1.10 のバージョンの組み合わせの場合でした。
Warning: strstr() expects parameter 1 to be string, array given in
Zend\Controller\Action\Helper\ViewRenderer.php on line 489
原因と対策
Smarty3 では、テンプレートパスは配列、または文字列で返されるようになっているため、strstr 関数に文字列ではなく配列を渡してしまうケースで、このワーニングが発生しているようです。
Smart3 本体の関連コードを抜粋
Smarty3 では、以下のようにテンプレートディレクトリを文字列または(文字列の)配列でリターンしています。
// Smarty.class.php
public function getTemplateDir($index=null)
{
// インデックス指定時はそのパスのみ返す
if ($index !== null) {
return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null;
}
// インデックス未指定時は全てのパスを配列で返す
return (array)$this->template_dir;
}
よって、マニュアルに記載されているスクリプトは以下のように、配列で保持している場合にはそのままリターンし、単なる文字列として保持している場合には配列に変換してリターンするように修正することで、PHP ワーニングが発生することはなくなります。
修正前
/**
* 現在のテンプレートディレクトリを取得します
*
* @return string
*/
public function getScriptPaths()
{
return array($this->_smarty->template_dir);
}
修正後
// Zend_View_Smarty
/**
* 現在のテンプレートディレクトリを取得します
*
* @return string
*/
public function getScriptPaths()
{
// 配列であればそのまま返す(この if 分を追加)
if(is_array($this->_smarty->template_dir)) {
return $this->_smarty->template_dir;
}
// 文字列の場合は配列にして返す
return array($this->_smarty->template_dir);
}