トップページphp
983コメント287KB

【Smarty】PHPのテンプレートエンジン【Flexy】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2005/06/15(水) 10:35:52ID:???
---
PHPのテンプレートエンジンを語るスレです。

Smarty:本家(英語)
http://smarty.php.net/
Smarty:日本語マニュアルとか
http://sunset.freespace.jp/smarty/

pear の HTML_Template たち
http://pear.php.net/package/HTML_Template_Flexy
http://pear.php.net/package/HTML_Template_IT
http://pear.php.net/package/HTML_Template_Sigma
http://pear.php.net/package/HTML_Template_Xipe
http://pear.php.net/package/HTML_Template_PHPLIB

patTemplate
http://www.php-tools.de/
http://www.php-j.com/tutorial/php/template.php

前スレ(現在dat落ち)【PHP】Smarty【Template】
http://pc8.2ch.net/test/read.cgi/php/1047225437/
0739nobodyさん2007/01/18(木) 10:28:23ID:???
Smartyってファイル単位でキャッシュの有効期限制御していたっけ?
0740nobodyさん2007/01/18(木) 10:46:18ID:???
>>737
特に設定する必要はないと思うけど

Smarty.class.php の _compile_resource メソッドがどんな動きをしているか
見たほうがいいかも
0741nobodyさん2007/01/18(木) 14:39:41ID:???
smartyの
section内で$hoge[$foo]みたいなことしたいのですが、どのようにやれば出来ますでしょうか?

{section name="val" loop=$data}
 {$hoge.$foo[val].name}
{/section}
でできませんでした…
0742nobodyさん2007/01/18(木) 16:32:29ID:???
>>738
キャッシのexpiresんとこのタイムスタンプ書き換えれば延ばせる

なぜそんなことがしたいのか分からないけど
0743nobodyさん2007/01/18(木) 17:06:50ID:???
HTML_Template_Flexyのテンプレートに
{hoge}
と書いたら、php側のhoge変数の中が展開されると思いますが、
これを、
{hoge}そのものを出力したい場合、テンプレートにどう書けばよいでしょうか?

\{hoge\}
とか
{{hoge}}
とか試してみたんですが、無理でした…。
0744nobodyさん2007/01/18(木) 17:26:18ID:???
?#123;hoge?#125;
とか
0745nobodyさん2007/01/18(木) 17:28:28ID:???
あら失敗
?は&ね
0746nobodyさん2007/01/18(木) 17:32:04ID:???
デリミタを変えたらダメなの?
0747nobodyさん2007/01/18(木) 17:48:50ID:???
>>744
{hoge}
と出すのは無理すかね?
なぜかというと、これをファイルに出力して、またFlexyのテンプレートとして食わせたいのです。


>>746
{hoge}
を、通常通り置換したい場合もあるので、デリミタそのものを変えるのではまずいのです。

お二人ともレスありがとう。
説明不足ごめんなさい。
0748nobodyさん2007/01/18(木) 18:26:03ID:u6x8DYYx
テンプレート中からPHP関数を利用して、
オブジェクトの生成をし、
Smartyのassign関数にアクセスするメソッドを利用しようとすると、
 Fatal error: Call to a member function assign() on a non-object
 in C:\Program Files\Apache Group\Apache2\htdocs\test\index.php on line 7
と返されてしまいます。
ならべく、テンプレート内にPHPを書きたいのですが、
(本来のSmartyの利用意図に背くのは重々承知です。)どうすればよいでしょう。

--index.php
<?php
require_once('Smarty/libs/Smarty.class.php');

class Headline{
public $oSmarty;
public function __construct($oSmarty){$this->oSmarty=$oSmarty;}
public function get_data(){$this->oSmarty->assign("test","テスト");}
}

$oSmarty=new Smarty();
$oSmarty->template_dir='./templates/';
$oSmarty->compile_dir='./templates_c/';
$oSmarty->display('test.tpl');
?>
--test.tpl
test
{php}$oHeadline=new Headline($oSmarty);$oHeadline->get_data();{/php}
{$test}
0749nobodyさん2007/01/18(木) 18:59:08ID:???
>>747
{ldelim}hoge{rdelim}
マニュアル嫁よ
0750nobodyさん2007/01/18(木) 19:06:24ID:???
>>748
> {php}$oHeadline=new Headline($oSmarty);$oHeadline->get_data();{/php}

new Headline($GLOBALS['oSmaert']);
ってするとどうだろう。
0751nobodyさん2007/01/18(木) 19:18:16ID:???
>>749

それ、Smartyの話じゃ…。
0752nobodyさん2007/01/18(木) 19:44:35ID:???
>>742
なるへそ。さんくし。
データの取得に失敗した場合に備えて、そうしようとしただけなんだに
07537482007/01/18(木) 20:03:22ID:???
>>750
出来ました!
本当にありがとうございました。
0754nobodyさん2007/01/18(木) 20:25:33ID:???
>>751
すまん...orz
07557432007/01/18(木) 20:33:24ID:???
>>754

でも、まぁ意味はそういうことです。
Smartyでいうところのそれに当たるものが、HTML_Template_Flexyでありませんか?
ってのが聞きたかったんです。
なんか無さそうな雰囲気ですね…。
0756nobodyさん2007/01/18(木) 20:59:51ID:oKlCOyd1
{smarty_header http_equiv="Content-Type" content="text/html"}
<?xml version="1.0" encoding="EUC-JP"?>

このように、XML宣言の前に関数を使うと、XML宣言の前に
空行が出力されてしまいます。これはXHTMLにおいて致命的な文法エラーになってしまいます。

smarty_header関数は header() でHTTPヘッダを出力するだけだし、
プラグインファイルは終了タグの '?>' を省略しているので文字列は出力していないはずです。

コンパイルされたファイルを見てみたら以下のようになっていました。
<?php echo smarty_function_smarty_header(array('http_equiv' => "Content-Type",'content' => "text/html"), $this);?>

<?php echo '<?xml'; ?>
version="1.0" encoding="EUC-JP"<?php echo '?>'; ?>
07577412007/01/18(木) 21:21:15ID:???
やっぱりこんな複雑なことはできないのでしょうか??
お願いいたします
0758nobodyさん2007/01/18(木) 21:57:19ID:???
>>757

> {section name="val" loop=$data}
> {$hoge.$foo[val].name}
> {/section}

{$hoge[$foo[$val]].name}
でどぉだ。

>>749では完全に寝惚けてて、>>750でもtypoしているグダグダな状態なんで
イマイチ思いだせんのだが、これでダメならバッククォートを使ったりかどうかで
出来たはず。
0759nobodyさん2007/01/19(金) 00:36:20ID:???
>>755
多分無理だと思う。メソッドを介した方が早いんじゃない?

function p($flexyVar) { return "{". $flexyVar ."}"; }

{p(#hoge#)}
{p(#hoge.bar:h#)}

##の中に#だけはどうやっても書けないから、
メソッド呼び出しを書きたいならもう少し工夫が要るけどね。
0760nobodyさん2007/01/19(金) 02:12:14ID:???
>>756
header();ってどこに書いてもよかったような気がするんだけど
1行目と2行目を入れ替えるのはだめ?

だめなら改行せずにxml宣言も1行目に書くか{strip}{/strip}
stripが誤作動するならliteralで
0761nobodyさん2007/01/19(金) 17:36:16ID:???
>>756
smarty の仕様だね
>>760も書いているけど、改行せずに1行に書くようにしないとだめっぽい
0762nobodyさん2007/01/21(日) 17:04:32ID:???
smartyの出力のときに自動的にサニタイズさせるにはどうすればいいですか?
0763nobodyさん2007/01/21(日) 18:54:55ID:???
ttp://sunset.freespace.jp/smarty/SmartyManual_2-6-7J_html/variable.default.modifiers.html
この辺かな?
テンプレートそのものをサニタイズしたいのならちょっと仕掛けが必要かも
0764nobodyさん2007/01/21(日) 18:58:33ID:???
助かりました、ありがとうございます。早速やってみます
0765nobodyさん2007/01/21(日) 19:04:19ID:???
>>763
再度で申し訳ありませんが、foreachを使っているせいか
Warning: htmlentities() expects parameter 1 to be string, array given
となって表示されませんでした・・・。
{$hoge}と出しているところだけエスケープしたいのですが、そういう方法はあるんでしょうか?
0766nobodyさん2007/01/22(月) 01:04:33ID:???
default_modifiersは配列でもオブジェクトでも何でもかんでも適用しようとするからイマイチ使えない
Smartyにサニタイズさせたいのなら普通に修正子を指定するか、nodefaultsを使うか
ソースいじってdefault_modifiersの挙動を変えるかしかないと思う
0767nobodyさん2007/01/22(月) 08:35:06ID:???
>>766
文字列ならエスケープ、配列なら無視する修正子をつくって指定するのがいいかと。
0768nobodyさん2007/01/22(月) 09:02:22ID:???
そもそもテンプレートにある要素全てを
自動でHTMLエスケープするってのは良くないような
必要ないもんにまでかけちゃうし無駄なオーバーへッドにもなるし
0769nobodyさん2007/01/22(月) 13:06:55ID:???
>>766-768
皆さんありがとうございます。
とりあえず自分で修正子作ってやってみます。
ちなみにこういった方法は一般的ではないんでしょうか?
0770nobodyさん2007/01/22(月) 16:09:32ID:???
Smartyを最近勉強しはじめました。
凄く単純な事ですが、いろいろ調べたのですが、どうしても実現できなくて質問させていただきます。

テンプレートから外部テンプレートを組み込む時に、
{include file="/root/dir/html/templates/XXXX.tpl"}
といった感じに記述しますが、この中で、変数を使いたいのです。

"/root/dir/html/templates/"の部分を変数に変えて、ディレクトリ構造を一元化して管理したいのです。
PHPの構造でいうと、"{$base_dir}/XXXX.tpl"と言った感じで、
ディレクトリ構造が変わっても、ファイルを直接弄ることなく、変更できるようにしたいのですが、やり方がわかりません。

つまり、呼び出し元のPHPプログラムで設定ファイルを読み込み、テンプレートの保存されているディレクトリ構造を読み取り、
それをテンプレートファイルに渡して、その渡した値を元に外部テンプレートを呼び出すようにしたいのです。

これを実現するには、どのように記述したらよろしいのでしょうか?
0771nobodyさん2007/01/22(月) 16:18:33ID:???
すみません。書き忘れました。
ディレクトリ構造の値は配列で渡したいのです。

$dir['base']="/root/dir/html/templates";
$smarty->assign("dir",$dir);

と言った感じでわたして、テンプレートの中で

{include file="$dir['base']/XXXX.tpl"}

と言った感じで仕様したいのですが、上記のコードを書くと以下のエラーが出て使えませんでした。

Warning: Smarty error: unable to read resource: "Array['base']/header.tpl" in /xxx/yyy/html/libs/Smarty.class.php on line 1095

根本的な記述方法の間違いかもしれませんが、宜しくお願いいたします。
Apache2
PHP5
Smarty2.6.16
の環境で勉強しております。
0772nobodyさん2007/01/22(月) 17:04:54ID:???
dir.base
0773nobodyさん2007/01/22(月) 17:41:46ID:???
>>772
すみません。それでも同じエラーが出てしまいます。

dir.base
Warning: Smarty error: unable to read resource: "setting.base/header.tpl" in /xxx/yyy/html/libs/Smarty.class.php on line 1095

$dir.base
Warning: Smarty error: unable to read resource: "Array.base/header.tpl" in /xxx/yyy/html/libs/Smarty.class.php on line 1095
0774nobodyさん2007/01/22(月) 18:16:45ID:Eh2tk1di
>>773
{include file="`$dir.base'/xxxxx.tpl"}

`(バッククォート)で $dir.base をくくらないと、どこまでが変数か
Smarty が解釈できなくなっている
0775nobodyさん2007/01/22(月) 18:17:38ID:???
{include file="`$dir.base`/xxxxx.tpl"}
0776nobodyさん2007/01/22(月) 18:18:43ID:???
おっと、間違えた。
後ろが`になっていなった
>>775
が正解だな
0777nobodyさん2007/01/22(月) 18:19:08ID:???
>>774
ありがとうございます。
無事、実行できました。

いろんなサイトを見て回ったのですが、バッククォートのことは初めて知りました。
本当に勉強になりました。ありがとうございました。
0778nobodyさん2007/01/22(月) 18:20:06ID:???
>>775
>>776
わざわざ、お手間をとらせてしまいすみません。
本当にありがとうございます。
0779nobodyさん2007/01/22(月) 18:21:56ID:???
>>777
http://sky.freespace.jp/smarty/SmartyManual_2-6-7J_html/language.syntax.quotes.html
0780nobodyさん2007/01/22(月) 18:26:12ID:???
>>779
すみません。。。お返しする言葉もございません。
そのマニュアルも一応目を通したつもりでいたんですが、、、

日々精進していきます。
0781nobodyさん2007/01/23(火) 13:44:19ID:???
なんかくだらねぇ質問スレでやたらSmartyを押している奴がいるから、
このスレにPHPのイロハも知らないバカが押し寄せてくる悪寒が…
0782nobodyさん2007/01/23(火) 21:29:12ID:???
(略
0783nobodyさん2007/01/25(木) 04:27:39ID:???
デザイナーがSmartyのtplを大量に作り上げてくれたんですが、
こういう場合でフォーム系のタグに変数埋める作業でもやはりシコシコと手作業するしかないんでしょうか。
宜しくお願い致します。
0784nobodyさん2007/01/25(木) 10:19:51ID:???
>>783
スクリプト書いて一括処理。
0785nobodyさん2007/01/25(木) 12:16:15ID:???
>>783
You, Flexy 使っちゃいなよ。
0786nobodyさん2007/01/26(金) 20:07:41ID:???
smartyで
{$hoge[$foo->getId()]}
とやると
syntax error: unrecognized tag:
が出るのですが,このようにやりたい場合はどうすればいいでしょうか?
0787nobodyさん2007/01/26(金) 20:10:51ID:iZlZkVla
お願いします
0788nobodyさん2007/01/27(土) 10:35:51ID:e0oRsoDR
idをassignしちゃえば?
まんどくせえけど
0789nobodyさん2007/02/02(金) 12:06:02ID:???
>>770と全く同じことで悩んでました
バックスラッシュは試したんだけど $`hogehoge`と囲ってたのでエラーでした
まさか`$hogehoge`とするとは… PHPでは${hogehoge}なのに…

>>770とそれに回答していただいた皆さんに感謝です
07907892007/02/02(金) 12:16:25ID:???
×バックスラッシュ
○バッククォート

…なんて勘違いを…アホですいません
0791nobodyさん2007/02/02(金) 15:29:41ID:???
smartyでswitch文って使えないんですか?
0792nobodyさん2007/02/02(金) 22:13:51ID:???
{if}{elseif}でつなげばええんちゃうん。
0793nobodyさん2007/02/02(金) 22:30:25ID:???
プラグイン書けば使える
PHPのコードをベタ書きすれば使える

なるべくロジックをテンプレートに入れないように
処理を変える方がいいと思うけどな
0794nobodyさん2007/02/02(金) 22:38:39ID:???
うむ、テンプレート側でにswitchがどうしてもないと困るような状況なら
それはロジック側や構成を見直した方が良いっていう警告
0795nobodyさん2007/02/02(金) 22:42:07ID:???
じゃあユーザ種別で表示するメニューを変更させる場合は、どこで分岐するのがいいんでしょうか?
0796nobodyさん2007/02/02(金) 23:07:42ID:???
そのユーザ種別であらかじめメニュー部分の
テンプレートパーツ名を決めて、メインのレイアウトテンプレートから
includeするファイルを変えるとか色々方法あるんじゃない?
0797nobodyさん2007/02/03(土) 01:08:18ID:???
ユーザ種別メニューアイテムをコントローラから押し込むか、
モデルから引っ張ってくるかのどちらかじゃね。
ビューで切り替えるもんじゃないような気がするが。
0798nobodyさん2007/02/06(火) 20:28:11ID:adz0uOuq
質問です。phpBB2が使用しているフレームワークってなんていうフレームワークなんでしょうか?
いま、phpBBのソースコードを解読・勉強していて疑問になりました。
0799nobodyさん2007/02/08(木) 13:37:11ID:???
>>798
独自じゃないの

ネタとしてはスレ違いだよ
0800nobodyさん2007/02/15(木) 19:29:02ID:t/XW6gI0
smartyでの演算時に、計算を優先する括弧ってどう書けばいいのかな?

(3 + 2) * 5

みたいな感じなんだけど。
0801nobodyさん2007/02/15(木) 20:54:32ID:???
`(3 + 2) * 5`でできない?
0802nobodyさん2007/02/16(金) 10:58:20ID:qBGQeHi7
>>801

それがうまくいかないんですよね。

{if '($smarty.foreach.loopname.iteration-9)%3'==0}

こんな感じで処理を行いたいんのですが。
0803nobodyさん2007/02/16(金) 11:01:05ID:???
>>802
[ ' ] じゃなくて [ ` ]
08048002007/02/16(金) 11:16:20ID:qBGQeHi7
よくわからないけど、いろいろやって、以下のやり方で出来ました。

{if ($smarty.foreach.hobbyloop.iteration-9)%3==0}

自分の勘違いだったぽい。レスサンクスでしたー。
0805nobodyさん2007/02/22(木) 22:23:52ID:???
煽りじゃなくて、Smarty勉強してて思ったんだけど、
テンプレートファイルに
{if $item <0} 〜HTML〜 {/if}

って書くのと

<?php if($item <0 ){ ?>
〜HTML〜
<?}?>

って書くのと、基本的にテンプレートの中身は変わらない事無いか?
WEBデザが使いやすいだろうと思ってSmartyでデザインとソースを分離
しようと思ってたんだけど、テンプレートにSmartyのソースが入るんだから
やっぱり、PHPの知識がいるわけで、普通にPHPのソース書くのと違わない
気がするんだけどな・・・。他にメリットある?
0806nobodyさん2007/02/22(木) 22:25:33ID:???
>>805
>WEBデザが使いやすいだろうと思ってSmartyでデザインとソースを分離しようと思ってたんだけど

もうわかっただろ?それをやるにはSmartyだけじゃ無理だって事だ。
0807nobodyさん2007/02/22(木) 22:35:26ID:???
俺は表側っつかwebのツラのほうを作る側だから、php系のサイトで
うっかりロジック部分を触って壊したりしないかと常々おびえてて、
そんでsmartyの勉強始めたとこです。

今は1by1の分業体制だけど、これから人増やす可能性も高いので
コード側やってる相方さんも、自分がざっくりphpでプロト書いて
俺にデザインをつけさせる、という路線だとメンテ性とか可読性の面で
もう限界だと思っているみたい。

逆に言えばそういうコラボ体制とかでなければ、php直書きのほうが
効率いいのかもしれないなあ。
08088052007/02/22(木) 22:45:21ID:???
>>807
デザ側の立場として質問なんだが、

>うっかりロジック部分を触って壊したりしないかと常々おびえてて、

って書いてるけど、現在は勉強してある程度PHP使えるようになったの?
それとも、完全にソースの部分は触らないようにしてるの?

だいたい、テンプレートと言ってもヘッダーとフッターを分けてincludeする
ようにしている場合が多いし、そんなんじゃ、Dreamweaverでも編集しづらいし、
デザ側のメリット無いと思うんだよな。

他スレとかでやたらこういう話が出てきたり、オブジェクト指向とか言われるけど、
それが他の人間と共同作業する上で、本当に役立つのか疑問に思えるんだよ。
もちろん、出来て困らないだろうけど、807のように、スキルを学ぶ必要あるしさ。
0809nobodyさん2007/02/22(木) 23:11:43ID:???
>>808
一応変数追っかけてデバッグとか、DB自体のフィールドを増やさないような
簡単な書き足しぐらいはしてます。でも、やっぱりphpのソースのなかに
丸裸でいろんなものが散らばってるのは神経使います。冒頭に分離されてるなら
まだマシだけど、if文で配列をあるだけテーブル化して表示、みたいな奴だと、
html部のど真ん中に来ちゃいますし。

トラブルが起きたときにどっちが悪さしたのかわかりにくいし、片方が
(他人もDWで編集していることを前提にコラボ系機能が作り込まれている)
DWで、もう片方がテキストエディタで「同じファイルを」いじる、というのも、
作業的にはちと筋が悪いと思ってます。

includeは積極的に使っていきたい仕掛けではありますが、確かに
CSSベースでもテーブルベースでもDWでの編集が困難になるのですよね。
「head部はinclude・その他はDWのライブラリ」というスタンスの方が
web系の人員を増員する方針で考えるなら、むしろ好ましいのかな。
0810nobodyさん2007/02/22(木) 23:19:43ID:???
ロジックとデザインの分離は、現実的な問題として *完全には* 無理だと思うな。

でも、テンプレートタグはHTMLデザイナ向けに簡単な設計となっているはずだから
PHPコードをベタ書きするよりはマシかなって。
0811nobodyさん2007/02/22(木) 23:44:06ID:???
>>809
なるほど。ま、やっぱりデザイナー側も勉強する必要はあるって事だな。
>>810
>>805のようなソースの場合、べた書きするのと、{}で囲ってsmarty方式に
するのと、違いがあんまり無いと思うんだよな。
まぁ、forearchとかsmarty方式の方がソースは短くなるけどさ。
0812nobodyさん2007/02/23(金) 01:12:03ID:???
>>805
そうそうあんまり変わらないと思う。むしろ「 { 」入れてエラー出て困ってたデザイナさんも居た。
でもhtmlソースに出ない{* 〜 *}形式のコメントは活用できると思う。
0813nobodyさん2007/02/23(金) 01:15:09ID:CtBpLmme
HTMLをプログラマーの物にすればいいんじゃね?
0814nobodyさん2007/02/23(金) 01:43:49ID:???
>>805
うちの場合ケースバイケースだけど
表示するか否かというフラグを渡しておいて
{if $hasItem}表示内容{/if}
と出来るようにしたり
条件が複雑だったりよく使うような物だったら
ブロック関数作って
{logined}
ログイン時用の表示
{/logined}
みたいに出来るだけ単純に書けるようにしてるよ

オーサリングツールとの連携は難しいね
Flexyとかだとなんとかなるのかなと思うけど
0815nobodyさん2007/02/23(金) 14:43:40ID:???
Smartyは、他のテンプレートエンジンに比べると
何倍も遅いって聞くんだけど、そんなに大きな差があるの?
0816nobodyさん2007/02/23(金) 14:44:56ID:???
>>815
我慢出来ないほどじゃないだろwww
0817nobodyさん2007/02/23(金) 15:03:37ID:CtBpLmme
>>815
我慢できなきゃ、Zend Optimizer入れれば。
0818nobodyさん2007/02/26(月) 01:47:05ID:???
smartyのテンプレートのHTTPヘッダを変えることはできないのでしょうか?
テンプレートでCSVファイルを作り、それをダウンロードさせるようなことがしたいのです。

少し上の方に書いてあったsmarty_headerという関数をテンプレートに埋込んでみたのですが、
エラーが発生(関数が存在しない)し、使うことができませんでした。
0819nobodyさん2007/02/26(月) 11:02:48ID:???
>>818
fetchしてecho
0820nobodyさん2007/02/26(月) 11:17:58ID:???
>>818
>エラーが発生(関数が存在しない)し、使うことができませんでした。
プラグイン関数用ディレクトリのパスが通ってないだけだろ。
0821nobodyさん2007/02/26(月) 11:23:33ID:???
smarty_header なんてなかったと思うぞ
上のやつは自分で作ったプラグイン例としてsmarty_headerって
書いていたと思う
08227562007/02/26(月) 12:08:17ID:???
>>818
とてもシンプルなプラグイン:
{smarty_header http_equiv="Content-Type" content="application/octet-stream"}
{smarty_header http_equiv="Content-Disposition" content="attachment; filename=myfile.csv"}


私が定義した関数です。
plugin/function.smarty_header.php

function smarty_function_smarty_header($params)
{
    header("{$params[http_equiv]}: {$params[content]}");
}
08238182007/02/27(火) 02:39:59ID:???
プラグインのソース、ありがとうございます。
ですが作成されたファイルの内容がブラウザに表示されるだけで、ダウンロードのダイアログは表示されませんでした。
エラー文言ですが、

Warning: Cannot modify header information - headers already sent by 〜

と表示されます。
エラー文言が表示されることで既にHTTPヘッダが出力されてしまったのかもしれないとおもい
php.iniのdisplay_errorsをOffに倒して実行してみましたが、変わりませんでした。

やはり無理なのでしょうか。
0824nobodyさん2007/02/27(火) 03:10:33ID:???
>>823
http://jp2.php.net/manual/ja/function.header.php
08257562007/02/27(火) 07:35:44ID:???
>>823
{smarty_header ...} は文字を出力する前に呼び出さなくちゃだめだよ。

> 覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは
> PHP からの出力にかかわらず、すべての実際の出力の前にコールする必要があることです。
> 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
> 空白または空行があり、header() の前に出力が行われてしまうというものがあります。
> 同じ問題は、単一の PHP/HTML ファイルを使用している場合でも存在します。
08268182007/02/27(火) 23:11:30ID:???
>>824
>>825

ありがとうございます。
>頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数に
まさにこれでした。
824さんが提示してくださったページは知っていたのですが、理解していませんでした。

あと皆さん、smartyとは関係のない質問をしてしまい済みませんでした。
0827nobodyさん2007/03/01(木) 09:32:48ID:???
>>807
英語が苦手でなければ、こんなのはどう?
ttp://www.kuwata-lab.com/kwartz/
こんな感じでhtmlとphpを分離できる。
ttp://www.kuwata-lab.com/kwartz/img/fig01.png
ttp://www.kuwata-lab.com/kwartz/kwartz3php-users-guide.01.html#example1
0828nobodyさん2007/03/01(木) 12:42:20ID:???
そういえば以前、未踏で完全分離を目指したテンプレートエンジン作ってたよな。
0829nobodyさん2007/03/01(木) 15:37:36ID:???
>>828
JavaServer Templates "Mayaa"
ttp://mayaa.seasar.org/
0830nobodyさん2007/03/02(金) 00:57:05ID:???
デザインの分離を考えるとFlexyはよく出来てると思う。
ただ、痒い所に手が届かないが。
0831nobodyさん2007/03/02(金) 09:43:20ID:???
>>827
そこの人、日本人だから以前は日本語のドキュメントもあったぞ。
今は無いみたいだが。

一年前使ってみた感想は、時期尚早って感じだったかな。
メインはrubyみたいで、phpのサポは片手間って感じ。
ドキュメントに書いてあるのに実装してない構文とかも確かあったし。
(and preg_matchの配列の渡し方を間違えて、毎回初期化してるんで動かなかったりしたのを修正したのを覚えてる。)

>>830
Flexyは結構面白いんだが、「構文解析が出来る」ものだから、かなり無茶な構文を定義しているような感じがする。
以前いじった時は、スタイルシートで{hoge:fuga}のように最後のセミコロンを省略したりした場合、
Flexyのプラグインを見に行ったような・・・
これまた1〜2年前にいじったきりなんだが修正されたのかな?
0832nobodyさん2007/03/06(火) 03:51:50ID:???
よくありがちな、こういう形のページを作るとき
みなさんははどのように作ってますか?
(仮にSmarty使用として)

1. 各コンテンツ.tplから、ヘッダ、フッタ、ナビをconfigから置換。
2. 各コンテンツ.tplから、ヘッダ.tpl、フッタ.tpl、ナビ.tplを読込み。
3. 全体デザイン.tplから、ナビ.tplとコンテンツ.tplを読込み。
4. 全体デザイン.tplから、コンテンツ.tplを読込み、
  コンテンツ.tpl内でさらにナビ.tplを読込み。

┌─────────────┐
│      ヘッダ(静的)     │
│┌─┐┌────────┐│
││ナ││ ページごとの   ││
││ビ││ コンテンツ(動的) ││
││ ││            ││
││静││            ││
││的││            ││
│└─┘└────────┘│
│      フッタ(静的)      │
└─────────────┘

私は全体のデザインを作ってしまって、
中身だけ入れ換える方式(上記3、4)が好きなのですが、
デザイナーにとっては、ファイル構成が直感的で
無くなるような気もします。
みなさんはどうしてるか参考までに聞かせてください。
0833nobodyさん2007/03/06(火) 07:45:19ID:???
>>832
ナビの部分はコンテンツごとに切り替えることがあるので、おれは3で。
0834nobodyさん2007/03/06(火) 08:01:34ID:???
まあ普通3だわな
デザイナーはhtmlベースな状態で管理を行って
デザインに更新があったらその都度プログラマが
変更点を確認して実際のテンプレートファイルに
手を加えるってのが一般的なんじゃないの
直感的なファイル構成にこだわる必要なんて無いと思うぜ
0835nobodyさん2007/03/06(火) 08:53:16ID:???
3,4の中身入れ替えって
全体デザイン.tpl に読み込む中身.tpl を選択する
分岐入れるってこと?

俺は良く2のパターンで作るなぁ。
デザイナさんに各ページをHTMLで作ってもらって
基本的にはそれを.tplに置き換えてから手を加える感じ。
0836GoA ◆J2EE.GplLk 2007/03/06(火) 09:46:08ID:???
>>832
俺はナビ部分が完全静的の場合なら、1をよくやるな。
正確に言えば、全体デザイン.tplからヘッダ・フッタ・ナビを完全固定状態で…って感じだけどな。

でも、ナビも動的にする場合がおおいので、結果として、3みたいな感じになることがおおい。
0837nobodyさん2007/03/06(火) 10:15:32ID:???
3の場合ってつまり
各コンテンツ.php内でコンテンツtpl名を変数に割り当てindex.tplを読み込み
index.tpl内で静的なヘッダ・フッタ+動的なコンテンツtplを読み込み
って感じ?(ナビ略)
0838nobodyさん2007/03/06(火) 12:16:59ID:25mpWck5
括弧の中を先に計算させたくて、以下のようにしたら...:
{section ... start=`($foo.bar-1)*($smarty.const.CONSTANT)` ...}

このようなエラーが出ました:
Fatal error: Smarty error: syntax error: $smarty. is an unknown reference

これはどうしたらよいのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています