![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
以下の条件の時に、Smartyのテンプレートをどのように作成するといいか教えてください。
◎以下は全ページで共通
・HTMLのhead要素部分(title要素のテキスト部分のみ可変)
・画面上のヘッダ部分のメニュー(完全に共通)
・画面上のフッタ部分(完全に共通)
◎以下の部分がページにより異なる
・右サイドに表示されるナビゲーションメニューはカテゴリにより3パターン(もしかしたら増えるかも。それぞれのパターンで10-40行程度)
・メインコンテンツ部分は
- 半数程度のページが出力する要素は共通(テキスト部分のみ異なる。Aパターン)
- 数ページは出力する要素は共通(テキスト部分のみ異なる。Bパターン)
- のこりはパターン化が難しい…
疑問点は以下です
・このような場合、テンプレートファイルは1つにする?
・右サイドのナビゲーションメニュー部分はどうするか?
- テンプレートファイルを3枚に分ける?
- テンプレートファイルは1枚にし、Smartyの組み込み関数のif分で書き分ける?(→テンプレートファイルがけっこう冗長なソースになりそう)
- ナビゲーションメニュー部分のHTML文字列を返す関数を共通で作成し、別ファイルにし、すべてのページのPHPファイルからincludeで呼び出し、その関数の戻り値をSmartyの変数に設定する?(こうしようかと思っているが、無骨?)
・メインコンテンツの部分をどうするか?
テンプレートファイルを1つにすると、分岐が多くなりかえって複雑なソースになり、メンテナンス性が低下してしまいそうという懸念があり、どうしようか迷っています。
個人の趣味の範囲でやっていますが、この件について開発の現場でも通用するようなテクニックを知りたいと思っています。
「実際、似たようなケースでよくこうしてるよ」
「こういう実装が多いが、こう実装した事もある」
など実際のプロジェクトの経験談など教えていただけるとうれしいです。
よろしくお願いします。
No.4ベストアンサー
- 回答日時:
私が普段の業務で行っている方法ですと、大きく分けていくつかのパターンがあり、「1、動的URL又は静的URLのどちらにするか」、「2、メインコンテンツのテキストはデータベース管理して、必要に応じて吐き出すか」、「3、PC用ページ、スマホ用ページ、iPad等のタブレット用ページ分けを行うか」といった事項をあらかじめデザイナーサイドと一番最初に打ち合わせを行います。
「1、動的URL又は静的URLのどちらにするか」については、SEO対策の絡みがありますので、クライアントから「このページはSEOは必須」という要望であれば、静的URLで実装するように考えますが、「特にSEOは意識しないでブログの様な感覚で、ページを作成していきたい」という要望であれば、動的URLにして【 hoge.php?page=1 】の様な感じにしてDBとひも付けします。
「2、メインコンテンツのテキストはデータベース管理して、必要に応じて吐き出すか」については、【1】とも関連することですが、デザイナーサイドが今後テキストを変更する可能性があると判断した場合は、DB管理したほうが後々楽という意味で、大量のページを構築する際はDBからテキストを吐き出すようにしています。
「3、PC用ページ、スマホ用ページ、iPad等のタブレット用ページ分けを行うか」については、アクセスされた端末のユーザエージェントを取得して、それぞれの端末に対応したテンプレートを呼び出します。
PHP側の設定で、アクセスされたページのファイル名を抽出して、そのファイル名を例えば【 $filename 】という変数に格納しておき、テンプレートを呼び出す際に、
↓
//【 PC用 】
{$filename}_pc.tpl
//【 スマホ用 】
{$filename}_sp.tpl
//【 iPad用 】
{$filename}_ip.tpl
という感じで呼び出せば、非常に楽です。
この場合は、必ず「 ○○.php 」と「 ○○_pc.tpl 」&「 ○○_sp.tpl 」&「 ○○_ip.tpl 」の「 ○○ 」つまり【 拡張子を除いたファイル名 】は統一させる必要がありますが、特別こだわりが無ければ全く問題ありません。
includeについては、他の回答者様の仰る通りで良いと思いますが、マニュアルの
http://www.smarty.net/docsv2/ja/language.functio …
の「 {include file='file:/usr/local/include/templates/header.tpl'} 」の様に絶対パスで書いたほうがいいかもしれません。
デフォルトの「 templates 」ディレクトリ内でincludeする場合は、相対パスで大丈夫ですが、全く違うディレクトリの「 templates 」の中のファイルを呼び出そうとした場合に絶対パスで呼び出す必要が出てきます。
結論を申しますと、設計図の様な全てのファイル構成を紙に書くなりして、頭の中を完全に整理したほうが良いかと思われます。( そうは言っても、途中で予想外の構成の変更点などが出てくる可能性はありますが・・・ )
とりあえず、私が行っている方法を今何となく思い返しながら勢いだけで回答してみました。
参考にしていただけば幸いです。
参考URL:http://www.smarty.net/docsv2/ja/language.functio …
パスの件は問題が発生しやすいという事ですよね。私の場合Windows上で開発しLinuxサーバで運用する事になるので、絶対パスで書く選択肢はまず無いのですが、気をつけます。
それからテンプレートファイルの呼びわけは、一言で言えばデータと見た目の完全分離ですね。PCなのかスマホなのかタブレットなのかの判断はUAを信じて振り分けるのですか。そこの部分がきちんとできれば、レスポンシブWEBデザインより柔軟に1つのURLで複数のデバイスに対応できそうですね。
質問の本論と少しはずれていますが参考になりました。ありがとうございました
No.3
- 回答日時:
> 私は「どんな機能があるか把握するまで着手すべきではない」と思うタイプではなく、「とりあえず使い始めて個別の機能についてはおいおい覚えて行けばいい」と思うタイプなので今の感じなのです。
まあ、好きにしてくださいな。おいおい覚える手段としてマニュアルがあります。私の場合、読まないというのはただの怠慢と考えるタイプです。
はぁー、難しい人ですね…。別にいいじゃないですか。マニュアルを通読する前にとりあえず「Hello World!」を試す人がいたって。マニュアルを通読する前に「Hello World!」を試す行為がそんなに許せませんか?なぜそんなに突っかかってくるのかさっぱり分かりません。
>おいおい覚える手段としてマニュアルがあります
当然そうですね。今でもそうしていますよ。あなたが強く求める通読はしていませんが、セットアップの際や変数の表示・分岐など部分的に読んでいます。
「おいおい覚えて行けばいい」という言葉は、一切マニュアルを見る気がないという意味ではないのですよ。
揚げ足を取ろうと必死になるのではなく、できれば質問に答えていただきたかったです…。
ありがとうございました
No.2
- 回答日時:
includeは頻出の機能ですから、知らないというのは…およそSmartyについてその恩恵をほとんど受けていないことに等しいです。
一度マニュアルは通読して、どんな機能があるのか、頭に入れておくべきです。
http://www.smarty.net/docs/ja/
この回答への補足
私は「どんな機能があるか把握するまで着手すべきではない」と思うタイプではなく、「とりあえず使い始めて個別の機能についてはおいおい覚えて行けばいい」と思うタイプなので今の感じなのです。
No.1の補足に書いた
「メインコンテンツの数だけ親テンプレートファイルを作成するという事でしょうか?」この部分について、できれば教えてください。
よろしくお願いします。
>includeは頻出の機能ですから、知らないというのは…
>およそSmartyについてその恩恵をほとんど受けていないことに等しいです。
まぁ、実はそうです…。セットアップを行って「Hello World!」を表示させたところで、それだけしかしていないので、Smartyの恩恵を受けているとはまだいえない状態です。
ありがとうございました
No.1
- 回答日時:
{include file="header.tpl" title="タイトル"}
{include file='menu.tpl'}
<div id="contents">
</div>
{include file='footer.tpl'}
こんな感じ。
この回答への補足
すみません確認させてください。
まず、最初に書くべきことを書き忘れていましたが、ページの総数は現在想定している範囲では30~50くらいです(もしかしたらもっと増えるかもしれません)。ですので「パターン化が難しい」に該当するページ数はおおむね、10~20くらいになると思っています。
※header.tplやmenu.tplを子テンプレート
それを呼び出すテンプレートを親テンプレートと呼んだ時、
メインコンテンツの「のこりはパターン化が難しい」という部分に関しては、メインコンテンツの数だけ親テンプレートファイルを作成するという事でしょうか?
子テンプレートに多くを記述することにすれば、親テンプレートファイルの内容は比較的シンプルにできますけど、親テンプレートファイルの数が増えてしまうことに疑問を持ちました。
そういうものなのでしょうか?
すみません、この点について追加で教えてください。
よろしくお願いします。
あ、なるほど…。
テンプレートからテンプレートを呼べるのですね。
この構文は知りませんでした。
参考になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- ホームページ作成・プログラミング ホームページ作成について。「ワードプレスではありません」。 3 2023/08/13 14:44
- Excel(エクセル) Excelのマクロコードについて教えてください。 1 2022/03/27 10:47
- Word(ワード) ワードのテンプレ作れる? 1 2022/03/26 10:35
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/01/12 16:58
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
if(preg_match("/[^0-9]/",$gu_...
-
htmlで複数の個数入力欄を表示...
-
phpでcookieがうまく保存されない
-
PHPのセッション有効期限について
-
$_SESSIONについて教えて下さい。
-
substrの使い方について教えて...
-
PHPでCSVを出力するさいに、ル...
-
PHPSpreadsheetによる書き出し...
-
PHPで画像の渡しが上手く行きま...
-
PHP と MySQL でテーブルの行数...
-
PHP MySQLに画像を直接保存
-
isset — 変数が宣言されている...
-
ゆゆにゃ。
-
アマゾンのような評価の星を選...
-
ファイルアップロードに関して...
-
PHPで訪問回数を表示するカウン...
-
PHPSpreadsheetを使って関数を...
-
$_SESSIONに渡した後はそのまま...
-
PHPの変わった閉じタグの必要性...
-
クエリObjectをforeachで回す時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
is_fileでファイルが存在してい...
-
PHPのファイルロックについて
-
cakephp views/pagesの中にイ...
-
Smartyのテンプレート作成方法
-
文字コードが混在するテキスト...
-
file()を使う時のファイルロック
-
MovableTypeでカテゴリー、月別...
-
シムシティDSのファイルについて
-
フォントの色を変えるには?
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
-
こちらはただの直列処理ですか?
-
別ファイルの変数を呼び出した...
-
PHP8を使うと、大量のWarningが...
-
トランザクションが原因?DBに...
-
form actionで二つ送信先を指定...
-
FTPコマンドでディレクトリごと...
-
.phpと.incファイルの違いはな...
-
VBSの「MsgBox」について
-
ワードプレス、Contact Form 7...
おすすめ情報