トップページphp
1001コメント342KB

【PHP】 Smarty 隔離スレ 【テンプレート】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2008/02/02(土) 00:21:09ID:6cKcKeTp
まぬあるhttp://www.smarty.net/manual/ja/
0269nobodyさん2008/10/14(火) 01:52:38ID:???
>>268
デザイナとプログラマの分業がなされているとき
構文エラーはデザイナ責任、実行時エラーはプログラマ責任。
PHPエラーがでたらプログラマが対処すりゃいい。

そもそも、>246のエラーは文字列に変換できないクラスをassignしないもしくは、
assignしたものが直接扱えない変数であることをデザイナに伝えていれば起きない。
0270nobodyさん2008/10/14(火) 02:36:44ID:???
>>268
アホはお前だろw
実行時エラー制御したいなら、Smartyに限らずassign時点で型判別しろよ無能w
それこそSmartyとかPHP以前の話だよ。


>エラーの種類に関係なく、行番号がずれるのが問題なのに、
ずれてねーよw コンパイル後のソースでの行数で、ご丁寧にファイル名まで出てるじゃん。
スクリプト言語しか触った事無い素人には、実行時エラーのデバッグは難しいのかもしれんが、
普通のPGなら上のエラーコード読むだけで、エラー内容もエラー位置も特定出来るわ…

むしろ構文エラーじゃなくて、実行時エラーだって理解出来て問題識別しやすいわw


無能を晒してないで、
はやく>>265-266を君の考えた素敵で使い勝手の良いテンプレートに書き換えてくれよ。
はやく>>265-266を君の考えた素敵で使い勝手の良いテンプレートに書き換えてくれよ。
はやく>>265-266を君の考えた素敵で使い勝手の良いテンプレートに書き換えてくれよ。

0271nobodyさん2008/10/14(火) 02:40:48ID:???
こういう無能がdisplay_errorsをonにしたまま本番公開しちゃって恥ずかし思いするんだろうねぇ('_`
0272nobodyさん2008/10/14(火) 03:44:58ID:???
>>268じゃなくて初心者だけどつくってみたー
よろしくお願いしまーす

<? // きょうつう(init.php)
define('DS', DIRECTORY_SEPARATOR);
define('TEMPLATE_DIR', 'tpl');

function include_template($name, $vars) {
// てきとうにかんすうをていぎします
function h($str){ return htmlspecialchars($str); }
function strip($str){ return preg_replace('/[\n\r]/', '', $str); }

extract($vars);
include TEMPLATE_DIR . DS . $name;
}
?>
0273nobodyさん2008/10/14(火) 03:46:43ID:???
<? // こんとろーら
require_once 'init.php';
$rows = array(
array('time'=>time(), 'name'=>'foo', 'value'=>1),
array('name'=>'bar')
);
include_template('tpl.php', compact('rows'));
?>

<? // てんぷれーと(tpl.php) ?>
<? $title = 'ページタイトル'; ?>
<? include 'header.php' ?>
<table>
<? foreach((array) $rows as $row): ?>
<? ob_start('strip') ?>
<tr>
<td><?=h ($row['time'] ? strftime('%T', $row['time']) : '00:00:00') ?></td>
<td><?=h ($row['name']) ?></td>
<td><?=h ($row['value'] ? $row['value'] : 'DEFAULT') ?></td>
<tr>
<? ob_get_flush() ?>
<? endforeach ?>
</table>
<? include 'footer.php' ?>

でもsmartyのメソッドチェインてきなやつはよいとおもいます
0274nobodyさん2008/10/14(火) 04:01:40ID:???
>>268
>エラーといわれた場所の行番号が違っていることが問題なんだろうが。

言いたいことはわかる。
でも、関数なんだから当然だろ。
引数が不適切なせいで、呼び出し先でエラーが出た場合を考えればわかりやすい。
02751962008/10/14(火) 09:31:04ID:???
いや、行番号の話はSmartyとsymfonyを混同した人の指摘?みたいだし、
エラーを追いかけたかったら良いデバッグツールを使えばいいと思うぞ。
PHP標準でスタックトレースも変数の中身も出せるわけだし。

>>263
SimplateいいぞSimplate。暢気な人には魅力がかわらんかも知れんが。
俺が考える「Smartyをわざわざ導入する際のデメリット」が結構解消されてる。
まあ、「SmartyはPHPで書かれている」という大きいメリットは殺ぐのだけど。

>>265-266はMVCを理解してない人の例という意味では良いサンプルだな。
>>271-273ありがとう。俺もせっかくなので一つ案を出す。
0276nobodyさん2008/10/14(火) 10:01:19ID:???
おはよう。

>>275
Simplateいいよね。 客先都合で使えない事が多くて泣けるけど。
>>265-266はMVC的にはどう書くのが正解?
02771962008/10/14(火) 10:20:12ID:???
レス番間違えた。272-273、素晴らしいコードをありがとう。
議論としては蛇足になってしまうかも知れないんだけど、
俺が個人的に>>212より>>196が良いと思うと言った部分を紹介します。

特徴(一長一短?)は、テンプレートファイルの可読性が高く、隠蔽されていること。
利点はHTMLからの移植性と習得の容易さ。
欠点は配列操作のコストを二重にかけていること。

改行が多いと叱られたので再挑戦。

>>276
>>272-273のように書くのが正解だと思う。
少なくとも、MとVとCがそれぞれどのファイルかわかるでしょ。
02781962008/10/14(火) 10:21:06ID:???
require >>272
// function d($value, $default) { return isset($value) ? $value : $default; }

<?php // メソッドチェイン?をビューと切り離す(tpl.php)
$title = 'ページタイトル';
$disp_rows = array();
foreach((array) $rows as $row) {
$row['time'] = $row['time'] ? strftime('%T', $row['time']) : '00:00:00';
$row['value'] = $row['value'] ? $row['value'] : 'DEFAULT';
array_walk($row, 'h');
array_walk($row, 'strip');
$disp_rows[] = $row;
}
include 'header.php';
include 'body.php';
include 'footer.php';

<? // てんぷれーと(body.php) ?>
<h1><?=$title?></h1>
<table>
<? foreach($disp_rows as $row): ?>
<tr>
<td><?=$row['time']?></td>
<td><?=$row['name']?></td>
<td><?=$row['value']?></td>
</tr>
<? endforeach ?>
</table>
02791962008/10/14(火) 10:30:20ID:???
>>276
厳密には、こう考えると良いかも。やっつけだけど。

<? // こんとろーら
require_once 'init.php';
require_once 'model.php';
include_template('tpl.php', compact('rows'));

<? // もでる(model.php)
$rows = array(
array('time'=>time(), 'name'=>'foo', 'value'=>1),
array('name'=>'bar')
);

ちなみに俺は>>278のような書き分けをする時は、
tpl.phpの処理は、コントローラに近い場所に書いているかも。
0280nobodyさん2008/10/14(火) 11:24:56ID:???
>>196
君、MVCを全く理解出来てないよ。

データの表示フォーマット等に関するビューロジックは、ビュー側で処理するべき。
コントローラは必要なデータをモデルからひっぱってデータに渡すだけで表示内容には関与しない。
君の書き方だと、各種表示フォーマットやデフォルト値が変更になった時にビューで処理出来ないでしょう?
0281nobodyさん2008/10/14(火) 11:31:38ID:???
>>265-266>>272-273の違いは何ですか?

MとCはコードに掲載していないだけでVとしては正しいと思います。
何が問題でしょうか?具体的に教えて下さい。
0282nobodyさん2008/10/14(火) 11:37:48ID:???
>>280
変更される度にtpl.phpに修正を入れるんだろうな
単純にテンプレートファイルとビュー用のデータ加工のphpを分けてるだけみたいだし

というか、やってる事はオレオレテンプレートエンジンな件について
要は生phpをテンプレートファイルにできればいいのかな?
0283nobodyさん2008/10/14(火) 11:50:37ID:???
>>282
ねw 多分中学生か高校生の熱血PG志望者だよきっと。

俺も若い頃は動作の重さに超敏感だったし、Smartyとか使う奴はアホかと思っていたw
0284nobodyさん2008/10/14(火) 12:14:00ID:???
>「Smartyをわざわざ導入する際のデメリット」

俺にはこれがわからん。
パッケージインストールもしくはダウンロード→インクルードパス下に解凍したらすぐ使えるよ?
習得の手間は人それぞれだろうけどおそらく196や周辺のPHP知ってるデザイナーは苦労したんだろうな。
0285nobodyさん2008/10/14(火) 12:15:43ID:???
>>281
んーと
「V」にだけ着目するならどっちもただしい、
それこそ全部echo文でもただしいのではとおもいます!

>>272-273は「SmartyでできることはPHPでできる」、の一部のサンプルとして
1. 変数・関数のスコープの限定の実現
2. 生PHP?のテンプレートとしての(そこそこの)書きやすさの実現
 (というかshort_open_tagの積極的な使用)
を主眼においてつくってみました。 >>266から>>273に代わって
何か問題が解決したとすれば、主にはView用変数・ユーザ定義関数がグローバルでなくなったこと
かなとおもいます(まちがってたらアドバイスください><)。

じぶんはというと今テンプレートに
Smartyを使いつづけるか(といってもまだ使って一ヶ月ですが!)
否かまよっているところなので先人さんのいろいろな意見を参考にしたいところで、
最近このスレをみつけてせっかく興味のある話題にめぐりあえたのに
煽り合いばかりでおもしろくないなーとおもっているところです。
0286nobodyさん2008/10/14(火) 12:23:17ID:???
お前が煽ってんだろが
0287nobodyさん2008/10/14(火) 12:28:17ID:???
あ、>>277さん、こちらこそありがとうございます><
最初はもっとボコボコに叩かれるかもとおもってたので…
0288nobodyさん2008/10/14(火) 12:31:26ID:???
>>286
煽ってないですが煽ってると思われたならあやまります。。
すみません
0289nobodyさん2008/10/14(火) 12:41:55ID:???
>>285
>>265-266
「V」に着目するだけというかVのサンプルですが…。
MVC的に見ても、MもCも混在していないので間違いがわかりません。
どこに違和感を感じたのでしょうか?


仕組みを学ぶのは良い事だと思います。
しかし、もう少しSmartyを使い続けてみて下さい。
不満点も沢山見つかると思いますが、メリットも沢山見つかると思います。
「SmartyでできることはPHPでできる」はパッと見出来てるように見えてるだけで、
細かい実装(商業では必須ね)考えると、相当な開発負荷がかかります。

>short_open_tagの積極的な使用
現バージョンのPHPの推奨設定ではshort_open_tag=offなので注意して下さい。
PHP6以降では廃止される可能性もあります。
0290nobodyさん2008/10/14(火) 12:42:58ID:???
>>285
Smartyでできる事を手間をかけてPHPだけで書いてもメリットないだろう
処理速度に多少のアドバンテージがあるくらいで、それも汎用的に書いていけば怪しい

個人的にはSmartyを使うメリットで一番大きいのは、使ってる人が多い事だと思ってる
0291nobodyさん2008/10/14(火) 12:46:30ID:???
SmartyもどきをPHPで作るくらいなら、俺はSmartyを使う。
02921962008/10/14(火) 18:57:31ID:???
short_open_tagは俺の趣味です。
「ファイルの末尾に ?> を書かない」と同じくらい、趣味の領域だと思う。
なので、xmlとか読み書きする人は気をつけてください。

>>280
そうだね。当然、MVCという区分上は、tpl.phpはビューに相当する。
「コントローラに近い場所に書いている」という実装が悪いのかな。
例えばsymfonyだったら、tpl.phpこそがhogeSuccess.phpであるべきで、
hogeSuccess.phpからhoge.htmlをincludeしたほうが妥当ってことだよね。
コントローラがinclude_templateを呼ぶのはイビツなんだな。なるほど納得。

それを踏まえて再度意見を戴きたいのだけど、
ビューが分かれててその一方がPHPだと、何かまずいだろうか?
モデルもコントローラも1ファイルじゃないといけないという理屈は無いよね。

>>282
そう。単純に「表示値の準備」と「表示処理」を分けているだけ。

> 要は生phpをテンプレートファイルにできればいいのかな?

ナマじゃなくてもいいんだけど、Smartyほど大げさなモノは、個人的には使わないかな。
テンプレートファイル部分は出来るだけ薄いほうが好き。
0293nobodyさん2008/10/14(火) 20:46:31ID:???
>short_open_tagは俺の趣味です。
なんだ、ただのひねくれものか
お前、友達いないだろ?
お前、自分の事出来る職人だと思ってるだろ?
周りは確実に引いてるパターンが目に浮かぶ
もはやSmartyの話題でも無いので、MVCスレにでも行けや。
0294nobodyさん2008/10/15(水) 00:24:43ID:???
>>292
>>278のコードだけど、tpl.phpとbody.phpを合わせてSmartyで言うところのテンプレートだよね?
tpl.phpでデータを整形をして、body.phpは体裁のみを担当と…。

これは君の主張していた

 ・Smartyより学習コストが低い
 ・(デザイナが)Smartyで出来る事は実現出来る

には当てはまらないよね。

tpl.phpで扱える便利な関数群を提供してあげればいいんだろうけど、
それは>>290-291の言うとおり、結局は我流テンプレートエンジンを作る事態になってしまうよね。
であれば既に完成されたSmartyから乗り換える理由にはなり得ないと思うんだ。
もっとも君が我流テンプレートエンジンを完成させて、公開してくれれば別かもしれないが。
0295nobodyさん2008/10/15(水) 00:45:46ID:???
>>292
>ビューが分かれててその一方がPHPだと、何かまずいだろうか?
>モデルもコントローラも1ファイルじゃないといけないという理屈は無いよね。

ビューをファイル分割する事は、
メリットよりデメリットの方が多い気がするんだよね。

まず、ファイルが増えればバージョン管理やデプロイの手間が増える。

>>278の形式だとbodyの表示を修正したい場合、
読み込み元のtplを把握している必要があるし、
tplが読み込んでいるbodyが他に無いか等も把握していないといけない。

これは非常に面倒。

そんな理由で、どうしても整形処理を別ファイルにしたいのであれば、
tpl.phpからbody.phpを読むのではなく、
body.phpからtpl.phpを読むような形にするのが望ましいと思う。

<? // body.php ?>
<? include "tpl.php" ?>
<? $rows = $tpl->format($rows); // 整形 ?>
<? include "header.php" ?>

〜 表示処理 〜

<? include "footer.php" ?>

そうすると構文こそ違うものの、Smartyとやってる事はほとんど同じになる。
で、Smartyに相当するtpl.phpを作るのは誰がやるんだ…って話になる。
0296nobodyさん2008/10/15(水) 01:03:17ID:???
>>289
じぶんは>>264-267を見てつくってみたのですが
おっしゃってることがよくわかりませんでした。。

Smartyはまだ触ってみるつもりではいます!
>>290さんのおっしゃっるとおり使う人が多いのはよいとおもいますし
たしかカスタムタグみたいなこともカスタム関数でできるんですよね??

ただSmartyに不満を持つたびに、
PHPをちゃんとテンプレートとしてつかえたら、とおもいます。
PHPを使いはじめてから、short_open_tagとか制御構文の別構文(endif, ...)とか
テンプレートとしてのPHPはすごくいい感じだとおもったので
PHPがちゃんとテンプレートとして進化しなかったのがざんねんです。

テンプレートエンジン上にテンプレートエンジンをのっけるという感覚が
今割り切って理解できなくなっているのです。。
short_open_tagがXML処理命令の規則に合わないのはあきらめるしかないです。。
0297nobodyさん2008/10/15(水) 02:00:05ID:???
PHPはすでにテンプレートエンジンとしては不全なんだろ。
それならSmartyを良くするとかもっと良いテンプレートエンジンを作るとかしたほうが生産的だと思うのだが。

まあ、PHPを良くするというのもありか。
しかしテンプレートとプログラムを同居させるというのはどだい無理があると思う。
Smartyのプログラム的文法もかなり無理やりだしな。
0298nobodyさん2008/10/15(水) 02:42:51ID:???
>>296
PHPは正確にはテンプレートエンジンでは無いんですよ。
テンプレートエンジンのようにHTML内に組み込めるようになっているだけなんです。

>PHPをちゃんとテンプレートとしてつかえたら、とおもいます。
Smartyのテンプレートの中にPHPを直接書く事も出来ますよ。(非推奨ですが)
{php}echo "Hello World"{/php}

>たしかカスタムタグみたいなこともカスタム関数でできるんですよね?
PHPが解る人なら簡単に作れますよ。

(例) タグ内の文字列を置換するタグ{replace}{/replace}タグを作る場合

block.replace.php というファイルをpluginsディレクトリの中に作成し、次のコードを記述するだけです。
function smarty_block_replace($params, $content, &$smarty)
{
retrurn str_replace($p["search"], $p["replace"], $content);
}

以降Smartyテンプレートで次のように記述出来るようになります。

{replace search="本当ですか" replace="マジッスカ"}
 {replace search="凄いですね" replace="パネェっす"}
本当ですか。
    凄いですね。
 {/replace}
{/replace}

// 出力:マジッスカ。パネェっす。

一見、PHP単体でも簡単に実装出来そうに見えますが、タグの入れ子処理等を考えると地味に面倒だったり、テンプレートの可読性が下がったりしますよね。
02991962008/10/15(水) 18:33:26ID:???
>>294
tpl.phpが難しいから学習コストが高いということかな?

・PHPが理解出来ないレベルのへぼデザイナーはbody.phpだけ触らせるしかない
・Smartyで出来る事は理論上すべてPHPで出来る(し、その手段もそれなりに用意されている)

というのが俺の意見かな。
俺の環境はsymfonyで、sfFormか、helperか、sfSmartyViewPluginかの選択が必要なので、
既にSmartyで完成されたサイトとかを、わざわざリプレースする必要は無いと思う。

「SmartyはわかるけどPHPは触れません」というデザイナーって、結構多いのかな?

>>295
なるほど、俺にとっては斬新な発想だった。
ファイルの命名規則をしっかり決めれば、関連性はわかりやすいかと思ってたんだが。

tpl.phpは、デザイナーが作るのが理想だが、プログラマーがやっても構わない。
「$nameの表示はescapeしてnl2brしてください」という要件を把握出来るのが、
デザイナーなのかプログラマーなのかによって話が大きく変わるんだろうな。
03001962008/10/15(水) 19:01:26ID:???
せっかくなのでSmartyの質問をさせてくれ。

(是非はおいといて)>>278のような事をSmartyで実現したい。

MVCで言うと、new Smarty();が書かれるファイルは、
モデルでもコントローラでもなく、ビューに属する事になる。
sfSmartyViewとかZend_View_Smartyみたいな位置づけになるわけだな。なので、

コントローラ(ラッパーにテンプレート変数を渡す)

ビュー用のラッパー。内部的に$snarty->assign();が書かれる

★テンプレート変数の整形処理(Smartyの便利な構文で書ければ良い)
$name = {$name|escape|なんたら|かんたら}

テンプレートファイル(.tpl)
{$name}

みたいな風にしたいのだが、それは仕様上無理なんだろうか。
{assign}とか{eval}でいける? コストはこの際考えないことにして・・・。
0301nobodyさん2008/10/15(水) 19:38:33ID:???
>>299
>tpl.phpが難しいから学習コストが高いということかな?

少なくともSmartyと比較したら数倍難しいし、
素人のロジックがシステムに混入する恐れがある。
define("DEBUG", 1); とか $_POST["xxx"] = "debug data!"; とか書かれてたら寒気しない?

>Smartyで出来る事は理論上すべてPHPで出来る

これは逆じゃないかな。
「symfonyで出来る事は全てPHPで出来る」と言ってるのと同じで、
Smartyは所詮PHPライブラリに過ぎないんだから。

> PHPが理解出来ないレベルのへぼデザイナーはbody.phpだけ触らせるしかない
>「SmartyはわかるけどPHPは触れません」というデザイナーって、結構多いのかな?

仮にPHPが触れるデザイナがいたとしても、
上に書いたようにセキュリティの観点からは、システムに影響を与える権限を与えないのが普通だと思う。
少なくとも外注のデザイナには絶対に触らせたくないよね。

>tpl.phpは、デザイナーが作るのが理想だが、プログラマーがやっても構わない。

tpl.phpはビューである以上、デザイナが触るべきだと思う。
ロジック的にMVCを分けても、管理体制(担当区分)がわかれていないとエラーが出た時に面倒だから。

そういう意味ではSmartyはその機能性より、
コードの統一性や管理体制に与える恩恵の方が大きいのかもね。
0302nobodyさん2008/10/15(水) 20:31:43ID:???
>>300
>(是非はおいといて)>>278のような事をSmartyで実現したい。
{assign}{capture}{eval}あたりで出来るよ。
コンパイル後のソース見ればわかるけど、assignなんかはコストもほとんど変わらない。

// format.tpl
{assign var="name" value=$name|escape|default:"no name"}
{include file="body.tpl"}

// body.tpl
{$name}

>MVCで言うと、new Smarty();が書かれるファイルは、
>モデルでもコントローラでもなく、ビューに属する事になる。

自分はSmarty自体をビューとして考えているかな。
コントローラがビュー(Smarty)を生成し、レスポンスデータを渡す。
ビュー(Smarty)は与えられたレスポンスデータを元に画面を表示する。

↓こんな感じ。
class Controller {
public function action() {
// 実際にはSmarty継承クラスor内包クラスになる
$view = new Smarty();

// 必要な処理をしてビューにレスポンスデータを渡す
$view->setResponse(new Respose(xxxx));

// 整形や表示処理は全てビューにまかせる。
$view->render();
}
}
0303nobodyさん2008/10/15(水) 20:34:36ID:???
PHPが書けないデザイナをヘボとか言っちゃう人とは仕事したくないなあ
jspが書けないデザイナもヘボなんだよね?
MovableTypeのテンプレートタグも知らなきゃヘボなのかもしれない
うーん、大変だな
0304nobodyさん2008/10/16(木) 02:49:37ID:???
>>298
> PHPは正確にはテンプレートエンジンでは無いんですよ。
そうなんですか??

> Smartyのテンプレートの中にPHPを直接書く事も出来ますよ。(非推奨ですが)
んんーSmarty内でPHPコードを書くのは本末転倒というか本末転倒ですよね。。

あとカスタムタグ?のサンプルありがとうございます!
ttp://smarty.incutio.com/?page=foreachgroupというのがおもしろそうでした!
0305nobodyさん2008/10/16(木) 03:51:12ID:???
>>304
PHPはプログラミング言語の名称ですよ。
0306nobodyさん2008/10/16(木) 08:06:34ID:???
>>303
CSS、HTML、JSあたりを完璧に書けない奴はヘボプログラマなんかねw


個人的にはデザイナはPHPとか勉強するヒマあったら、
システムに組み込みやすいスマートなHTMLコーディング技術を学んで欲しいわ。
0307nobodyさん2008/10/16(木) 17:56:46ID:???
>>305
そりゃ、そうでしょうとも…!
0308nobodyさん2008/10/16(木) 19:53:26ID:???
PHPという言語は<?php ?>タグの外をそのまま出力するという言語仕様なだけでテンプレートエンジンでは無いよね。
03091962008/10/19(日) 11:55:40ID:???
なるほど、このスレには分業指向の人が多いんだな。

>>301
{php}{/php}でも同様の問題は発生すると思うので、その辺は気にしても仕方ないと思っている。
デザイナーにSSHを使わせないとか、PHPが絶対に動かない環境しか与えないとか、
へぼい人を縛る方向で考えるよりは、へぼくない人と仕事するほうが良いと思ってしまう。

>>302
やっぱり、そうなってしまうよなあ。
上で「それはMVCではない」と言われてから、内心悩んでたんだけど。
Smartyの解説ありがとう。その線で学習コストが等価になれるか検討してみる。

>>303
JavaとかMT(使ってる人いるのか?)のプロジェクトなら、そうだろうね。

>>306
HTML書けません、というプログラマーとは間違っても一緒に仕事しないよ。

というより、Smarty文法がわからないデザイナーと一緒に仕事しないでしょ?
同じことでないの?
0310nobodyさん2008/10/19(日) 15:09:25ID:???
>>309
>{php}{/php}でも同様の問題は発生すると思うので、その辺は気にしても仕方ないと思っている。

{php}{/php}タグは禁止に出来ます。

>デザイナーにSSHを使わせないとか、PHPが絶対に動かない環境しか与えないとか、
>へぼい人を縛る方向で考えるよりは、へぼくない人と仕事するほうが良いと思ってしまう。

逆になんで必要の無い権限を与えるの?それによるデメリットは考慮しないの?
まっとうなセキュリティの考え方だったら「必要な権限以外は与えない」のが常識だと思うんだけどね。
最低限の権限で不便させない環境を提供出来ないシステム屋こそへぼい人だと思う。


参考までにいくつか質問させておくれ

 ・プロジェクトの人数とか連携手法やらバージョン管理方法は?
 ・テンプレートPHPでエラーが出たら誰の責任になるの?
 ・テンプレートに使ってるPHP系のライブラリとかは?
03111962008/10/19(日) 15:56:49ID:???
>>310
デザイナーに権限を与えたくないなら、HTMLだけを納品させて、
コードレビューとサーバへの設置はプログラマーがやればいいじゃん。

デザイナーにサーバへの書き込み権限を与えた時点で、
(仮にあらゆるコマンドの実行をサーバ上で絶対に行えなくしたとしても)
デザイナーはシステムの正常動作責任を一部負う事になるのは間違いない。
たとえば、必要なパラメタを渡さなかったとか、ファイルを消しちゃったとか。

だから、あらゆる操作をサーバ上で絶対に行えなくすることのメリットは、
デザイナーがサーバを壊さないようにする、という程度に過ぎないので、
それなら優秀で信頼のおけるデザイナーと仕事したほうがいいんじゃないの? と思う。


質問の答えだけど、製品が完成しなかったらチーム全体の責任。
デザイナー主導の案件でもプログラマー主導の案件でも、
インタフェース定義の必要性は発生し、それは両者(主に主導側)の責任になる。
Smarty単体ではシステムの仕様テストは行えないので、
「言われたとおりのSmartyテンプレートだけ書くからあとは知らないよ」というデザイナーは、
HTMLだけしか書かないデザイナーと大して変わらない。

なので俺はそういうデザイナーとは仕事してないし、
もしデザインを外注する事があっても、Smartyの学習を促す事は無いと思う。

あえて擁するなら、へぼプログラマーと連携する時には、Smartyは役に立ったな。
あれを安直に使えば、嫌でもビューとロジックが分離出来るから。
でも今はフレームワークを使うのが普通なので、そのメリットは感じられなくなった。
03121962008/10/19(日) 16:30:50ID:???
超極端な例として、>>310の議論にとって最も良い条件を考える。

・顧客がWebデザインを自分で更新したいと要望している
 実力はへぼかも知れないが、お客様なので無碍にも出来ない
・プログラム開発も初期デザインも業者が行い納品する
・サーバは業者が貸与するので、壊されないように配慮しなければいけない
・ssh権限は与えず、ftpsでテンプレートファイルだけ更新できるようになっている
・プログラムの動作責任は業者が負わないといけない
・テンプレート更新内容のチェックに業者の人的コストは割けないので、
 更新はノーチェックで行い、システムが正常動作しなくなった責任は顧客に負わせなければいけない
・テンプレートにはプログラムから変数を埋め込まなければいけない
・顧客はSmartyの心得と導入への理解がある
・Smartyのうち危険なタグをすべて洗い出し、設定で使用を禁止している
・テンプレートでエラーが出てもセキュリティ的に不適切な出力は行われないよう設定されている

それでも

・パラメタエラー
・クロスサイトスクリプティング

の問題は残り、特に後者はインタフェース側で検出する事が出来ない。
お客様が |escape を書き忘れただけで。
なので>>302の仕組みがあれば、完全に縛ることが可能だろうか、と思った。

でも、ここまで極端な事例でもない限り、デキル人を探した方が早いなぁ。
顧客には任意の静的HTMLを特定箇所にinclude出来る仕組みのみを提供するとか。
Smartyを縛るより、俺俺テンプレートエンジンのほうが早いじゃん、とか。
0313nobodyさん2008/10/19(日) 17:55:19ID:???
とにかく難癖つけてSmarty叩きたいのはわかったけど、
結局君がSmarty使いこなせてないだけじゃんww
100%の対策なんて無いんだから、対策しないって言ってるだけって事に気付けww

>デザイナーに権限を与えたくないなら、HTMLだけを納品させて、
>コードレビューとサーバへの設置はプログラマーがやればいいじゃん

 デザイン修正の度にやるんすか。

>デザイナーにサーバへの書き込み権限を与えた時点で

 当然、テンプレートディレクトリとシステムディレクトリで権限分けてるし。
 ファイルに関しても基本的にはSVN経由で、本番には手動デプロイですよ。
 消される恐れがあるとわかってて何故権限を与える?w

>Smarty単体ではシステムの仕様テストは行えないので、

 わぁ、きっと君のところはMVC分けが出来てないんですね><
 フレームワーク使えば大丈夫とか思ってるんですね><
0314nobodyさん2008/10/19(日) 18:12:47ID:???
>・パラメタエラー
>・クロスサイトスクリプティング
>の問題は残り、特に後者はインタフェース側で検出する事が出来ない。
>>302の仕組みがあれば、完全に縛ることが可能だろうか、と思った。

 default_modifiersやフィルタって知ってます? 

>Smartyを縛るより、俺俺テンプレートエンジンのほうが早いじゃん、とか。

もうSmarty叩きはいいからさ
その安全で扱いやすい俺俺テンプレートエンジンを見せてよ。
君の主張は前提と具体性がないから水掛け論だよ…。

まさか専門学校生じゃないとは思うけど質問に具体的、箇条書きで答えてくれよ。

・プロジェクトの人数は?
・連携手法は?
・バージョン管理方法は?
・デプロイ方法は?
・使用しているPHPライブラリは?
・使用しているフレームワークは?
・使用している俺俺テンプレートエンジンは?
0315nobodyさん2008/10/20(月) 12:22:54ID:???
こんなに活発に意見交換があるのに、
どうしてココは『隔離スレ』なの?
0316nobodyさん2008/10/20(月) 12:27:38ID:???
名目はともかくスレ独立してるのはありがたいので別にいいや。
03171962008/10/20(月) 18:54:05ID:???
>>313
煽っているように見えて>>311と同じ事を言っているように見える。
なので異論は無い。むしろ、まったくその通りだと思う。

>>314
default_modifiersは初めて知った。
nodefaultsと組み合わせれば、symfonyのescaping strategyに近い所まではいけるな。
escapeはプログラマーの責任でもなくデザイナーの責任でもなく、
フレームワークが基本的に便宜を図る、という解釈をすれば、悪くない思想だと思う。

後半については答えても意味が無いと思うし、
別にSmartyを否定する事が主目的で発言している訳ではないと言っている。

世の中にはSmartyを使うのに明らかに向かない案件もあるし、
そんなシチュエーションをわざわざ取り上げてSmartyを否定しても仕方が無いだろ。

逆に「Smartyを使うならこんな規模や状況やツールに最適だよ」という意見があれば、
それは主張してくれればいいと思う。
0318nobodyさん2008/10/20(月) 19:11:06ID:???
>>317
default_modifiersは問題がある(ソースに手を入れれば回避可能だが)から使わないって話なら聞くが
Smartyを3年使ってて知らないってどんだけ・・・

そもそもなんでこのスレにいるん?
0319nobodyさん2008/10/21(火) 01:33:33ID:???
>>317
>世の中にはSmartyを使うのに明らかに向かない案件もあるし、
>そんなシチュエーションをわざわざ取り上げてSmartyを否定しても仕方が無いだろ。

本当にそう思ってるなら196から出てくる発言はありえないと思うんだよね。

シチュエーションも取り上げずに、否定だけされても納得は出来ないじゃない?
「俺ならこうする」って意見も無しにダメだしされてもなぁ…default_modifiersすら知らないみたいだし、
単にSmartyの事知らないだけですよね?
議論では無く、相手を論破する事が目的になってませんか?
なんでこのスレにいるん?
0320nobodyさん2008/10/22(水) 10:19:46ID:???
>>313>>311が同じに見えるって、どんだけ読解力無いんだお前は…
相反する事言っているのに、なんで>>313に対しては異論唱えないんだ。
03211962008/10/22(水) 11:20:52ID:???
simplateのメンテに貢献したほうがマシな気がしてきた。

>>318
そうだっけか。じゃあ使い物にならないから忘れたのかな。
いずれにせよSmarty使ってた頃は、そこまでいじる気自体が無かったな。

>>319
俺ならこうする、という意見も、具体的なコードも書いたし、
Smartyを否定する事が主目的でも無いし、Smartyのわからないところは質問した。
発言する前にきちんと流れを読んでくれ。
直近の議論は294,299,301,309,310,311だ。

>>320
> 当然、テンプレートディレクトリとシステムディレクトリで権限分けてるし。
> ファイルに関しても基本的にはSVN経由で、本番には手動デプロイですよ。
> 消される恐れがあるとわかってて何故権限を与える?w

という意向と>>311との違いは状況判断の部分だけ。
俺は手動デプロイなんていちいちしたくないので、
信頼のおける優秀なデザイナーと仕事をする。
だけど、信頼のおけないデザイナーと仕事せざるを得ないなら、
>>313の言うようにするのもわかる。
前提とか本人の置かれている状況が違うだけなので、特に反論は無い。

それとも、
「デザイナーには完全な制限と束縛を課して徹底的に管理しろ」
というのが一番言いたいことなのかな?
Smartyを使ってデザイナーを檻の中に隔離するんだ、みたいな思想なのかな。
03221962008/10/22(水) 12:12:03ID:???
俺が何故このスレに居るのかとよく問われるので、
お言葉に甘えさせて戴き、整理させていただく。

俺が思う結論
・Smarty文法 {$name} のPHP文法 <?=$name?> に対する優位性
 →メソッドチェインはSmarty文法が少し短いが、習得コストに大差は無さそう。
 →short_open_tagを使いたくない/使えない場合はPHP文法が長くなるが同上。
・Smarty関数 {hoge} のPHP関数 hoge() に対する優位性
 →車輪の再発明をする必要が無いのが利点。
 →なので別のライブラリやヘルパーなどでも良い。
・Smartyのdefault_modifiersを使いビューのHTMLを安全にすること。
 →設計と実装は不完全だが、フレームワークに任せるという考え自体は良いかも。
・ビュー用の変数構築とビューのHTMLファイルを分ける意義
 →Smartyで実現するには{assign}{capture}{eval}を使えば可能。
 →デザイナーに変数構築をやらせる前提では二度手間に感じる。
 →プログラマーが変数構築を担当可能な所には意義があると思うし、
  default_modifiersの不具合をフォローすることも出来そう。
・Smartyはデザイナーがシステムを壊さないよう完全に束縛できるか
 →100%束縛したり管理するのは不可能そう。
 →PHPコード実行の抑止の為にテンプレートエンジンを使うのは一応有効。

何か主張されたのかも知れないと思っていること
・Smartyや他の手段を駆使してデザイナーをシステムから隔離する事自体の意義
 権限とリポジトリの管理と手動デプロイを常に徹底すれ
 →俺は優秀なデザイナーを使うかHTMLで納品させるというアプローチ。
  手動管理はめんどくさいし、たとえ客でも保守費用払わなかったらやりたくない。
0323nobodyさん2008/10/22(水) 13:25:17ID:???
だめだこいつ…芯の通った主張が一つもないから、結局何に結論づけてるのかもわからん。
「…で?」としか言えないわ。
0324nobodyさん2008/10/22(水) 13:32:44ID:???
default_modifiers忘れてただけとか言い訳が恥ずかしすぎるwww
結局使いこなせてないだけに一票。

「俺の環境ではSmartyが馴染まない」とか、凄くどーでもいい事なんで
こんな所でファビョってないで自作エンジンの制作作業に戻るんだ。

ここは君みたいな優秀なプログラマやデザイナが来ちゃいけない場所なんだ。
な。
03251962008/10/22(水) 18:45:58ID:???
>>324
一体どんな環境なら馴染むの?
0326nobodyさん2008/10/22(水) 20:54:01ID:???
>>325
使いこなせればどんな環境でも馴染ませられるよ。
出来ないのはヘボプログラマくらいだろうね。

君は何がしたいんだい?
Smartyを使う気がないなら、こんなスレにいる必要無いんじゃないのかな?
0327質問です2008/11/02(日) 19:17:14ID:???
PHPにて

for(i=0;i<6;i++){
echo "$_POST[$i]";
}

みたいなことをsmartyでやる場合、

{section name=i loop=5}
{$smarty.post.i}
{/section}

だと受けとれません。

$_POST[i] としてもだめなようで、
ループしてる回数を、POSTで受けとった配列のキーに割り当てるには
どう書けばいいんでしょうか?
0328nobodyさん2008/11/02(日) 19:19:30ID:JfJ9McaH
あげます。
0329nobodyさん2008/11/02(日) 20:49:20ID:???
書き方くらいちゃんと見なされ
0330nobodyさん2008/11/02(日) 21:45:09ID:???
section.{sectionname}.index でループ回数(正確にはstartから増分される値)を取得できる。
その前にpostはassignされてるのか気になるのだが・・・
03313272008/11/03(月) 23:53:06ID:CUNAecRE
329さん、330さん、ありがとうございます。

330さんの言うとおり、section.{sectionname}.index で
ループしてる回数を受けとれるのはわかるんですが、
その現在の回数をPOSTで受けとった配列のキーにするにはどのように書けばいいんでしょうか?

単なる配列をまわすときには、

{section name=i loop=$arr}
{$arr[i]}
{/section}

でいけると思うんですが、それがPOSTの配列の場合は一回assignしないといけないんでしょうか?
$smarty.post.キー で受けとれると思い込んでいたんですが。
0332nobodyさん2008/11/03(月) 23:56:08ID:???
マニュアル見てる?
0333nobodyさん2008/11/14(金) 17:52:36ID:nqLSKBoW
すいませんが、教えてください。
php -r 'require "Smarty/Smarty.class.php";'
PHP: Error parsing /etc/php.ini on line 511
PHP Warning: require(Smarty/Smarty.class.php): failed to open stream: No such file or directory in Command line code on line 1
PHP Fatal error: require(): Failed opening required 'Smarty/Smarty.class.php' (include_path='.:/usr/share/pear') in Command line code on line 1
というエラーがでます。
パスは
UNIX: "/path1:/path2"
include_path = ".:/php/includes.:/usr/lib/php/Smarty-2.6.20/libs/"
こうしているのですが、
0334333の続きです。2008/11/14(金) 17:53:36ID:nqLSKBoW
chown nobody:nobody /var/www/html/smarty/templates_c/
chown 770 /var/www/html/smarty/templates_c/
chown nobody:nobody /var/www/html/smarty/cache/
chown 770 /var/www/html/smarty/cache/

<?php

require_once(SMARTY_DIR . 'Smarty.class.php');

$smarty = new Smarty();

$smarty->template_dir = '/var/www/html/smarty/templates/';
$smarty->compile_dir = '/var/www/html/smarty/templates_c/';
$smarty->config_dir = '/var/www/html/smarty/configs/';
$smarty->cache_dir = '/var/www/html/smarty/cache/';

$smarty->assign('name','Ned');

//$smarty->debugging = true;

$smarty->display('index.tpl');

?>
と持っていったのですが、どうしてエラーがでるのかわかりません。
教えてください
0335333の続きです。2008/11/14(金) 19:12:47ID:nqLSKBoW
現在のエラーです。
PHP Warning: require(Smarty/Smarty.class.php): failed to open stream: No such file or directory in Command line code on line 1
PHP Fatal error: require(): Failed opening required 'Smarty/Smarty.class.php' (include_path='.:/php/includes:/usr/lib/php/Smarty-2.6.20/libs') in Command line code on line 1
もう一度インストールからはじめたのですが、だめでした。
お願いします。
教えてください


0336nobodyさん2008/11/14(金) 19:56:05ID:???
はぁ?お前は何を言ってるんだ?
/usr/lib/php/Smarty-2.6.20/libs/Smarty/Smarty.class.php
の場所にこのファイルはあるのか?
0337333の続きです。2008/11/14(金) 19:56:14ID:nqLSKBoW
自己解決しました。
疲れました
0338nobodyさん2008/11/15(土) 22:34:31ID:???
もしかして、smarty使ってローカルでテストすると、
それが完成したアカツキには、レンタルサーバーにも
smartyをアップロードしないと動かないの??
0339nobodyさん2008/11/15(土) 22:40:28ID:???
そりゃあレンタルサーバーにsmartyがインストールされてるかどうかだろ
されてなきゃ自前でアップロードしろ
0340nobodyさん2008/11/16(日) 14:34:54ID:VgwBTNK+
>>338
一体何をincludeするつもりなのか
0341nobodyさん2008/11/17(月) 21:26:39ID:WEpi9J1I
smartyってのはカスタム関数が便利なんだよ
そんで、そのカスタムタグつくったから適当に使ってよ、とクライアントに投げるの。
好き嫌いは有るけど、生phpより見やすいわけね。
OK?
0342nobodyさん2008/11/18(火) 01:32:18ID:???
>>338

たいがいのフレームワークはそうなんじゃないの
0343nobodyさん2008/11/18(火) 06:18:46ID:???
>>341
テンプレートエンジンの理想型だよな。
PGにもデザイナにも優しい。
Smarty3で速度面が大幅改善されるっぽいので期待している。
0344nobodyさん2008/11/19(水) 00:19:12ID:???
>>343
テンプレート側で連想配列を簡単に作れる関数ができるとうれしい。
まあプラグインで作れることは作れるんだが
0345nobodyさん2008/11/19(水) 04:25:55ID:???
Djangoテンプレートのextendsみたいな機能ってSmartyで実装できるかな?
0346nobodyさん2008/11/20(木) 11:05:10ID:WBdj1Bs+
Pearでカレンダーやメニューを作成してテンプレートに出力させたいんだが
このような場合、みなさんどうしてます?

テンプレート側でphpファイルを読み込んで出力させることは可能なのでしょうか?
0347nobodyさん2008/11/20(木) 11:18:04ID:???
>>346
つ{insert}
0348nobodyさん2008/12/03(水) 23:41:44ID:???
これってDjangoみたいなテンプレートの継承ってできないの?
0349nobodyさん2008/12/03(水) 23:58:50ID:???
>>348
簡易的なモノなら簡単に作れるから自作すれ。
0350nobodyさん2008/12/05(金) 11:52:26ID:jMVHCYUr
template_c ディレクトリはtemplate ディレクトリ1つにたいして1つ置く方がいいのでしょうか。

template は複数(サブディレクトリに1つずつ置く)、template_c は 非公開部分に1つ、ってやりたいんですが。
0351nobodyさん2008/12/05(金) 13:30:34ID:???
cacheを混乱させそうだな。
03523502008/12/05(金) 14:12:47ID:jMVHCYUr
やめときます。
おとなしく対応させて作ります。

ありがとうございました。
0353nobodyさん2008/12/05(金) 20:37:51ID:???
>>350
コンパイルID指定すればOK
http://www.smarty.net/manual/ja/api.fetch.php
0354nobodyさん2008/12/06(土) 01:16:24ID:???
ほうそんな機能が・・・
メリットがまったく思いつかないけど覚えておきます
0355nobodyさん2008/12/06(土) 01:36:14ID:???
いやわかれよw
0356nobodyさん2008/12/07(日) 09:29:45ID:???
もー!ヽ(`Д´)ノ
sfCutString:5とかにすると5文字表示とかってあるよね?
これって反対に、後ろからの5文字を削除とかって出来ないの?
教えてくださいな(´・ω・`)
0357nobodyさん2008/12/08(月) 09:59:13ID:???
ないものはつくるんだ
0358nobodyさん2008/12/08(月) 16:34:14ID:???
ついでに車輪も作っとけ
0359nobodyさん2008/12/08(月) 23:18:30ID:???
あってもつくるんだ
0360nobodyさん2008/12/09(火) 12:27:40ID:???
車輪の再発明は偉大!
0361nobodyさん2008/12/22(月) 09:45:58ID:???
テンプレートエンジンの選択で迷ってるんですが、
smarty使いの方、smartyがなかったら、どのテンプレートエンジンを選択しますか?
人それぞれ状況は違うと思うんで、pureにみなさんそれぞれの場合は?
0362nobodyさん2008/12/22(月) 13:12:51ID:???
smarty以外を選択する理由がない
0363nobodyさん2008/12/22(月) 13:56:20ID:fwOoSy8e
自作する。
多分テンプレート変数を置換する以上のことはできないだろうけど
0364nobodyさん2008/12/31(水) 21:47:49ID:8KFb7g3b
今作ってるサイトで、smartyが動かないんですが何が原因と考えられるでしょう?
動作させてる環境は2つあり、動かないのはそのうち一つだけです。
Smarty.class.phpへのパスは相対できちんと通していて、同じファイルを
その2つにUploadすると片方でのみ動いてくれません
もちろんそちらでもphpは動いてるんですが、、

原因を探る方法はないでしょうか?
phpが動くサーバなら動くはずなんですよね?
文字コードとかは関係あるでしょうか?

現状では
$smarty->assign('testvar','テスト');
echo "ここまでOK1";
$smarty->display('sample.tpl');
echo "ここまでOK2";
とすると、 「ここまでOK1」だけ出力します「2」はしません

また、せめてassignがちゃんと成立してるかだけでも知りたいですがどうしたら
いいでしょうか?  ご意見よろしく御願いします
0365nobodyさん2008/12/31(水) 21:49:40ID:???
>>364
error_reporting
display_errors
0366nobodyさん2008/12/31(水) 23:02:30ID:???
池■田大■作の本名はソン・テチャク。小泉純一郎、小沢一朗は朝鮮人。
911では小型の水爆が使用されている。
http://ri■ch■ardkosh■im■izu.at.webry.info/
創価の保険金殺人事件。
オウム事件は、統一・創価.北朝鮮の共同犯行である。CIAが監修している。
http://www15.ocn.ne.jp/~oy■ako■don/kok_web■site/ir■iguc■hi.htm
与党も野党もメディアも全部朝鮮人だった。
http://jb■bs.li■vedo■or.jp/b■bs/read.cgi/news/20■92/115794■1306/

2ちゃんねるは統一■教会が個人情報を集めるための道具。運営には統一■教会がいる。
駅前で「手相を見せてください」と勧誘してるのが統一教■会。(カルト宗教)  
カルト宗教の下にいる人と上にいる奴を分けて考えないといけない。下にいる利用される人は上がどんなことをしてるか知らない。

ユダヤ権力の子分→2ちゃん運営=統一協会上層部=層化上層部=自民党清和会=野党の朝鮮人ハーフの政治家=
与党の朝鮮人ハーフの政治家=金 正日(キム・ジョンイル )=読売サンケイ=小沢十朗
ユダヤ人=ロックフェラー=ブッシュ=クリントン=ヒラリー=アドルフ・ヒトラー=オサマ・ビンラディン

毎日新聞スレを荒らしてる奴らも統■一教会の可能性が高い。
荒らしは洗脳するために「ネトウヨ」などのレッテル付けレスを何千回もする。
現実には「ネトウヨ」などは存在しない。
http://changi.2ch.net/test/read.cgi/ms/1230363385/
0367nobodyさん2008/12/31(水) 23:44:19ID:???
>>365
ありがとうございます、解決しました
0368nobodyさん2009/01/02(金) 21:57:29ID:PIvYRgwW
月(1月〜12月)を選ぶプルダウンの出力と、selected=selectedの扱いについて質問です

$monthAry[] = "1月"; から $monthAry[] = "12月"まで配列にして
$smarty->assign('monthAry',$monthAry); としました。
formを出力するテンプレートファイルでは以下のようにして、プルダウンのoptionに出力しています。
 {foreach from=$monthAry item=var}
 <option value="{$var}">{$var}</option>
 {/foreach}

この書式で、確認画面からの戻り値{$month}(assign値です)とoption要素のvalueが等しければselectedと
するために以下のようにしたんですが、あまりきれいなソースじゃないと思います

{foreach from=$monthAry item=var}
<option value="{$var}"
{if $var==$month}
selected="selected"
{/if}
>{$var}</option>
{/foreach}

一応ちゃんと動いてますが、もっときれいで効率的な書き方はないでしょうか?
■ このスレッドは過去ログ倉庫に格納されています