6

これはしばらくの間私を悩ませてきた質問です。今日ではHTMLコードをインデントすることは良い習慣と考えられていますが、MVCパターンでコードをインデントする予約がいくつかあります。これは(ばかげた)例です。

HTMLコード:

<!DOCTYPE html>
<html>
<head>
<title>Testing MVC Indentation</title>
</head>

<body>

<?php View('h1', 'I am a Level 1 Header'); ?>

    <table>
        <tr>
            <td>
                <?php View('h1', 'I am a Level 1 Header Inside a Table'); ?>
            </td>
        </tr>
    </table>

</body>
</html>

正しくインデントするには、h1ビュー(または部分的)への最初の呼び出しで次の値が返されます。

\t<h1>I am a Level 1 Header</h1>

ビューへの2回目の呼び出しは、次のようにh1返されます。

\t\t\t\t<h1>I am a Level 1 Header Inside a Table</h1>

ただし、h1ビューにはインデントスコープがわからないため、適切にインデントされたデータをどのように返すことができますか?また、ビューのインデントを無視すると、アプリケーションロジックの一部が公開される可能性があります実際の例については、このページのHTMLソースコードを確認してください<div id="content">)。

<body>

<h1>I am a Level 1 Header</h1>

    <table>
        <tr>
            <td>
<h1>I am a Level 1 Header Inside a Table</h1>
            </td>
        </tr>
    </table>

</body>

インデントをまったく行わないと、すべての問題が解決されますが、読み取りと保守が難しくなります。

<body>

<h1>I am a Level 1 Header</h1>

<table>
<tr>
<td>
<h1>I am a Level 1 Header Inside a Table</h1>
</td>
</tr>
</table>

</body>

この問題に対して私が見ている唯一の実行可能な解決策は、Tidy出力バッファリングを使用することですが、処理と読み込みが不必要に遅くなる(?)ので、努力する価値があるのではないかと思います。また、ソースではなく出力のみをインデントするため、HTMLコードの保守が容易になることはありません。

「基本的な」質問で申し訳ありませんが、私はここ数年ビジネスロジックに焦点を当てており、プレゼンテーションの世界とは少し切り離されています。古き良き時代には、HTMLコードはすべてインデントされていませんでした。ここでも、テーブルを使用してレイアウトを設計しました。今すぐ追いつくようにしています。

このテーマに関する解決策/洞察はありますか?


関連する質問:

4

5 に答える 5

5

HTMLソースコードのインデントには違いがあると思います。典型的なMVCビューでは、読みやすい方法でインデントする必要があると思うソースコードを使用します。

ただし、実際のHTML出力は別のものです。もちろん、混沌としたインデントされたソースは、専門家ではないように見えます(これが、インデントを完全に削除する傾向がある理由ですが、通常、HTMLの後処理を行う必要があります)が、ブラウザ自体にとっては、まったく問題がない場合や私は本当にソースを表示する必要があります。フォーマッターまたはFirebugを使用して、すべてのDOM要素を適切にフォーマットされた方法で表示します。

于 2010-02-20T13:46:31.463 に答える
4

前述のように、ソースコードのインデントと出力のインデントには違いがあります。出力は動的に構築されるため、ソースコードのインデントは出力のインデントとは異なる場合があります。テンプレートを作成するときは、ソースコードの読みやすさが最も重要です。最初にそれに集中する必要があります!通常、出力のHTMLインデントは問題ではありません。

そうは言っても、出力のインデントの不一致を取り除くための2つの実用的なアプローチは次のとおりです。

出力を適切にインデントできるテンプレート言語を使用する

最初の例の1つは、Rubyのテンプレート言語であるHamlです。次のようなテンプレートが必要です。

%body
  %h1 I am a Level 1 Header
  %table
    %tr
      %td
        %h1 I am a Level 1 Header Inside a Table

出力は、例のようにきちんとフォーマットされたHTMLになり、すべて適切にインデントされます。

このアプローチの明らかな欠点の1つは、テンプレートで実際にHTMLを記述しているのではなく、HTMLのようなセマンティクスを使用して別の言語で記述していることです。誰がビューを維持するかによっては、これが問題になる可能性があります。

出力から余分な空白をすべて取り除き、インデントしないでください

一部のテンプレート言語には、余分な空白をすべて削除するオプションがあります。Smarty for PHPには、たとえば、この仕事をうまく行う空白トリミングプラグインがあります。すべての出力を意図的に等しくインデントしないようにすることで、出力の美化の問題を完全に回避します。また、ごくわずかな帯域幅も節約できます。

PHPのみの解決策はob_start()$output_callbackハンドラー(ここに記載されています)で使用することです。Smartyプラグインと同様に、余分な空白を取り除く簡単なコールバックを作成できます。出力コールバックでTidyを使用するのとは異なり、これにより、ページの終わりの前にバッファーをフラッシュして、長い/遅いページを高速化できます。

于 2010-02-20T15:08:27.990 に答える
3

3番目の回答を追加して申し訳ありません!久しぶりです。答えを追加したいのですが、反対票を投じないでください。私はこれがここで言われるべきだと思います:

これは機能しているようです。つまり、2つの異なるインデントの「スレッド」があります。1つはPHP用で、もう1つはHTML用です。

<table>
<?foreach($list->sections as $sKey => $section) { ?>
    <tr><td><h4><?= $section->label ?></h4></td></tr>
<?  foreach($section->items as $iKey =>  $item) { ?>
    <tr><td><?= $item->label ?></td></tr>
<?  } ?>
<?} ?>
</table>

常にphpタグを行の先頭から開始し、phpブロックコード内でインデントすることで、結果のコードはクリーンな状態に保たれます。

<table>
    <tr><td><h4>Books 1</h4></td></tr>
    <tr><td>Some Book</td></tr>
    <tr><td>Some Other Book</td></tr>
    <tr><td><h4>Books 2</h4></td></tr>
    <tr><td>Some Book in List 2</td></tr>
</table>

また、PHPとHTMLのインデンテーションロジックは、それぞれ独自のものではありますが、ソースファイルに保持されます。

于 2011-04-20T15:20:13.690 に答える
1

インデントを追跡するために、ここで何かを発明できると思います。

PHPとHTMLを同時に適切にインデントすることは可能ですが、PHP拡張機能またはライブラリ(エレガントで効率的ではありません)として、それを処理するコードを作成する必要があります。

私の最初の推測は、PHPがHTMLのインデントを追跡することであり、新しい行が印刷されたら、前のレベルのインデントで再開します。これは、Enterキーを押したときにほとんどのIDEが行うことのようなものです。PHPプログラマーは、次のような関数を使用してこれを制御できます(私は今これを作成しています)。

  • tab($ n):インデントレベルの$ nタブを右に移動します($ nタブを追加します)
  • detab($ n):インデントのレベルから$nタブを削除します
  • stop():インデントを停止します。タブは出力に追加されません。これは、HTMLPREタグに役立ちます。
  • resume():stop()の後、前のレベルでインデントを再開します。
于 2010-08-31T03:45:40.777 に答える
1

私が時々することは、HTMLの基本的なインデントのために二重引用符で囲まれた文字列で\tを使用することです。それは私がものをデバッグするのに役立ちます。また、foreachループでテンプレートをリッドすることを意味する場合でも、HTMLを可能な限りテンプレート内に保持します。テンプレート(MVCでは「ビュー」と呼ばれます)では、PHPコードのインデントは通常HTMLコードの後に​​続きます。

HTMLを生成する関数に引数を追加して、「インデント対応」の例にすることもできます。

buildSomeHtmlList($data, $indent=0)

その結果、ほとんどがインデントされたHTMLになり、それは私に適しています。

ところで、あなたの例では、これは想定されていることではありません。AFAIk、通常、PHP出力は「<?」で始まるため、テーブル内のH1は適切にインデントされているはずです。この時点で、タブはすでに印刷されています。

于 2010-08-31T03:54:17.860 に答える