2012-07-29 14 views
7

è qualcosa che non va con html all'interno di una funzione di classe? Lo chiamo nel DOM quindi non ho bisogno di una stringa restituita.È brutto usare html all'interno di una classe php?

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

Anche quando ho bisogno della stringa, utilizzo questo metodo? C'è un modo migliore o è relativamente 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

avrei spiegato il motivo per cui sto facendo questo. Sto facendo un plugin per Wordpress e voglio controllare un output di tipi di post. Quindi io sto usando un filtro come qui di seguito

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

Quindi, come potete vedere, ho devo restituire una stringa al nucleo wordpress

+0

PHP ha bisogno di lavorare di più, tenendolo fuori della classe rende HTML più rapidamente .. –

+0

guardare in [ZF] (http: // quadro. zend.com/) se vuoi imparare come separare visualizzazioni, modelli e controller. – Sam152

+0

Sfortunatamente questo è un plugin per Wordpress, io uso Zend al lavoro comunque – JackMahoney

risposta

4

Si deve usare HEREDOC invece di buffer di output se si desidera memorizzare una lunga stringa in una variabile. Ecco come si presenta:

$content = <<<EOD 
content here 
EOD; 

EOD può essere qualsiasi cosa, ma notare due cose importanti:

  1. non può avere alcun spazio bianco di fronte ad essa e deve essere su di essa la propria linea
  2. non dovrebbe essere una stringa che potrebbe essere trovato all'interno del tuo contenuto

Se si utilizza PHP> = 5.3, quindi si dovrebbe utilizzare NOWDOC, che non analizza per la variabile all'interno del do c (a meno che non ne abbiate bisogno). L'unico diverso con la sintassi di NOWDOC è che la sentinella è racchiuso tra virgolette:

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

Il motivo per cui mi piacerebbe devia dal buffer di uscita è che impedisce al server di suddivisione in blocchi i dati inviati al cliente. Ciò significa che le richieste sembreranno più lento perché invece del contenuto progressivamente inviato al client e visualizzato, è costretto a inviare tutto in una volta. buffer di uscita è un hack per situazioni in cui le funzioni noncuranza echo dati invece di restituirla o di uno strumento per certe applicazioni con l'esigenza specifica di esso. Vorrei anche immaginare che ci si prende un colpo sul tempo di esecuzione se è stato utilizzato il buffer di uscita (perché si tratta di chiamate di funzione) rispetto HEREDOCing la stringa in una variabile o tra cui una vista.

Ora per rispondere alla domanda se sia opportuno, direi che in un'applicazione MVC tutti HTML e altri contenuti devono essere contenuti all'interno del proprio punto di vista. Quindi un controller può chiamare una vista per mostrarsi e non deve preoccuparsi di conoscere il codice coinvolto nella visualizzazione della vista. Puoi ancora passare informazioni (come titoli, autori, matrici di tag, ecc.) Alle viste, ma l'obiettivo qui è separare il contenuto dalla logica.

Detto questo, i modelli e codice di Wordpress sembra piuttosto sciatta per cominciare e vagamente, se non a tutti implementa MVC quindi se è troppo lavoro per creare una vista per questo, direi che la sciatteria sarebbe in sintonia con lo stile di WP .

+0

Ok, qual è lo svantaggio nell'usare il buffering dell'output? – JackMahoney

+0

@JackMahoney Aggiornato per illustrare lo svantaggio dell'OB. –

+0

grazie per il consiglio. Sono d'accordo che Wordpress può diventare disordinato. Devo restituirgli una stringa, quindi credo che heredoc potrebbe essere la soluzione migliore. Altri hanno menzionato la separazione della vista dal controller ma ciò richiederebbe l'utilizzo di output_buffering dato che devo restituire una stringa – JackMahoney

2

penso che sia buona norma utilizzare PHP solo per la logica di applicazione e trasmettere alcuni dati per visualizzare il livello (motore di template). In conformità con questo ci sono alcuni modelli come MVC.

4

Non è una buona pratica per il fatto che si alienano gli sviluppatori front-end posizionando quelli che sono effettivamente "Visualizzazioni" all'interno dei file di classe PHP. Questo è stato uno dei miei maggiori problemi quando ho iniziato a utilizzare PHP in generale, è che volevo creare dinamicamente il contenuto all'interno delle classi. È una grande idea, ma tu vuoi farlo in un modo che permetta a molti membri del tuo team di lavorare insieme nel modo più fluido possibile;].

Probabilmente si dovrebbe avere il contenuto all'interno di un file separato chiamato "personale-membro-single.php", che poi chiama nella funzione

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

È saremmo rifattorizziamo che in un metodo riutilizzabile tipicamente però, in modo che sarebbe sembrare un po 'come ..

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

ha aggiornato la domanda per mostrare l'applicazione, grazie per il tuo aiuto fino ad ora – JackMahoney

+0

Ho modificato la mia risposta per mostrare effettivamente la funzione 'get_single()' che restituisce una stringa. L'istruzione return non era presente nel mio codice, ma dovrebbe comunque corrispondere al tuo esempio, poiché quando usi require, il file di visualizzazione avrà comunque accesso a tutte le variabili della classe come se fosse ancora all'interno della classe. – Anther

+0

Grazie, mi piace questa soluzione. Apprezzo anche il tuo punto di lavoro in una squadra, dato che sono uno sviluppatore front-end di giorno – JackMahoney

Problemi correlati