2012-05-14 19 views
18

Sono un newbie su CodeIgniter, e mentre vado in poi incorrere in problemi che, nella codifica procedurali, erano facili da risolvereCodeIgniter: variabili globali in un controller

Il problema attuale è: ho questo controller

class Basic extends Controller { 

    function index(){ 
     $data['title'] = 'Page Title'; 
     $data['robots'] = 'noindex,nofollow'; 
     $data['css'] = $this->config->item('css'); 
     $data['my_data'] = 'Some chunk of text'; 
     $this->load->view('basic_view', $data); 
    } 

    function form(){ 
     $data['title'] = 'Page Title'; 
     $data['robots'] = 'noindex,nofollow'; 
     $data['css'] = $this->config->item('css'); 
     $data['my_other_data'] = 'Another chunk of text'; 
     $this->load->view('form_view', $data); 
    } 
} 

Come si può vedere, alcuni elementi di matrice ripetere più e più volte:

$data['title'] = 'Page Title'; 
$data['robots'] = 'noindex,nofollow'; 
$data['css'] = $this->config->item('css'); 

non c'è un modo per farli "globale" nel controller, in modo che non ho digitarli per eac funzione h? Qualcosa di simile (ma questo mi dà errore):

class Basic extends Controller { 

    // "global" items in the $data array 
    $data['title'] = 'Page Title'; 
    $data['robots'] = 'noindex,nofollow'; 
    $data['css'] = $this->config->item('css'); 

    function index(){ 
     $data['my_data'] = 'Some chunk of text'; 
     $this->load->view('basic_view', $data); 
    } 

    function form(){ 
     $data['my_other_data'] = 'Another chunk of text'; 
     $this->load->view('form_view', $data); 
    } 

} 

Thnaks in anticipo!

risposta

28

Che cosa si può fare è fare "variabili di classe", che si può accedere da qualsiasi metodo nel controller. Nel costruttore, imposti questi valori.

class Basic extends Controller { 
    // "global" items 
    var $data; 

    function __construct(){ 
     parent::__construct(); // needed when adding a constructor to a controller 
     $this->data = array(
      'title' => 'Page Title', 
      'robots' => 'noindex,nofollow', 
      'css' => $this->config->item('css') 
     ); 
     // $this->data can be accessed from anywhere in the controller. 
    }  

    function index(){ 
     $data = $this->data; 
     $data['my_data'] = 'Some chunk of text'; 
     $this->load->view('basic_view', $data); 
    } 

    function form(){ 
     $data = $this->data; 
     $data['my_other_data'] = 'Another chunk of text'; 
     $this->load->view('form_view', $data); 
    } 

} 
+1

@Dalen: Grazie per aver corretto quel refuso :-) –

+0

prego! – Dalen

+0

Thanksguys! Dimenticavo nel frattempo la domanda perché ho trovato che "$ this-> load-> vars ($ array)" si adatta davvero bene ai miei esempi ... comunque la soluzione fornita è ancora più bella se devo passare la matrice tra metodi di classe – Ivan

15

È possibile impostare una proprietà di classe denominata data e impostarne i valori predefiniti nel contructor, che è la prima cosa che viene eseguita quando viene creata una nuova istanza su Basic. Poi si può fare riferimento ad esso con la parola chiave $this

class Basic extends Controller 
{ 
    var $data = array(); 

    public function __construct() 
    { 
     parent::__construct(); 
     // load config file if not autoloaded 
     $this->data['title'] = 'Page Title'; 
     $this->data['robots'] = 'noindex,nofollow'; 
     $this->data['css'] = $this->config->item('css'); 
    } 

    function index() 
    { 
     $this->data['my_data'] = 'Some chunk of text'; 
     $this->load->view('basic_view', $this->data); 
    } 

    function form() 
    { 
     $this->data['my_data'] = 'Another chunk of text'; 
     $this->load->view('form_view', $this->data); 
    } 
} 
+1

È necessario aggiungere 'parent :: __ construct();' al costruttore affinché funzioni. –

+2

Giusto, e probabilmente anche caricare il file di configurazione se non già caricato automaticamente – Dalen

+0

sì! la costruzione risolverà il problema. – rechie

3

hey grazie Ecco il mio snipet è una variabile globale in possesso di un vista

/* Location: ./application/core/MY_Controller */ 

class MY_Controller extends CI_Controller { 

    function __construct() 
    { 
     parent::__construct(); 
     $this->data = array(
      'sidebar' => $this->load->view('sidebar', '' , TRUE), 
     ); 
    } 

} 

/* Location: ./application/controllers/start.php */ 
class Start extends MY_Controller { 

    function __construct() 
    {  
     parent::__construct(); 
    } 

    public function index() 
    { 
     $data = $this->data; 

     $this->load->view('header'); 
     $this->load->view('start', $data); 
     $this->load->view('footer'); 
    } 
} 
+0

Grazie per aver lavorato per me –

0

Perché non all'utente un aiutante?

File:

/application/helpers/meta_helper.php 

Content:

<?php 
function meta_data() { 
return array("title" => null, "robots" => "noindex, nofollow"); 
} 

nel controller:

class Basic extends Controller { 

    function __construct(){ 
     parent::__construct(); 
     $this->load->helper('meta'); 
    }  

    function index(){ 
     $data['meta'] = meta_data(); //associate the array on it's own key; 

     //if you want to assign specific value 
     $data['meta']['title'] = 'My Specific Page Title'; 

     //all other values will be assigned from the helper automatically 

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

E nel tuo modello di vista:

<title><?php $meta['title']; ?></title> 

uscita sarà:

<title>My Specific Page Title</title> 

Speranza che ha senso :-)!

0

Anche se è stato così lungo. Può essere utile ad altri puoi usare $ this-> load-> vars ($ data); nel core MY_controller per rendere disponibile l'array $ di dati in tutte le visualizzazioni.

/* Location: ./application/core/MY_Controller */ 

class MY_Controller extends CI_Controller { 

function __construct() 
{ 
    parent::__construct(); 
    $data['title'] = 'Page Title'; 
    $data['robots'] = 'noindex,nofollow'; 
    $data['css'] = $this->config->item('css'); 
    $this->load->vars($data); 
} 

} 

/* Location: ./application/controllers/start.php */ 
class Start extends MY_Controller { 

function __construct() 
{  
    parent::__construct(); 
} 

public function index() 
{ 
    $data['myvar'] = "mystring"; 

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