PHP でシステムを開発する際ですが、恐らく何かしらのフレームワークを利用した場合は大半だと思います。そう言った時にテンプレートエンジンの Smarty を合わせて利用するかどうか意見が別れる時があります。

PHP でフレームワークが今ほど使われていなかった大昔は、素の PHP 実装 + Smarty で、ロジックとテンプレートを分離する流れがありました。
しかし、現在利用されるほとんどのフレームワークでは当たり前のように MVC の思想で構成されており、ロジックとテンプレートは初めから分離されています。

そう言った状況の中、Smarty を各フレームワークと連携してテンプレートエンジンとして利用する必要がどれほどあるのか、判断に苦しみます。

皆さんはどう考えるでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (4件)

そもそも、CakeやZend Framework、Fuelなどほとんどのフレームワークが、設計コンセプトにおいて、Smartyの存在を無視している以上、あえて過去の遺物を引きずる必要はないです。


Smartyはテンプレートエンジンですらない、単なるタグパーサであり、モダン・フレームワークのアーキテクチャに合いません。
最新のMVCであるLaravelなどは、自前でBladeというテンプレートエンジンを装備していますし、WordpressのようなCNSでもSmartyは用なしです。

Smartyを採用したがるのは、開発をレガシーphpの手法に引き戻して、何とか仕事を自分たちの手の届く範囲に止めたい、オールドデベロッパーの悪アガキに思えます。
    • good
    • 1
この回答へのお礼

ストレートなご意見ありがとうございます。
共感部分が多いです。

こちらの開発リソースが特別なのか、Smarty有りきの方が割と多いんです。
(昔からPHP + Smartyで開発してきているからなのか)
よく言われるのが、Smartyでないとコードが汚い。
Smartyには便利機能が豊富でテンプレート処理が簡単。

個人的は、Smartyを定義してSmartyに情報を設定するコード自体が、フレームワーク標準ではなくSmartyの拡張コードという認識なので汚い?というか不要なコードに感じてます。
シンプルでなくなっている認識です。

本当にメリットがあるのか、その場では理解した風でいますが、本当はイマイチ腹に落ちてきていない感じです。

お礼日時:2014/09/28 23:31

cakeだと、viewはE-R図を描いた上bakeで生成されてしまいますので、それを使わないと連携が危うくなります。


modelとの密接な連携も、フレームワークが囲い込んでいますし。

ただし、全くmodelと無関係なオブジェクトを使用するというのであれば、smartyは名前の通りスマートにできます。

Zendは書き方・書式がうるさい系統ですから、smartyを使うと、コードチェックに引っかかる可能性があります。

設計者の頭の中で、ここからはsmartyの領域だと区分けがきっちりできれば原則問題はないかと思います。
が、そんなに頭脳はクリアではないのです。

cakeが1から2になったときの混乱は今もひきずっていますが、smartyと一緒に使った場合、次に3ができて移行しようとしたときかなり混乱するようには思います。
    • good
    • 0
この回答へのお礼

ご意見ありがとうございます。

設計はシンプルな方が絶対いいですね。
後から参加した方に頭を悩ませたくないですし、メインでも無いところで考えるのが勿体無いです。

ベース部分(プロジェクトの骨組み)は限りなくシンプルが理想です。

お礼日時:2014/09/28 23:16

MVCになっていても搭載されているViewの機能が貧弱の場合があります。


その場合、Smartyを使った方が楽な場合があります。
(SmartyはViewに機能を絞って開発されている分、Viewとしての機能は高機能なので)
    • good
    • 0
この回答へのお礼

ご意見ありがとうございます。

確かに、Smartyにある機能が各フレームワークのテンプレート機能にないというのは、話している方がいました。
簡単な処理だったので、それならビューヘルパーか何かで自前で用意することもできるはずなんですけどね。

どう説明するか、難しいときもあります。。

お礼日時:2014/09/28 23:11

Zend FrameworkとかCakePHPといった


MVCフレームワークを使うのであれば、
Smartyの必要性はあまりないような気がします。
素人の浅はかな考えですが…。
    • good
    • 1
この回答へのお礼

ご意見ありがとうございます。
基本、私も同様の考えです。

お礼日時:2014/09/28 23:06

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QリダイレクトでPOST

教えてください。

リダイレクトの際、POSTで次のページにデータを渡すことは可能でしょうか?

GETだと
header("Location: "a.php?no=".$no);
と、問題なくできるのですが、
できれば、パラメータを隠したいと思います。

以上ですが、よろしくお願いします。

Aベストアンサー

多分できないです。
それに、結局クライアント側に情報を送信しているのだから、POSTにしたところでパラメータを隠した事にはならないですし。
本当に隠すならサーバ側でセッション情報を引き継ぐような形にしないとダメでしょう。

AJAXのかたちにして、ページ遷移を見えなくするというのが手っ取り早いかも。

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

QPHP クラスの中にクラス

PHPでクラスの中にクラスを指定するのは不可能なことなのでしょうか?

<例>
name.php
<?
require("list.ini");

$list = new Select;
$list->doSelect($a);
<中略>
?>

list.ini
<?
class Select{
function doSelect($qu){
require("col.ini");
$col = new Col;
$col->doCol($ab,$ac);
<中略>
}
?>

col.ini
<?
class Col{
function doCol($a,$b){

<中略>
}
?>

とすると
Fatal error: Cannot redeclare class
エラーがでます。

不可能なのでしょうか?

よろしくお願いします。

Aベストアンサー

書き方の問題ですね。
col.ini のクラス宣言部
class Col{
 省略
}

list.ini
の先頭に
<?
class Col{
 省略
}
class Select{
function doSelect($qu){
$col = new Col;
$col->doCol($ab,$ac);
 省略
}
}
の様に1つのファイルにまとめて記述してしまうか、
または、

list.ini
の先頭でclass Select{
の前に
require_once("col.ini");
class Select{
function doSelect($qu){
// require("col.ini"); // この行は削除
$col = new Col;
 省略
}
}

の様にすれば良いと思います。

Qrequire_once()でファイルが読み込めません

すいません、色々やったみたのですがよく分からなかったので教えてください。

PHPのテンプレートのSmartyを使いたいと思い、公式サイトからダウンロードして/usr/local/lib/php/Smartyにコピーしました。

その後、php.iniのinclude_pathにて".:/usr/local/lib/php/Smarty"と設定し、require_once("Smarty.class.php");としたのですが、

failed to open stream: No such file or directoryや
Failed opening required 'Smarty.class.php'

というエラーが出て読み込めません。また、phpinfo()を見る限りではphp.iniはきちんと読みにいっているようでした。

ためしに/usr/にSmartyを置き、include_pathもそのように変更してみたのですが読み込めません。カレントディレクトリに配置した場合は上手く読み込めました。また、Smartyでなくてもどのファイルでも読み込めない状況です。

環境はFedora6、Apache2.0、PHP5です。何かアドバイスよろしくお願いします。

すいません、色々やったみたのですがよく分からなかったので教えてください。

PHPのテンプレートのSmartyを使いたいと思い、公式サイトからダウンロードして/usr/local/lib/php/Smartyにコピーしました。

その後、php.iniのinclude_pathにて".:/usr/local/lib/php/Smarty"と設定し、require_once("Smarty.class.php");としたのですが、

failed to open stream: No such file or directoryや
Failed opening required 'Smarty.class.php'

というエラーが出て読み込めません。また、phpinfo()を見る限...続きを読む

Aベストアンサー

Smarty.class.phpのパーミッションはどうですか?

include_path上にファイルが存在しても、Webサーバを動かしているユーザから読めなければ、ファイルが読めずエラーになります。

一時的に
chmod 755 Smarty.class.php
としてみてはどうでしょう?

これで動くようなら、所有者を変更するかして正しいパーミッションに戻せばよいと思います。

Q文字列から、特定の文字を削除したい

アンケートで入力された値を受け取り、メールで送信しているのですが、受け取った値から、特定の文字列を削除することは可能でしょうか?

例えば電話番号の入力の場合、
03-xxxx-xxxx →03xxxxxxxx
077-xxx-xxxx →077xxxxxxx
のように、-(ハイフン)が入力されていたら、-を削除した文字列に置換してメール送信したいのです。
入力する時に、3つのテキストエリアに分けるのは諸事情でできないので、特定の文字を削除する関数か処理方法がありましたら、教えていただきたいです。
よろしくお願いします。

Aベストアンサー

str_replace
http://itbtech.itboost.co.jp/man/php_man/function.str-replace.html

<?php
$orig_telno = "03-xxxx-xxxx";

$telno = str_replace("-", "", $orig_telno);
echo $telno;

03xxxxxxxx

“PHP 文字列” あたりをキーワードに検索すれば
そんなに難しいものでもないような。

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

QSmarty 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ファイルから
$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/というディレクトリは、$te...続きを読む

Aベストアンサー

まずcontents.tplのみを呼び出して実行出来ますか?

templatesにフォルダを分けているなら、
下記のようになります。

/templates/ 
 ├ body.tpl
 ├/111/
   └contents.tpl
 ├/222/
   └contents.tpl

body.tplを呼び込んで、その中で、
{include file="111/contents.tpl"}
{include file="222/contents.tpl"}

で読み込めると思うのですが。


$this->template_dir = "/home/public_html/templates";
$this->compile_dir = "/home/public_html/templates_c";
$this->config_dir = "/home/public_html/conf";

Windowsの場合は、
$this->template_dir = "C:/home/public_html/templates";

まずcontents.tplのみを呼び出して実行出来ますか?

templatesにフォルダを分けているなら、
下記のようになります。

/templates/ 
 ├ body.tpl
 ├/111/
   └contents.tpl
 ├/222/
   └contents.tpl

body.tplを呼び込んで、その中で、
{include file="111/contents.tpl"}
{include file="222/contents.tpl"}

で読み込めると思うのですが。


$this->template_dir = "/home/public_html/templates";
$this->compile_dir = "/home/public_html/templates_c";
$this->config_dir ...続きを読む

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

Q宜しくお願いします。

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから--->

$min = h($r -> x);
$max = h($s -> y);
for($i=$min ; $i<= $max; $i++){
$search = sprintf("SELECT id FROM Sheet WHERE no='%d'",$i);
$q_search = mysql_query($search);
$result = mysql_fetch_object($q_search);
echo $result;
}

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから...続きを読む

Aベストアンサー

PHPあまり詳しくないので間違っていたらすいません。


>$result = mysql_fetch_object($q_search);
でresultはobject型で代入しておりそれを表示するときにString型に変換できていないのが原因かとおもわれます。

参考URL
mysql-query
http://php.net/manual/ja/function.mysql-query.php

mysql-fetch-array
http://php.net/manual/ja/function.mysql-fetch-array.php

mysql_fetch_object
http://phpspot.net/php/man/php/function.mysql-fetch-object.html

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報