dポイントプレゼントキャンペーン実施中!

以下の条件の時に、Smartyのテンプレートをどのように作成するといいか教えてください。

◎以下は全ページで共通
・HTMLのhead要素部分(title要素のテキスト部分のみ可変)
・画面上のヘッダ部分のメニュー(完全に共通)
・画面上のフッタ部分(完全に共通)

◎以下の部分がページにより異なる
・右サイドに表示されるナビゲーションメニューはカテゴリにより3パターン(もしかしたら増えるかも。それぞれのパターンで10-40行程度)
・メインコンテンツ部分は
  - 半数程度のページが出力する要素は共通(テキスト部分のみ異なる。Aパターン)
  - 数ページは出力する要素は共通(テキスト部分のみ異なる。Bパターン)
  - のこりはパターン化が難しい…


疑問点は以下です
・このような場合、テンプレートファイルは1つにする?
・右サイドのナビゲーションメニュー部分はどうするか?
 - テンプレートファイルを3枚に分ける?
 - テンプレートファイルは1枚にし、Smartyの組み込み関数のif分で書き分ける?(→テンプレートファイルがけっこう冗長なソースになりそう)
 - ナビゲーションメニュー部分のHTML文字列を返す関数を共通で作成し、別ファイルにし、すべてのページのPHPファイルからincludeで呼び出し、その関数の戻り値をSmartyの変数に設定する?(こうしようかと思っているが、無骨?)
・メインコンテンツの部分をどうするか?


テンプレートファイルを1つにすると、分岐が多くなりかえって複雑なソースになり、メンテナンス性が低下してしまいそうという懸念があり、どうしようか迷っています。

個人の趣味の範囲でやっていますが、この件について開発の現場でも通用するようなテクニックを知りたいと思っています。

「実際、似たようなケースでよくこうしてるよ」
「こういう実装が多いが、こう実装した事もある」
など実際のプロジェクトの経験談など教えていただけるとうれしいです。

よろしくお願いします。

A 回答 (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 …
    • good
    • 0
この回答へのお礼

パスの件は問題が発生しやすいという事ですよね。私の場合Windows上で開発しLinuxサーバで運用する事になるので、絶対パスで書く選択肢はまず無いのですが、気をつけます。

それからテンプレートファイルの呼びわけは、一言で言えばデータと見た目の完全分離ですね。PCなのかスマホなのかタブレットなのかの判断はUAを信じて振り分けるのですか。そこの部分がきちんとできれば、レスポンシブWEBデザインより柔軟に1つのURLで複数のデバイスに対応できそうですね。

質問の本論と少しはずれていますが参考になりました。ありがとうございました

お礼日時:2014/06/15 17:10

> 私は「どんな機能があるか把握するまで着手すべきではない」と思うタイプではなく、「とりあえず使い始めて個別の機能についてはおいおい覚えて行けばいい」と思うタイプなので今の感じなのです。



まあ、好きにしてくださいな。おいおい覚える手段としてマニュアルがあります。私の場合、読まないというのはただの怠慢と考えるタイプです。
    • good
    • 0
この回答へのお礼

はぁー、難しい人ですね…。別にいいじゃないですか。マニュアルを通読する前にとりあえず「Hello World!」を試す人がいたって。マニュアルを通読する前に「Hello World!」を試す行為がそんなに許せませんか?なぜそんなに突っかかってくるのかさっぱり分かりません。


>おいおい覚える手段としてマニュアルがあります

当然そうですね。今でもそうしていますよ。あなたが強く求める通読はしていませんが、セットアップの際や変数の表示・分岐など部分的に読んでいます。

「おいおい覚えて行けばいい」という言葉は、一切マニュアルを見る気がないという意味ではないのですよ。

揚げ足を取ろうと必死になるのではなく、できれば質問に答えていただきたかったです…。

ありがとうございました

お礼日時:2014/06/12 16:40

includeは頻出の機能ですから、知らないというのは…およそSmartyについてその恩恵をほとんど受けていないことに等しいです。


一度マニュアルは通読して、どんな機能があるのか、頭に入れておくべきです。
http://www.smarty.net/docs/ja/

この回答への補足

私は「どんな機能があるか把握するまで着手すべきではない」と思うタイプではなく、「とりあえず使い始めて個別の機能についてはおいおい覚えて行けばいい」と思うタイプなので今の感じなのです。

No.1の補足に書いた
「メインコンテンツの数だけ親テンプレートファイルを作成するという事でしょうか?」この部分について、できれば教えてください。

よろしくお願いします。

補足日時:2014/06/11 15:26
    • good
    • 0
この回答へのお礼

>includeは頻出の機能ですから、知らないというのは…
>およそSmartyについてその恩恵をほとんど受けていないことに等しいです。

まぁ、実はそうです…。セットアップを行って「Hello World!」を表示させたところで、それだけしかしていないので、Smartyの恩恵を受けているとはまだいえない状態です。

ありがとうございました

お礼日時:2014/06/11 15:20

{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を子テンプレート
それを呼び出すテンプレートを親テンプレートと呼んだ時、

メインコンテンツの「のこりはパターン化が難しい」という部分に関しては、メインコンテンツの数だけ親テンプレートファイルを作成するという事でしょうか?

子テンプレートに多くを記述することにすれば、親テンプレートファイルの内容は比較的シンプルにできますけど、親テンプレートファイルの数が増えてしまうことに疑問を持ちました。

そういうものなのでしょうか?
すみません、この点について追加で教えてください。
よろしくお願いします。

補足日時:2014/06/10 21:19
    • good
    • 0
この回答へのお礼

あ、なるほど…。
テンプレートからテンプレートを呼べるのですね。
この構文は知りませんでした。

参考になりました。ありがとうございました。

お礼日時:2014/06/10 20:41

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