Smarty講座の第1回の$smarty.nowで - PHPプロ!Q&A掲示板

1211

  • 0P

Smarty講座の第1回の$smarty.nowで

質問日時 / 2008年6月5日 17:09    回答数 / 4件

Questioner:  kinpira  このエントリーをはてなブックマークに追加 

キーワード / Smarty   

PHP初心者で、当HPの講座を参考にしていますが、Smarty講座の第1回でいきなりつまずいてしまいました。
 
講座内容の通りに実行しているつもりですが、hello.phpを実行すると、
結果が以下のように表示されます。
  1. こんにちは、あなたの名前さん!! 今日は
  2. Warning: date_format() expects parameter 1 to be DateTime, integer given in
  3. C:\Apache2\smarty\templates_c\%%6D^6D7^6D7C5625%%test.tpl.php on line 7
  4. です。

template.tplの内容
  1. こんにちは、{$name}さん!!
  2. 今日は{$smarty.now|date_format:'%Y年%m月%d日'}です。

コンパイルしてできた%%6D^6D7^6D7C5625%%test.tpl.phpの内容は以下となっています。
  1. <?php /* Smarty version 2.6.19, created on 2008-06-04 17:36:42
  2.          compiled from test.tpl */ ?>
  3. <?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
  4. smarty_core_load_plugins(array('plugins' => array(array('modifier''date_format''test.tpl'2false),))$this)?>
  5. こんにちは、<?php echo $this->_tpl_vars['name']?>
  6. さん!!
  7. 今日は<?php echo ((is_array($_tmp=time())) ? $this->_run_mod_handler('date_format'true$_tmp'%Y年%m月%d日') : date_format($_tmp'%Y年%m月%d日'))?>
  8. です。

エラーレベルが厳しすぎるのかと思い、php.iniのerror_reportingの設定を 
E_ALLからE_STRICTに変更してみましたが、以下のように年月日が表示されません。
  1. こんにちは、あなたの名前さん!! 今日はです。

なお、PHP Version 5.2.3、Smarty Version 2.6.19を使用しています。

初歩的な質問で申し訳ありませんが、ご教授いただきたくよろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01mgngmgngSJISでファイル作成してるとparseエラー発生したよう
 ┗A01-1kinpiramgngmgng様、お返事ありがとうございます。 phpフ
  ┗A01-1-1mgngmgngmgngmgngです。 date_formatは文字化けするみたい
   ┗A01-1-1-1kinpiramgngmgng様、お返事ありがとうございました。 strf

回答一覧

並び替え:

A01
answerermgngmgng [6月6日 16:16]

SJISでファイル作成してるとparseエラー発生したような..気がします。
EUCかUTF-8で作成するとどうなりますか。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerkinpira [6月9日 16:08]

mgngmgng様、お返事ありがとうございます。

phpファイルとtplファイルをEUC及びUTF-8でそれぞれ保存しなおして
実行してみましたが、結果は同じでした。

ちなみにphp.iniは以下のように設定しなおしました。
default_charset EUC-JP 
mbstring.http_input auto 
mbstring.http_output EUC-JP  
mbstring.internal_encoding EUC-JP  
mbstring.language Japanese 

OSはWindowsXP SP2で、ORACLEをインストール済です。
ORACLEの影響もあるのでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1 参考になった
replyermgngmgng [6月10日 10:15]

mgngmgngです。

date_formatは文字化けするみたいです。
http://code.xenophy.com/?p=184
http://yossy.iimp.jp/wp/?p=54

smartyのマニュアルを見ると、
date_format は strftime のラッパーなので
strftimeの挙動を追ってみると何かわかるかもしれません。
http://www.smarty.net/manual/ja/language.modifier.date.format.php

strftimeは環境によって実装が異なるため
OSによっては使用できない変換指定子も存在するようです。
http://jp2.php.net/strftime

このあたりも参考になるかもしれません(ちょっと古いですが)
http://ml.php.gr.jp/pipermail/php-users/2003-September/018341.html


# 調べもせず適当なことかいてすみません

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerkinpira [6月10日 14:40]

mgngmgng様、お返事ありがとうございました。

strftimeの動きを確認しようとしたところで、実はPHPのdate_format()が
動いていることに気づきました。

コンパイルして生成されたPHPが本来は
  1. 今日は<?php echo ((is_array($_tmp=time())) ? $this->_run_mod_handler('date_format'true$_tmp'%Y年%m月%d日') : smarty_modifier_date_format($_tmp'%Y年%m月%d日'))?>
  2. です。
となるべきところが、
  1. 今日は<?php echo ((is_array($_tmp=time())) ? $this->_run_mod_handler('date_format'true$_tmp'%Y年%m月%d日') : date_format($_tmp'%Y年%m月%d日'))?>です。
となっていて、Smartyのdate_format修飾子が動作していません。

いろいろ試したところ、Smarty.class.phpを相対パスでrequireするとPHPのdate_fomart()に
なってしまい、絶対パスでrequireするとSmartyの修飾子になるようです。
※SmartyはC:\PHP\includes\smarty配下に格納
 PHP.iniはinclude_path = ".;c:\php\includes;"と指定

テンプレートの読み込み等はうまくいっていたので気づきませんでした。
いろいろアドバイスいただいたおかげで解決できました。
ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
include されたファイルの変数
 このエントリーをはてなブックマークに追加 
A
出来ます。include(require)は、その部分に読み込むファイルの内容を展開したのと同義です。エディタでファイル読み込み(あるいはコピペ)した状態と同じだと考えていいです。 #defineや変数定義だけの共通フ...

>>続きを読む

shimix様、いつもわかりやすい説明をありがとうございます。 「includeはエディタでコピペした状態と同じ」 この表現、私も授業で使わせていただきたいと思います。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)