2012-07-29 2 views
7

クラス関数内でhtmlを使用すると何か問題がありますか?私はそれをDOMで呼び出すので、返される文字列は必要ありません。phpクラスの中でhtmlを使うのは悪いですか?

public function the_contact_table(){ 
    ?> 
    <div> 
     some html here 
    </div> 
    <?php 
} 

また、文字列が必要な場合は、このメソッドを使用しますか?より良い方法があるのですか、これは比較的標準ですか?

public function get_single(){ 
    ob_start();?> 
     <div class='staff-member single'> 
      <div class='col left'> 
       <div class='thumbnail'> 
        thumbnail 
       </div> 
       <?php $this->the_contact_table(); ?> 
      </div> 
      <div class='col right'> 

      </div> 
     </div>  
    <?php 
    $content = ob_get_contents(); 
    ob_end_clean(); 
    return $content; 
} 

UPDATE

私はこれをやっている、なぜ私が説明している必要があります。私はWordpressのプラグインを作っているし、ポストタイプの出力を制御したい。だから私はあなたが見ることができるように、私私は唯一のアプリケーションのロジックのためのPHPを使用することをお勧めだと思いますワードプレスコア

+0

...のように、それが少し見えると思いますので、しかし、[ZF](HTTPに... –

+0

ルックより迅速にHTMLをレンダリングします。ビュー、モデル、コントローラを分離する方法を知りたい場合は、zend.com/を参照してください。 – Sam152

+0

残念ながら、これはWordpressのプラグインですが、私は仕事でZendを使用します – JackMahoney

答えて

4

長い文字列を変数に格納する場合は、出力バッファリングの代わりにHEREDOCを使用する必要があります。

$content = <<<EOD 
content here 
EOD; 

EODは何もすることが、二つの重要な事柄に注意することができます:それはこのようになりますそれはそれの前に空白を持つことはできません

  1. をして、それはそれ自身のライン上にある必要があります
  2. それはあなたがPHP> = 5.3を使用している場合は、あなたが内部の変数のために解析されないNOWDOCを、使用する必要がありますあなたのコンテンツの中に見つけることができる文字列

すべきではありませんc(これが必要な場合を除きます)。 NOWDOCの構文でのみ異なるが、センチネルは、引用符で囲まれていることである。

$content = <<<'EOD' 
content here 
EOD; 

私は、出力バッファリングから離れて迷いたい理由は、それがクライアントに送信されたデータをチャンクからサーバーを防ぐことです。これは、コンテンツが徐々にクライアントに送信されて表示されるのではなく、一度にすべて強制的に送信されるため、要求が遅く見えることを意味します。出力バッファリングは、データを返すのではなく、不必要にデータを返す場合や、特定のアプリケーションのために特別な必要がある場合にツールを使用する場合のハックです。また、出力バッファリング(関数呼び出しを含むため)を使用する場合、文字列を変数にHEREDOCingするか、ビューを含める場合は、実行時にヒットすると思います。

これは適切かどうかという質問に答えるために、私はMVCアプリケーションではすべてのHTMLとその他のコンテンツをそれぞれのビューに含めるべきだと言います。コントローラはビ​​ューを呼び出して表示することができ、ビューの表示に関わるコードを知っていることを心配する必要はありません。ビューに情報(タイトル、著者、タグの配列など)を引き渡すことはできますが、ここでの目標はロジックからコンテンツを分離することです。

Wordpressのテンプレートとコードは、MVCを実装していないと、あまりにもゆるやかに見えるように見えます。そのためにビューを作成するにはあまりにも多くの作業が必要な場合は、WPのスタイルで収まるでしょう。

+0

Ok、出力バッファリングの使用には何が欠点ですか? – JackMahoney

+0

@JackMahoney OBの欠点を説明するために更新されました。 –

+0

アドバイスをいただきありがとうございます。私はWordpressが乱雑になることに同意する。私はそれが文字列を返す必要があるので、heredocが最良の解決策になると思います。他の人はコントローラからビューを区切って言及しているが、私は文字列を返す必要があるので、output_bufferingを使用する必要があります – JackMahoney

2

に文字列を返す必要があり

public function filter_single($content){ 
    global $post; 
    if ($post->post_type == 'staff-member') { 

     $sm = new JM_Staff_Member($post); 
     $content = $sm->get_single(); 
    } 
    return $content; 
} 

以下のようなフィルタを使用していますいくつかのデータをビュー層(テンプレートエンジン)に送信する。これに応じて、MVCのようないくつかのパターンがあります。

4

PHPクラスファイルの中に実際に「ビュー」を配置することによって、フロントエンド開発者を疎遠にするということは、良い習慣ではありません。これは私がPHPを一般的に使い始めたときの私の最大の問題の1つでした。クラス内で動的にコンテンツを作成したかったのです。素晴らしいアイデアですが、チームの多くのメンバーができるだけスムーズに一緒に作業できるようにしたいと思っています。

おそらく

public function get_single(){ 
    ob_start(); 
    require_once('views/staff-member-single.php'); 
    $content = ob_get_contents(); 
    ob_end_clean(); 
    return $content; 
} 

あなたは一般的に再利用可能な方法の中にそれをリファクタリングしたいあなたは、あなたの関数内で呼び出す「スタッフ・メンバー-single.php」と呼ばれる別のファイル、の内のコンテンツを持っている必要があります//フレームワーク:PHPはクラスの外にそれを維持する、より多くの作業する必要

public function get_single() 
{ 
    $string = $this->render_view_as_string('satff-member-single'); 
    return $string; 
} 

public function render_view($view) 
{ 
    require('views/'.$view.'.php'); 
} 

public function render_view_as_string($view) 
{ 
    ob_start(); 
    $this->render_view($view); 
    $content = ob_get_contents(); 
    ob_end_clean(); 
    return $content; 
} 
+0

は、アプリケーションを表示するための質問を更新しました。 – JackMahoney

+0

文字列を返す 'get_single()'関数を実際に表示するように私の答えを編集しました。 return文は自分のコードにはありませんでしたが、requireを使用すると、ビューファイルにはまだクラス内にあるかのようにすべてのクラスの変数にアクセスできるので、それはあなたの例に合っていなければなりません。 – Anther

+0

ありがとう、私はこの解決策が好きです。私はチームで働くことについてのあなたのポイントに感謝します。私はフロントエンドの開発者です。 – JackMahoney

関連する問題