2012-07-29 15 views
7

ist etwas falsch mit der Verwendung von HTML innerhalb einer Klassenfunktion? Ich rufe es im DOM an, also brauche ich keine zurückgegebene Zeichenkette.Ist es schlecht, HTML in einer PHP-Klasse zu verwenden?

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

Auch wenn ich die Zeichenfolge brauche, verwende ich diese Methode? Gibt es einen besseren Weg oder ist das relativ Standard?

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

ich erklärt haben sollte, warum ich das tue. Ich mache ein Wordpress-Plugin und möchte eine Post-Typ-Ausgabe steuern. So verwende ich einen Filter wie unten

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; 
} 

So wie Sie sehen können, ich muss einen String an das Wordpress-Kern zurückkehren

+0

PHP muss mehr arbeiten, es aus der Klasse zu halten macht HTML schneller .. –

+0

Blick in [ZF] (http: // Rahmen. zend.com/) wenn Sie lernen möchten, wie Sie Ihre Ansichten, Modelle und Controller trennen. – Sam152

+0

Leider ist dies ein Wordpress-Plugin, ich benutze Zend bei der Arbeit aber – JackMahoney

Antwort

4

Sie sollten HEREDOC anstelle der Pufferung der Ausgabe verwenden, wenn Sie eine lange Zeichenfolge in einer Variablen speichern möchten. Es sieht wie folgt aus:

$content = <<<EOD 
content here 
EOD; 

EOD kann alles sein, aber zwei wichtige Dinge beachten:

  1. es keine Leerzeichen vor ihm haben kann und es auf seine eigene Linie sein muss
  2. Es sollte nicht eine Zeichenfolge sein, die in Ihrem Inhalt gefunden werden konnte

Wenn Sie PHP> = 5.3 verwenden, dann sollten Sie Nowdoc verwenden, die nicht in der do für Variable nicht analysieren c (es sei denn, du brauchst das). Der einzige Unterschied mit der Syntax von Nowdoc ist, dass der Sentinel in Anführungszeichen eingeschlossen ist:

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

Der Grund, warum ich von Ausgabepufferung weg verirren würde, ist, dass es den Server von Chunking die Daten an den Client gesendet verhindert. Dies bedeutet, dass Anfragen langsamer erscheinen, da der Inhalt nicht mehr an den Client gesendet und angezeigt wird, sondern gezwungen wird, alle auf einmal zu senden. Output-Pufferung ist ein Hack für Situationen, in denen achtlos Daten echo Daten anstelle von Rückgabe oder ein Tool für bestimmte Anwendungen mit dem spezifischen Bedarf dafür. Ich würde mir auch vorstellen, dass Sie die Ausführungszeit beeinflussen würden, wenn Sie die Pufferung der Ausgabe verwenden (weil es Funktionsaufrufe erfordert), anstatt die Zeichenfolge in eine Variable zu HEREDOCIEREN oder eine Sicht einzuschließen.

Nun zur Beantwortung der Frage, ob es angemessen ist, würde ich sagen, dass in einer MVC-Anwendung alle HTML-und andere Inhalte in seiner eigenen Ansicht enthalten sein sollte. Dann kann ein Controller eine Ansicht aufrufen, um sich selbst anzuzeigen, und muss sich nicht darum kümmern, den Code zu kennen, der beim Anzeigen der Ansicht beteiligt ist. Sie können weiterhin Informationen (wie Titel, Autoren, Arrays von Tags usw.) an Ansichten weitergeben, aber das Ziel besteht darin, den Inhalt von der Logik zu trennen.

Das heißt, Wordpress Vorlagen und Code sieht ziemlich schlampig zu beginnen und lose, wenn überhaupt nicht implementiert MVC, wenn es zu viel Arbeit ist, um eine Ansicht dafür zu erstellen, würde ich sagen, die Schlamperei würde in WP Stil passen .

+0

Ok, was ist der Nachteil der Verwendung der Ausgangspufferung? – JackMahoney

+0

@JackMahoney Aktualisiert, um die Nachteile von OB zu veranschaulichen. –

+0

danke für den Rat. Ich stimme zu, Wordpress kann chaotisch werden. Ich muss es eine Zeichenfolge zurückgeben, also denke ich, dass Heredoc die beste Lösung sein könnte. Andere erwähnen die Trennung der Ansicht von der Steuerung, aber das würde die Verwendung von output_buffering erfordern, da ich eine Zeichenfolge zurückgeben muss. – JackMahoney

2

Ich denke, es ist eine gute Praxis ist nur PHP zu verwenden, für die Logik der Anwendung und übertragen Sie einige Daten zum Anzeigen der Ebene (Template-Engine). In Übereinstimmung damit gibt es einige Muster wie MVC.

4

Es ist keine gute Übung in Bezug auf die Tatsache, dass Sie Front-End-Entwickler verfremden, indem Sie das, was eigentlich "Ansichten" sind, in PHP-Klassen-Dateien platzieren. Dies war eines meiner größten Probleme, als ich anfing, PHP generell zu verwenden. Ich wollte Inhalte innerhalb von Klassen dynamisch erstellen. Es ist eine großartige Idee, aber Sie möchten es so machen, dass viele Mitglieder Ihres Teams so reibungslos wie möglich zusammenarbeiten können.].

Sie sollten wahrscheinlich haben den Inhalt in einer separaten Datei „Personal-Mitglied-single.php“ genannt, die Sie dann in Ihrer Funktion aufrufen

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

Sie normalerweise, dass in eine wiederverwendbare Methode Refactoring würde obwohl, so würde es ein wenig aussehen ..

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

aktualisiert die Frage, um die Anwendung zu zeigen, danke für Ihre Hilfe bisher – JackMahoney

+0

Ich bearbeitete meine Antwort zu zeigen tatsächlich die 'get_single()' -Funktion eine Zeichenfolge zurück. Die Rückgabeanweisung fehlte in meinem Code, sollte aber trotzdem zu Ihrem Beispiel passen, da die Ansichtsdatei bei Verwendung von require immer noch Zugriff auf alle Variablen der Klasse hat, als ob sie immer noch innerhalb der Klasse wäre. – Anther

+0

Danke, ich mag diese Lösung. Ich weiß es auch zu schätzen, dass Sie in einem Team arbeiten, da ich tagsüber ein Front-End-Entwickler bin – JackMahoney

Verwandte Themen