KANTENNA.COM

Solarized

HOME > WEBプログラム覚書 > [WordPress]テンプレートがごちゃごちゃしてきたらstr_replace

[WordPress]テンプレートがごちゃごちゃしてきたらstr_replace

PHPとHTMLが濃密に絡みあうテンプレートは最もカオスになる部分。 自分が出来てない濃密な絡みをWordPressだけしてるなんて許せないので何とかすっきりさせたいところです。

とはいえテンプレートエンジンを利用するのも面倒だし、 printf、sprintfの%sとか意味不明って人はstr_replace使うと幸せになれるかもしれません。

例えばこんな配列を

PHP
  1.  <?php
  2.  $books = array(
  3.   array(
  4.   'url' => 'http://www.amazon.co.jp/',
  5.   'img' => 'http://www.amazon.co.jp/img.gif',
  6.   'title' => 'Amazonの本',
  7.   'price' => '1,500',
  8.   'desc' => 'これはアマゾンの本です',
  9.   ),
  10.   array(
  11.   'url' => 'http://www.amazon.co.jp/',
  12.   'img' => 'http://www.amazon.co.jp/img.gif',
  13.   'title' => 'Amazonの本',
  14.   'price' => '1,500',
  15.   'desc' => 'これはアマゾンの本です',
  16.   ),
  17.   .
  18.   .
  19.   .
  20.  );
  21.  ?>

こういうHTMLに出力したい場合

HTML
  1.  <div class="book">
  2.   <div class="left">
  3.   <p><a href="URL">画像</a></p>
  4.   </div>
  5.  
  6.   <div class="right">
  7.   <h4>本のタイトル</h4>
  8.   <p class="price">価格</p>
  9.   <p class="desc">説明文</p>
  10.   </div>
  11.  </div>

echo を使って酷く書くと

PHP
  1.  <?php
  2.  foreach ($books as $book) {
  3.   echo '<div class="book">';
  4.   echo '<div class="left">';
  5.   echo '<p><a href="' . $book['url'] . '">' . $book['img'] . '</a></p>';
  6.   echo '</div>';
  7.  
  8.   echo '<div class="right">';
  9.   echo '<h4>' . $book['title'] . '</h4>';
  10.   echo '<p class="price">' . $book['price'] . '</p>';
  11.   echo '<p class="desc">' . $book['desc'] . '</p>';
  12.   echo '</div>';
  13.   echo '</div>';
  14.  }
  15.  ?>

こうなります。function.phpにこんな関数を作っておくと

PHP
  1.  <?php
  2.  function tmpl($tpl, Array $key_val)
  3.  {
  4.  
  5.   $keys = array();
  6.   $vals = array();
  7.  
  8.   while (list($key, $val) = each($key_val)) {
  9.   $keys[] = '{{ ' . $key . ' }}';
  10.   $vals[] = $val;
  11.   }
  12.  
  13.   return str_replace($keys, $vals, $tpl);
  14.  }
  15.  ?>

このように書くことが出来ます。

PHP
  1.  <?php
  2.  $book_tmpl = '
  3.  <div class="book">
  4.   <div class="left">
  5.   <p><a href="{{ url }}"><img src="{{ img }}" /></a></p>
  6.   </div>
  7.  
  8.   <div class="right">
  9.   <h4>{{ title }}</h4>
  10.   <p class="price">{{ price }}</p>
  11.   <p class="desc">{{ desc }}</p>
  12.   </div>
  13.  </div>
  14.  ';
  15.  
  16.  $book_html = '';
  17.  
  18.  foreach ($books as $book) {
  19.   $book_params = array(
  20.  
  21.   'url' => $book['url'],
  22.   'img' => $book['img'],
  23.   'title' => $book['title'],
  24.   'price' => $book['price'],
  25.   'desc' => $book['desc']
  26.  
  27.   );
  28.  
  29.   $book_html .= tmpl($book_tmpl, $book_params);
  30.  }
  31.  
  32.  echo $book_html;
  33.  ?>

まぁ冗長になってるんですが、個人的にはコレが今のところ一番編集しやすいかなと。

ヒアドキュメントも良い案かと思います。個人的にインデントが気に入らないので使いませんが。 実際の現場ではWordPressを使ったサイト作るときどうやって分業してるんだろ??

注意点としては、関数でサニタイズするか、サニタイズ済みのデータを渡すかは統一してたほうがよいかもです。 統一出来ない場合はpreg_replaceを利用しましょう。

WordPress ポケットリファレンス (POCKET REFERENCE)
作者:村上 晴美 | 価格:¥ 2,604

トラックバック(6)

2010年6月 9日 03:28

[WordPress]強引なキャッシュWEBプログラム覚書

WordPressの強引なキャッシュ。実用性はない。続きを読む

2011年6月28日 12:13

[WordPress]投稿タイプ、タクソノミー、タームについてWEBプログラム覚書

投稿タイプ、タクソノミー、タームとか意味わかんね続きを読む

2011年10月 5日 03:48

[WordPress]ハマりポイントget_user_meta()WEBプログラム覚書

ローカル環境で動いて本番環境で動かない。ローカル環境と本番環境で$table_prefixが異なる場合などget_user_meta()使ってないか確認し...続きを読む

2011年12月12日 11:25

[jQuery] もう+演算子とはおさらば。jQuery TemplatesWEBプログラム覚書

jQueryに1年以上前から公式なテンプレートエンジンがあった件続きを読む

2012年1月12日 01:13

[WordPress] 次の投稿と前の投稿を取得する。WEBプログラム覚書

どこからでも次の投稿と前の投稿を取得できるよう、get_adjacent_post()を変更してみる。続きを読む

2012年1月13日 01:48

[WordPress] テンプレートのごちゃごちゃが限界にきたのでラッパー書いてみた。WEBプログラム覚書

テンプレートのごちゃごちゃが限界にきたのでラッパー書いてみた。でも僕なんかではなくもっとデキる人が書いたものを使いたいw続きを読む

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24
2012
01.23

MinGW+Mintty+Git

MinGW+Mintty+Gitをやろうとして失敗に終わった。このエントリーには収穫できるものはありません。

2012
01.21

[PHP]共有サーバーユーザーのためのPEARインストール方法

共有サーバーでは自由にPEARのパッケージがインストールできないので、 プロジェクトローカルに設置することになりますが、以前httpベースのものを使ってみたんですけど、 やたら重くて使い物にならなかったので、僕は普通にFTPでアップするようにしてます。

ってことでプロジェクトローカルへのPEARのインストール方法。