2009-04-19 8 views
5

In CodeIgniter o core PHP; c'è un equivalente delle viste e dei modelli di Rails?CodeIgniter o PHP Equivalent of Rails Partials and Templates

Un partial mi consente di rendere un altro frammento di vista all'interno della mia vista. Potrei avere una vista comune navbar.php che potrei indicare all'interno della mia vista homepage.php. I modelli definiscono la shell generale di una pagina HTML in un unico punto e lascia che ogni vista riempia il corpo.

La cosa più vicina che ho trovato nella documentazione di CodeIgniter era Loading multiple views, dove più visualizzazioni sono visualizzate in sequenza sul controller. Sembra strano dettare l'aspetto visivo della mia pagina all'interno del controller. (per spostare la barra di navigazione il mio designer dovrebbe modificare il controller).

Ho cercato su stack overflow per un modo PHP per realizzare questo. Ho trovato this page, che parla della simulazione dei parziali con ob_start. È l'approccio consigliato all'interno di CodeIgniter?

+0

prova oculari: http://codeigniter.com/wiki/Ocular_Layout_Library/ – Geshan

risposta

13

Potrei aver infranto qualche regola MVC, ma ho sempre posizionato i miei "frammenti" in singole viste e caricato, stile CodeIgniter, dalle altre viste che ne hanno bisogno. Praticamente tutti i miei punti di vista caricare un'intestazione e piè di vista in alto e in basso, rispettivamente:

<? $this->load->view("header"); ?> 
//Page content... 
<? $this->load->view("footer"); ?> 

L'intestazione allora potrebbe includere un NavBar allo stesso modo, ecc

+1

Questo è il modo di andare per i parziali che non richiedono i propri dati. Ma nel caso di viste parziali che richiedono dati ("widget"), qualcosa come la terza parte "Modular Extensions HMVC" è una buona scelta. – rick

+0

Penso che questo sia il metodo più semplice di rendering parziali. Assicurati di mettere la funzione '$ this-> load-> view()' nel ** file di visualizzazione ** piuttosto che nel controller (tramite la chiave dell'array '$ data') perché verrà semplicemente echeggiata. – hohner

0

Questo purtroppo non è specifico di CodeIgniter, tuttavia ti suggerisco di dare un'occhiata al modello di modello Savant3. Ti permette di rendere il modello su una stringa. Quindi puoi semplicemente bloccarlo ovunque desideri.

Forse c'è qualcosa del genere in CodeIgniter?

Mi viene in mente un modo per aggiungere una funzione durante il rendering della vista, il rendering del modello e quindi tutto il modello secondario in esso contenuto.

3

In PHP usereste include

+0

Non so se questo è esattamente ciò che il PO sta chiedendo. Credo che esegua il file incluso nel punto di valutazione; l'OP sta chiedendo un inclusivo stile Rails (il file incluso viene valutato per primo, IIRC, quindi composto più tardi). Questo fa una grande differenza quando si fanno cose come decidere il modello di pagina in base a ciò che accade nella pagina/partial/view-content. Estratto –

0

CodeIgniter e Smarty giocano bene insieme.

5

Questo è in sostanza quello che uso: si

function render_partial($file, $data = false, $locals = array()) { 
    $contents = ''; 

    foreach($locals AS $key => $value) { 
     ${$key} = $value; 
    } 

    ${$name . '_counter'} = 0; 
    foreach($data AS $object) { 
     ${$name} = $object; 

     ob_start(); 
     include $file; 
     $contents .= ob_get_contents(); 
     ob_end_clean(); 

     ${$name . '_counter'}++; 
    } 

    return $contents; 
} 

questo permette di chiamare qualcosa come:

render_partial('/path/to/person.phtml', array('dennis', 'dee', 'mac', 'charlie'), array('say_hello' => true)); 

e in /path/to/person.phtml hanno:

<?= if($say_hello) { "Hello, " } ?><?= $person ?> (<?= $person_counter ?>) 

questo è un po 'di magia in corso anche se ciò può aiutarti a ottenere un quadro migliore di ciò che sta succedendo. file completo: view.class.php

+4

($ locali); – Mario

+0

jeej i tkRenderPartial() molto me stesso;) +1 – Ropstah

2

mi sono trovato a spostarsi da Rails to CI anche, e quello che ho fatto con i partial è fondamentalmente rendere i partial nella vista come una variabile e impostarlo dal controller.

Quindi nella vista avresti qualcosa di simile (_partial.php):

<h2>Here Comes The Partials</h2> 
<?= $some_partials ?> 

Ed è possibile impostare dal controller simile:

$this->load->view('the_view', 
    array('some_partials', 
     $this->load->view('_partial', array(), TRUE) 
    ) 
); 

Personalmente, preferisco utilizzare la vista di CI, invece di ob_start, ma che mi è =) PS: viste Quando si caricano , il primo argomento è il nome della vista, il secondo è i parametri da passare alla vista e il terzo è il flag "ECHO", che in pratica indica a CI se renderlo direttamente o restituire invece il valore della vista, che è in pratica quello che ho fatto nell'esempio.

Non penso che sia una buona soluzione, ma funziona per me. Qualcuno ha soluzioni migliori?

+0

Non credo che saresti in grado di usare 'ob_start()' nel controller perché 'CI_Loader' lo usa durante il caricamento delle viste. Quindi avresti un errore. È meglio usare il metodo $ this-> load-> ('view_name', $ data, true); 'metodo per restituire la vista renderizzata come una stringa. – sholsinger

2

Il mio recente rilascio Template library funziona in questo modo.

Questa libreria di modelli funziona anche bene con il mio Dwoo implementation che darà molto più potere ai tuoi punti di vista.

0

è possibile controllare, per partial e modello

http://code.google.com/p/ocular/wiki/Introduction