テンプレート中のPHPタグのインデント

symfonyCakePHPではテンプレート機能として素のPHPを使うのが基本となっています。
色々意見はあると思いますが、PHPそのものがHTMLに埋め込みやすいという点が大きいところです。

その中で気になる点があります。それはPHPタグのインデント方法についてです。

文章で説明するのもなんなので以下のHTMLを出力するPHPを考えてみてください。

<dl>
  <dt>title</dt>
  <dd>contents</dd>
  <dd>contents</dd>
  <dd>contents</dd>
  <dt>title</dt>
  <dd>contents</dd>
  <dd>contents</dd>
  <dd>contents</dd>
  <dt>title</dt>
  <dd>contents</dd>
  <dd>contents</dd>
  <dd>contents</dd>
</dl>

PHPに慣れている人であれば難しくは無いと思います。
おそらく以下のようなPHPを書くのではないでしょうか?

<dl>
<?php for($i=1; $i<=3; $i++): ?>
  <dt>title</dt>
  <?php for($p=1; $p<=3; $p++): ?>
  <dd>contents</dd>
  <?php endfor ?>
<?php endfor ?>
</dl>

dtとddをループさせるためfor構文を用いていることと、終了をendforを用いています。
そしてdtとddのためにforが入れ子になるため、インデントをつけて解りやすくしています。
ref: http://jp.php.net/manual/ja/control-structures.alternative-syntax.php


たしかに、これで実現できますし、表示上何も問題はありません。
しかし、実際に出力したHTMLのソースは以下のようになります。

<dl>
  <dt>title</dt>
    <dd>contents</dd>
    <dd>contents</dd>
    <dd>contents</dd>
    <dt>title</dt>
    <dd>contents</dd>
    <dd>contents</dd>
    <dd>contents</dd>
    <dt>title</dt>
    <dd>contents</dd>
    <dd>contents</dd>
    <dd>contents</dd>
  </dl>

見てすぐわかるようにソースのインデントは崩れています。原因はもうおわかりですよね。
PHP入れ子になったforを見やすくするために入れたインデントのため、ソースに余計なインデントがついてしまったからです。

さきほども書きましたが、これでも表示上は何も問題ありません。
いまではFirebugなど便利なツールもあるので直接ソースを眺めて。。。という機会は減ってますしね。

しかし、次のような場合には少なからず違和感を覚える場合があると思います。

  1. HTMLではインデントしないというコーディングルールだった場合
  2. モバイルなどでパケット量を少しでも抑えるために努力しなければならない場合

というわけで、その場合の方法として以下のような方法がありかと思います。

<dl>
<?php for($i=1; $i<=3; $i++): ?>
  <dt>title</dt>
<?php     for($p=1; $p<=3; $p++): ?>
  <dd>contents</dd>
<?php     endfor ?>
<?php endfor ?>
</dl>

<?php のタグの中でインデントを行うようにすれば、ロジックの可読性もそれほど落とさずに余計なインデントがHTMLに含まれないようにすることができます。
とはいえ、タグのインデントだけで入れ子になっているのを判断できないのは決して見やすいとは思えませんね。。