人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Smartyを使用し画面出力を行おうとしていますが実際に見てみると一切Smartyによってアサインした項目が表示されずテンプレートのみが表示されるといった状態です。

下記のユーザー定義関数内の$fileを別ファイルの$smarty->display($file)により出力しています。もしかしてPHPのバージョンの問題なのかなと思っているのですが、、、ちなみに当方の環境はPHP Version 4.3.10です

?中略?
function login_screen($option){
$form = $option['form'];
$smarty = $option['smarty'];
//$systemflg= $option['systemflg'];

$file = 'login.tpl';
$smarty->assign('title', 'タイトル名');

$form->addElement('text', 'username', 'ユーザー名', array('size' => 15, 'maxlength' => 50));
$form->addElement('password', 'password', 'パスワード', array('size' => 15, 'maxlength' => 50));
$form->addElement('submit','submit','ログイン');

return $file;
}
?中略?


●質問者: jayz
●カテゴリ:ウェブ制作
✍キーワード:LOGiN password PHP Smarty TPL
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● いのくに
●20ポイント

function login_screen() の外 OR 前で

$option['smarty'] = new Smarty;

とでもされているでしょうか?$optionの内容が気になります。


変数のスコープがちぐはぐな感じがしないでもないです。

◎質問者からの返答

毎度回答ありがとうございます

$option['smarty']については、このユーザー定義関数を読み込む前の段階でnew Smartyが代入されています(その他の$option内の変数も同じで、例えば$formにはnew HTML_QuickForm()が代入されています)

参考書のソースなのであまり?間違いはないと思うのですが、いかんせんSmaryにセットした値が表示されずに、テンプレートのみ表示されるというのは・・・


2 ● vector
●20ポイント

恐らくスコープの問題でしょう。

引数で$optionを渡しているようですが、参照渡しではないため、

$option['smarty']

は、別のオブジェクトとなります。


テンプレートのみ表示されるのは、 別の関数で(別のSmartyオブジェクト)でdisplay($file)しているので、

function login_screenにてセットされた値はなくなっています。


恐らく

function login_screen(&$option)
{
}

のように引数を参照渡しにするとウマくいくと思われます。

◎質問者からの返答

回答ありがとうございます。教えていただいたものを試してみましたがだめなようです。

(文法エラーになってしまいました)

一応ソースが落とせますので余裕のある方はお願いします

http://book.mycom.co.jp/support/bookmook/PHP/

上記URLよりファイルをダウンロードしSection72-81フォルダ内に今回お聞きしているソースがあります。(build_screen.inc.php)


3 ● vector
●20ポイント

&が&になってしまっていましたm_m

正しくは

function login_screen(&$option)

{

}

です。

◎質問者からの返答

ありがとうございます。"&"でもだめなようです。

どうやらスコープの問題ではなさそうですね

最初に貼り付けた関数内から$option、$form、$smaryなんかをvar_dumpとかしてみたんですが配列もしくは、オブジェクトが格納されています。

どうやら$smarty->display($file)時に下記の内容がセットされていないようなのですが・・・

$smarty->assign('title', 'タイトル名');

$form->addElement('text', 'username', 'ユーザー名', array('size' => 15, 'maxlength' => 50));

$form->addElement('password', 'password', 'パスワード', array('size' => 15, 'maxlength' => 50));

$form->addElement('submit','submit','ログイン');

どなたかわかりませんか?


4 ● vector
●20ポイント

環境はPHP4でしょうか?

であれば、


function login_screen(&$option){

$form = &$option['form'];

$smarty = &$option['smarty'];

}


PHP4ではクラスのコピーの仕方がPHP5とは違うため、

$form = $option['form'];

としても、ディープコピーになるため、違うオブジェクトになります。


また同様に、引数も参照で渡さないとコピーされたオブジェクトが渡ってしまいます。


5 ● tobeoscontinue
●20ポイント

smartyはsection72-81/php_libs/config/config.inc.phpの

define( "_SMARTY_TEMPLATES_DIR", _PHP_LIBS_DIR . "smarty/templates/");

define( "_SMARTY_TEMPLATES_C_DIR", _PHP_LIBS_DIR . "smarty/templates_c/");

define( "_SMARTY_CONFIG_DIR", _PHP_LIBS_DIR . "smarty/configs/");

define( "_SMARTY_CACHE_DIR", _PHP_LIBS_DIR . "smarty/cache/");

とあるように4つのディレクトリーが必要です。内_SMARTY_TEMPLATES_C_DIRと_SMARTY_CACHE_DIRは書き込み権限が必要です。(php_sampleにはこれらが無い)

書き込む場所がないためsmartyはlogin.tplを展開することができず、そのまま出力しているのではないでしょうか。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ