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>
  12.  

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を利用しましょう。

投稿日 2010年5月24日 21:06
カテゴリ PHP
タグ WordPress
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1202

コメント

コメントする
Name
Email Address
URL