PHP Smartyに関する質問

このQ&Aのポイント
  • PHP Smartyについて質問です。DBで保存しているコンテンツをSmartyのコンパイラに通す方法はありますか?
  • 質問内容は、レイアウトファイル(main.tpl)に配置されている特定のタグを、DBのデータで置換したいというものです。
  • 一般的な方法としては、tplファイルにDBのコンテンツを書き出し、Smartyのfetchメソッドで読み込む方法がありますが、DBから直接コンパイルしたい場合にはどうすれば良いでしょうか?
回答を見る
  • ベストアンサー

PHP Smartyについて質問です。

レイアウトファイル(main.tpl)にタグを配置し そのタグをあるデータに置換したいと考えています。 例えば、以下のような感じです。 ~~~ main.tpl ~~~~~~~~~~~~~~~~ <html> <body> <div id="header">ヘッダー</div> <div id="nav">ナビゲーション</div> <div id="contents">#CONTENTS#</div> <div id="footer">フッター</div> </body> </html> ~~~~~~~~~~~~~~~~~~~~~~~ 上記の「#CONTENTS#」の部分をDBで保存している コンテンツに置換したいのですが {if}構文や{$hoge}などのSmartyタグが文字列として出力されてしまいます。 何か無理やりDBのデータをSmartyのコンパイラに通すメソッド等ありませんでしょうか? もしくは、他のやり方で何かいい方法はありませんでしょうか? DBで保存している部分をtplファイルにして、$smarty->fetch("fuga.tpl"); 等で読みだせば 解決するんですが、どうしてもこのコンテンツ部分はtplファイルにはせず DBから直接コンパイルしたいのです。 どなたかご教授くださいませ。 よろしくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

それっぽいの発見 http://www.smarty.net/docs/ja/template.resources.tpl 「文字列からのテンプレート」 この辺じゃないかな?僕自身やったことないけどw

chris2525
質問者

お礼

ご回答ありがとうございます。 なるほど、やはりテンプレートを一度書き出してそれを読み込むしかなさそうですね。 参考URLもありがとうございます! 一度こちらのメソッドをざっと読んで、出来なさそうであればファイルを作成し、それを読み込ませる事にします(^o^) muuming2001さん、色々と教えてくださいましてありがとうございましたm(_ _)m

その他の回答 (3)

回答No.3

>>$db_contentsに含まれている{if}構文や{foreach}構文 やっと状況を理解しました。 そんなことやったこと無いなぁ。 無難に考えるなら、一旦一時ファイルとして書きだして、それをテンプレートとして読み込むかなぁ。 http://www.smarty.net/docs/ja/api.functions.tpl ここらへん読み込んだら、多分 その{if}やらが出てるデータをテンプレートデータとして直接読み込ませることも 多分出来ると思う。(予想です・・・

chris2525
質問者

お礼

ベストアンサー後にすみません(汗) 今までヤフ知恵しか使ったことがなかったので使い方が・・・ 出来ました! 先ほどmuuming2001様が教えてくださった「文字列からのテンプレート」の箇所を見て、バッチリ期待通りの動きをしてくれました! 本当にありがとうございます(T_T)

回答No.2

んん???? 普通に $smarty->assign(~~~) じゃダメなのかな? #CONTENTS# の部分をスマーティー向けに{$contents}とかに書き換える必要はあるけど。

chris2525
質問者

お礼

ご回答ありがとうございます。 #CONTENTS#の部分をおっしゃられた通り、$contents}に書き換え、以下の文も書き足しました。 $smarty->assign('contents', $db_contents); するとキレイに置換されたのですが、$db_contentsに含まれている{if}構文や{foreach}構文が評価されずに、そのまま文字列として出力されてしまいます。 これを回避するにはやはりDBに保存せず、tplファイルとして保存して読み込むしかないですかね(T_T) なお、先ほどの補足の末尾にて echo $db_contents; と記述しましたが echo $contents; の誤りです、申し訳ありません。

回答No.1

ご質問の意味をもう少し教えてくだし。 画面表示のHTMLはPHPなどの動的プログラムを通さず静的に表示して、 ページ内の一部のデータのみを差し替える形を取りたいということでしょうか?

chris2525
質問者

補足

説明不足でした、申し訳ありません。 画面表示のHTMLはPHPプログラムを通して、表示しようと思っています。 ちなみに置換プログラムはこのような感じです。 $db_contents; # データベースから取得した置換用データ $layout = $smarty->fetch('main'); # $contents = str_replace("#CONTENTS#", $db_contents, $layout); echo $db_contents; よろしくお願いいたします。

関連するQ&A

  • smartyについて

    smartyにでサイトを作る際のテンプレート構造について質問です。 現在はindex.phpで $smarty->display('hoge.tpl'); としhoge.tplは {include file="./common/header.tpl"} <div id="contents"> {include file="./common/left_side.tpl"} <div id="center"> ここに表示する内容 </div> {include file="./common/right_side.tpl"} </div> {include file="./common/footer.tpl"} のようにしています。 表示する内容はそれぞれ違うものの全てではありませんがincludeする tplは他のページもほぼ同様ですのでもっと効率的にできるのでは?と 思うのですがどんな方法があるでしょうか?

    • 締切済み
    • PHP
  • PHP+smartyで文字化け

    PHP+smartyでサイトを作成し始めました。(以下URL) http://babyitem.info/ PHPファイル、テンプレート共に、文字コードはEUCで作成しています。 サーバーは、ロリポップをレンタルしています。 index.phpは以下の通りです。 ----------------------------------------------------------- <?php $contents_title="ベビーアイテム.info"; $tpl->assign("contents_title",$contents_title); $tpl->display("babyitem.tpl"); ?> ----------------------------------------------------------- babyitem.tpl(上記サイト左の部分)は以下の通りです。 ----------------------------------------------------------- <div id="left"> <div class="left_top">{$contents_title}</div> <div class="left_bottom"></div> </div> ----------------------------------------------------------- テンプレートファイルの{$contents_title}に 「ベビーアイテム.info」という文字をassignしているのですが、 文字化けして表示されてしまいます。 ちなみに、「babyitem.info」という文字をassignすると、 そのまま、「babyitem.info」と表示されます。 正しく表示する為には、どの辺りの設定を確認すれば良いでしょうか? ご教授くださいませ。

    • 締切済み
    • PHP
  • Smarty includeでテンプレートを読み込めない

    よろしくお願いします。 まずphpファイルから $smarty->display('111/body.tpl');(*111はディレクトリ名) を呼び出して、さらにbody.tplと同ディレクトリにあるcontents.tplを読み込もうとしています。 はじめのbody.tplは読み込むことができブラウザで表示されるのですが、contents.tplは読み込めず、 Warning: Smarty error: unable to read resource: "contents.tpl" in <絶対パス>/Smarty/Smarty.class.php on line 1095 のエラーが出てしまいます。 ちなみに/111/というディレクトリは、$template_dir以下、$template_dir/111/です。 {include file="contents.tpl"} {include file="file:contents.tpl"} {include file="絶対パス/contents.tpl"} {include file="file:絶対パス/contents.tpl"} など試しましたが、ダメでした。 知恵をお貸しください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP+smartyで困っております。

    今までASPで開発をおこなっておりましたが、PHPを勉強中のPHP初心者です。 さて、smartyでの表示ですがどうしてもうまくいきません。 $smarty->assign("info",manage::getinfo(18,$a_db)); $smarty->display("comp_regist2.tpl"); で、smartyを利用したいのですが、値が表示されません。 {debug} にて下記値がわたされているのは確認しております。 Array (1) 0 => manage Object (2) _id => 18 _company_name => AAA店 tplファイルに、下記内容を記入してみましたが、表示されません。 {$info._id|escape}<hr> {$info._company_name|escape}<hr> {$_id}<hr> {$_company_name}<hr> {debug} {$info._id} {$info._company_name} 丸二日、、、こんなところではまっております。 お教えいただけませんでしょうか?

    • ベストアンサー
    • PHP
  • PHP4.3.9+smartyのsessionについて

    お世話になります。 PHPで、ログイン画面・入力画面・登録を作りたいと思ってます。 手始めにsessionをクッキーを使わずに使用したいと思い簡単に作ってみました。 login.phpの記述(ログイン) $smarty=new SubSmarty; session_start(); $_session[] $_session["id"]='abcde'; $smarty->display("insert.tpl"); nyuryoku.tpl <html> <head> </head> <body> {$smarty.session.id} </body> <html> この時点でsessionの中身が見れません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • smartyについて

    smartyについて 環境は、windows /php-5 / smarty-2.6.17です。 以下の2つエラーが出てどう対処すればいいか困っています。 【1つめ】 Fatal error: Smarty error: [in **.tpl line 10]: syntax error: unrecognized tag: 文--> 【2つめ】 {$errmsg (Smarty_Compiler.class.php, line 446) in C:\xampp\php\PEAR\Smarty\libs\Smarty.class.php on line 1095 【ソース】 呼び先PGは、 $this->smarty->assign("errmsg","ニックネーム"); $this->smarty->display("**.tpl"); テンプレートでは、 <tr id="" class=""> <td id="" class=""><font color="#ff0000">{$errmsg}を入力してください。</font></td> </tr> よろしくお願いいたします。

    • 締切済み
    • PHP
  • Smartyのセレクトボックスが書けない;;

    情けないことにSmartyをはじめて使ったせいか Selectが書けません。どうやって書けばよいのでしょうか? dbはSqlite3を使っています。 カテゴリーというセレクトボックスにid、categoryの値を foreachで回転させて入れる理屈です。 http://mylearning.jugem.jp/?eid=13 foreachを100%わかっていないのもありますし、tplファイルにも foreachを使いたいところです。html_optionsはあえて 使っていません;; Smartyを使わないでblogや掲示板は作りました。 ソースごと詳しく教えてもらえるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • cssに関する質問です。

    cssに関する質問です。 フッターをbodyタグの直後に置きたいのです。 そうするとフッターはbodyタグの直後に表示されてしまいます。 cssでフッターだけをホームページの最後に表示する方法はありますか。 <body> <div id="footer">フッター ホームページの一番下に表示したい。</div> <div id="content>ホームページの内容 フッターよりも上に表示したい。</div> </body> CSSハックのような方法でも構いませんが、実現方法があれば教えてください。 よろしくお願いします。

  • PHPとSmartyを使い、データベースからのデータを表示したい。

    PHP・Smartyを使い、DBからの表示を行おうとしています。 基本的な作業だとは思うのですが、なかなかできないので、教えてください。 ソースコードです。 //////PHPのコード <?php require_once('Connections/dbconn_mylocal.php'); ?>//DBへの接続を行っている。ここは正常。 <?php $sql = 'SELECT * FROM c_movie'; $result = mysql_query($sql, $conn); while($row = mysql_fetch_array ($result)){ $movie = $row["movie_title"]; } $smarty->assign('movie', $movie); $smarty->display("test1120.tpl"); ?> /////////////////tplファイル <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Smartyで表示する</title> </head> <body> ({foreach item='con' from=$movie}) ({$con}) ({/foreach}) </body> </html> よろしくお願いします!

    • ベストアンサー
    • PHP
  • PHP(smarty)についての質問(文字化け)

    あるサイトでsmartyを勉強中ですが、そのサンプルファイルを実行したところ、 文字化けが発生して困っています。 ・form.php←お問い合わせ用テンプレートファイルの指定 ・form.tpl←お問い合わせ情報を入力させるテンプレートファイル ・template.tpl←テンプレートファイルを表示させるテンプレートファイル form.phpから、お客様情報を入力させるためのテンプレートファイル(form.tpl)を指定し、 template.tplにそれを表示させるのが処理概要です。 実行すると、タイトルの"問い合わせフォーム"は表示されますが、 それ以下のform.tplの日本語部分が文字化けします。 template.tplで{include file=$content_tpl params=$params}の処理で form.tplを取り込んでいますが、その時文字コードがおかしくなっている気がします。 form.tplに対して文字コード(UTF-8)が有効になっていないと思われます。 実験的に、{include file=$content_tpl params=$params}を削除して、 そこにform.tplの記載をすべて記述すると文字化けは起こりませんでした。 文字コードの指定をform.tplに対しても有効にするにはどのように修正すればよろしいでしょうか。 以下にソースファイルを記載します。 ★form.php <?php // 共通の設定を読み込む require_once( 'common.php' ); // Smartyオブジェクト取得 $smarty =& getSmartyObj(); // ひな形のSmartyテンプレートでincludeするテンプレートを指定 $smarty->assign( 'content_tpl', 'form.tpl' ); // パラメータを渡す $smarty->assign( 'params', array( 'types' => array( 'request' => '意見、要望', 'question' => '質問、問い合わせ', 'other' => 'その他' ) ) ); // ページを表示する $smarty->display( 'template.tpl' ); ?> ★form.tpl <p>お問い合わせやご意見・ご要望を以下のフォームにご記入の上ご送信ください。</p> <form method="post" action="post.php"> <dl> <dt>お名前</dt> <dd> <input type="text" name="name" value="{$params.name|escape:'html':'UTF-8'}" /> {if $params.errors.name} <p class="error-message">名前を入力してください。</p> {/if} </dd> <dt>メールアドレス</dt> <dd> <input type="text" name="address" value="{$params.address|escape:'html':'UTF-8'}" /> {if $params.errors.address} <p class="error-message">アドレスが不正です。</p> {/if} </dd> <dt>お問い合わせ種類</dt> <dd> {html_options name="type" options=$params.types selected=$params.type} {if $params.errors.type} <p class="error-message">お問い合わせ種類が不正です。</p> {/if} </dd> <dt>お問い合わせ件名</dt> <dd> <input type="text" name="title" value="{$params.title|escape:'html':'UTF-8'}" /> {if $params.errors.title} <p class="error-message">件名を入力してください。</p> {/if} </dd> <dt>お問い合わせ内容</dt> <dd> <textarea name="content" cols="60" rows="5"> {$params.content|escape:'html':'UTF-8'} </textarea> {if $params.errors.content} <p class="error-message">お問い合わせ内容を入力してください。</p> {/if} </dd> </dl> <input type="submit" value="送信する" /> </form> ★template.tpl <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>問い合わせフォーム</title> <style type="text/css"> {literal} .error-message{ margin:5px; font-size:80%; color:red; } {/literal} </style> </head> <body> <h1>問い合わせフォーム</h1> {include file=$content_tpl params=$params} </body> </html> ★common.php <?php define( 'SMARTY_DIR', 'C:/xampp\php/smarty/libs/' ); require_once( SMARTY_DIR .'Smarty.class.php' ); // Smartyオブジェクト取得 function & getSmartyObj() { static $smarty = null; if( is_null( $smarty ) ){ $smarty = new Smarty(); $smarty->template_dir = 'C:/xampp/php/smarty/templates/'; $smarty->compile_dir = 'C:/xampp/php/smarty/templates_c/'; $smarty->config_dir = 'C:/xampp/php/smarty/configs/'; $smarty->cache_dir = 'C:/xampp/php/smarty/cache/'; } return $smarty; } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう