web-dev-qa-db-fra.com

CodeIgniter: variables globales dans un contrôleur

Je suis un très débutant sur CodeIgniter, et pendant que je continue, je rencontre des problèmes qui, dans le codage procédural, étaient faciles à résoudre

Le problème actuel est: j'ai ce contrôleur

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

Comme vous pouvez le constater, certains éléments du tableau se répètent encore et encore:

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

N'y a-t-il pas moyen de les rendre "globaux" dans le contrôleur, de sorte que je n'ai pas à les taper pour chaque fonction? Quelque chose comme (mais cela me donne une erreur):

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

}

Merci d'avance!

20
Ivan

Ce que vous pouvez faire, c'est créer des "variables de classe" accessibles depuis n'importe quelle méthode du contrôleur. Dans le constructeur, vous définissez ces valeurs.

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

}
31
Rocket Hazmat

Vous pouvez configurer une propriété de classe nommée data, puis définir ses valeurs par défaut dans le constructeur, qui est la première chose exécutée lors de la création d'une nouvelle instance sur Basic . Vous pouvez ensuite y faire référence avec le mot clé $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);
   }
}
16
Dalen

hé merci voici mon snipet c'est une variable globale tenant une vue

/* 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');
    }
}
3
Artur

Même si ça fait si longtemps. Cela peut être utile aux autres que vous pouvez utiliser $ this-> load-> vars ($ data); dans MY_controller principal pour rendre le tableau $ data disponible dans toutes les vues.

/* 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');
}
 }
1
user254153

Pourquoi ne pas utiliser un assistant?

Fichier:

/application/helpers/meta_helper.php

Contenu: 

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

Dans votre contrôleur:

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

Et dans votre modèle de vue:

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

Est-ce que la sortie:

<title>My Specific Page Title</title>

J'espère que cela a du sens :-)!

0
webmaster_sean