2009-06-22 52 views
27

Sono abbastanza nuovo in MVC e ho trovato CodeIgniter di recente. Sto ancora imparando ogni giorno, ma un problema è il suo motore di template. Qual è il modo migliore per creare modelli in CodeIgniter?Come gestire i modelli di Code-Code?

CakePHP viene fornito con una propria libreria di modelli, è disponibile una funzione simile in CodeIgniter?

+0

Ciao @ Martin, vedo questo è un post piuttosto vecchio e hai ancora non ha segnato alcuna risposta come corretta. Hai trovato una soluzione al tuo problema? –

risposta

0

template Un Codeigniter è generalmente solo un file PHP. Puoi usare tutta la solita sintassi PHP per generare variabili, fare loop e chiamare un altro codice PHP.

regolatore Esempio: vista

<?php 
class Blog extends Controller { 

    function index() 
    { 
     $data['title'] = "My Real Title"; 
     $data['heading'] = "My Real Heading"; 

     $this->load->view('blogview', $data); 
    } 
} 
?> 

Esempio:

<html> 
<head> 
<title><?php echo $title;?></title> 
</head> 
<body> 
    <h1><?php echo $heading;?></h1> 
</body> 
</html> 

Leggi tutto nella documentazione qui: CodeIgniter User Guide: Views

+0

Beh, sì.Ma vorrei sapere se c'è comunque modo di accelerare questo processo e renderlo più organizzato - quindi non dovrò digitare

, , stile ecc ... Voglio averlo in una sola cartella o libreria. Consideralo come wordpress, puoi cambiare modello senza modificare ogni singola vista. – Martin

25

A differenza di altri framework CodeIgniter non ha un modello di sistema globale. Ogni controller controlla la propria uscita indipendente dal sistema e le viste sono FIFO se non diversamente specificato.

Per esempio se abbiamo un colpo di testa globale:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > 
<html> 
    <head> 
     <title><?=$title?></title> 
     <!-- Javascript --> 
     <?=$javascript ?> 
     <!-- Stylesheets --> 
     <?=$css ?> 
    </head> 
    <body> 
     <div id="header"> 
      <!-- Logos, menus, etc... --> 
     </div> 
     <div id="content"> 

e un piè di pagina globale:

 </div> 
     <div id="footer"> 
      <!-- Copyright, sitemap, links, etc... --> 
     </div> 
    </body> 
</html> 

quindi nostro controller avrebbe dovuto assomigliare

<?php 
class Welcome extends Controller { 

    function index() { 
     $data['title'] = 'My title'; 
     // Javascript, CSS, etc... 

     $this->load->view('header', $data); 

     $data = array(); 
     // Content view data 
     $this->load->view('my_content_view', $data); 

     $data = array(); 
     // Copyright, sitemap, links, etc... 
     $this->load->view('footer', $data); 
    } 
} 

Ci sono altri combinazioni, ma esistono migliori soluzioni attraverso librerie utente come:

Vedi commenti qui sotto

+0

Sono arrivato da google, i link sopra non funzionano più e reindirizziamo al repository github per CodeIgniter, ma puoi andare alle pagine wiki e cercare "template" per trovare una dozzina di implementazioni diverse per questo problema. – sg3s

+0

Esistono anche numerose librerie di modelli che ho utilizzato che non fanno parte di CodeIgniter, ma possono essere facilmente integrate, Moustache (https://github.com/bobthecow/mustache.php) e Twig (http: // twig.sensiolabs.org/) –

+0

Perché questa risposta ha così tanti voti? –

4

Io uso CodeIgniter con Smarty ed è bello (se vi piace Smarty, lo faccio).

Diciamo che dispone di un controller articolo, si potrebbe fare somehting come questo in esso:

class Article extends Controller { 
    function show_all() { 
    $articles = $this->article_model->get_all(); 
    $this->smarty->assign('entities', $articles); 
    $this->smarty->view('list'); 
    } 
} 

E poi nel modello:

{include file="header.tpl"} 
    <ul> 
    {foreach from=$entities item=entity} 
    <li>{$entity.title}</li> 
    {/foreach} 
    </ul> 
{include file="footer.tpl"} 

La parte bella di questo è che il controllore doesn Ho davvero bisogno di sapere su intestazioni e piè di pagina. Sa solo che un gruppo di articoli dovrebbe essere mostrato come una lista. Da lì, sono solo i modelli che sono responsabili della definizione di come viene visualizzato un elenco di cose, in questo caso, in un punto tra un'intestazione e un piè di pagina.

Un'altra cosa interessante che si può fare è utilizzare questo modello di elenco di cose che non sono articoli. Potresti avere un elenco di utenti o pagine o qualsiasi altra cosa. In alcuni casi può essere utile riutilizzare un modello come questo. Non sempre, ma a volte.

Impostazione CodeIgniter per Smarty è abbastanza semplice. Si tratta di copiare i file Smarty nella cartella della libreria e creare un semplice wrapper per questo.È possibile trovare le istruzioni qui:

http://devcha.blogspot.com/2007/12/smarty-as-template-engine-in-code.html

volta che si ottiene è impostato è grande.

1

Sono sbilanciato verso questa libreria di modelli creata da Carmelo Capinpin perché è così facile da usare: link text. Basta copiare il file nel tuo archivio e sei pronto per partire. Le istruzioni su come usarlo sono nel link che ho fornito.

5

Questa libreria, facile da usare e personalizzare, fa esattamente quello che ci si aspetta:

  • evitare la duplicazione HTML (intestazione, piè di pagina ..)
  • non c'è bisogno di imparare una nuova lingua (!)

Most Simple Template Library for CodeIgniter

+1

La cosa che mi piace di più di questo è che piuttosto che passare a una sintassi diversa per qualcosa come Smarty, mantiene quello che mi piace di più dei modelli base di CI: tag short PHP. – russellmania

12

Fai una libreria che comprende tutte le vostre opinioni e inviarlo dati che è necessario inviare alla visualizzazione dei contenuti. Questo è tutto!

14

Ho provato diversi modi per realizzare i modelli di code-code e il modo in cui sto rimanendo è il più veloce e semplice, è il seguente.

In controllore:

//Charge the view inside array 
    $data['body'] = $this->load->view('pages/contact', '', true); 


    //charge the view "contact" in the other view template 
    $this->load->view('template', $data); 

Tenuto template.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"> 
<head> 
    <title>Template codeigniter</title> 
</head> 
<body> 
    <div> 
     <?=$body?> 
    </div> 
    <div class="clear"></div> 
    <div>Footer</div> 
    </div> 
</body> 
</html> 

$body è il contatto vista.

+0

Quando utilizzo questo metodo, ottengo molte variabili non definite - non sembrano essere passati dal controller alla variabile $ body. – russellmania

1

There is a library which allows you to use templates in CodeIgniter in uno stile nativo. Per caricare un modello/a tema basta fare:

$this->load->theme(‘theme_name’); 

Per caricare CSS e JavaScript file dal vostro punto di vista si può fare:

$this->load->css(‘path/file.css’); 
$this->load->js(‘path/file.js’); 

È possibile controllare opzionalmente il modo browsers di cache CSS & file JS.

2

Ho due modelli primari; uno per il sito e uno per il nostro pannello di amministrazione. Ecco il mio setup per il nostro sito principale (principalmente statico) ... Ho deciso su un controller chiamato site Chiama il file modello e ogni pagina e ottiene il suo file di visualizzazione.

Perché nessuno menziona l'utilizzo del motore di template? Le visualizzazioni -just- sono migliori/più veloci?

  • In config/template.php Ho definito il modello (i).Nota * site_template * si trova nella cartella views:

    $template['site']['template'] = 'site_template'; 
    $template['site']['regions'] = array('title','section','col2','content',); 
    $template['site']['parser'] = 'parser'; 
    $template['site']['parser_method'] = 'parse'; 
    $template['site']['parse_template'] = FALSE; 
    
  • In config/routers.php ho impostare regole per gestire le richieste per il controller site che sono singoli segmenti di URL per lo più, ma noi hanno uno sezione che è strutturato come tale; /chi-siamo e poi per le persone selezionate /chi-siamo/robert-Wayne e così:

    $route['what-we-do'] = 'site/what_we_do'; 
    $route['who-we-are'] = 'site/who_we_are'; 
    $route['who-we-are/(:any)'] = "site/who_we_are/$1" 
    
  • E controllers/site.php Anche in questo caso con una funzione per ogni pagina/sezione:

    class Site extends CI_Controller 
    { 
    function __construct() { 
        parent::__construct(); 
        $this->template->set_template('site'); // ask for the site template 
        $this->load->library('mobile'); 
    } 
    public function index() 
    { 
    $data = array('section' => 'home'); 
    $this->template->write_view('col2', 'site/menu.php', $data); 
    $this->template->write('title', "COOL PAGE TITLE", TRUE); 
    $this->template->write('section', $data['section'], TRUE); 
    $this->template->write_view('content', 'site/welcome', $data); 
    $this->template->render(); 
    } 
    public function who_we_are() 
    { 
    // this bit readies the second segment. 
    $slug = str_replace('-', '_', $this->uri->segment(2, 0)); 
    if($slug) // IF there is a second segment we load the person. 
    { 
    $data['bio'] = $this->load->view('site/people/'.$slug, '', true) 
    } else { 
    // where it loads the general view who_we_are 
    } 
    // and so on for each page... 
    

e come bene preavviso punto il router permette di lasciare fuori `/ site /' nella URL, http: // il site.com/who-we- sono

pensieri? chiunque? Bueller?

+0

Sono sorpreso che questo non sia stato svalutato di più. –

0

Consentitemi di proporre un modo più semplice per farlo. Si consideri my answer to a similar question.

Pro:

  1. vostro file di modello può essere un file HTML completo. Non devi spezzare l'intestazione e il piè di pagina.
  2. Qualsiasi file di visualizzazione può essere trasformato in un modello con il minimo sforzo.
  3. I dati per la vista specifica possono essere generati nel modello.

Contro: 1. Potrebbe essere necessario aggiungere un template (o layout -se si vuole farlo nel modo Rails) directory sotto di vista al fine di strutturare il codice in modo corretto. Questo deriva da Pro [2]. 2. I dati per la vista specifica dal controller devono prima essere passati al modello.

Problemi correlati