Données disponibles pour toutes les vues en codeigniter
j'ai une variable, contenant des données qui devraient être présentes dans tout le site. Au lieu de transmettre ces données à chaque affichage de chaque contrôleur, je me demandais si il existe un moyen de rendre ces données disponibles pour chaque vue dans le site.
Mp. Le stockage de ces données sous forme de cookie session / session ci n'est pas une option.
Merci beaucoup.
7 réponses
Créer un MY_Controller.php
Enregistrez et sauvegardez-le dans le dossier application/core. En elle, quelque chose comme:
class MY_Controller extends CI_Controller {
public $site_data;
function __construct() {
parent::__construct();
$this->site_data = array('key' => 'value');
}
}
tout au long de vos controllers, vues,$this->site_data
est maintenant disponible.
Notez que pour que cela fonctionne, tous vos autres controllers doivent étendre MY_Controller
au lieu de CI_Controller
.
vous devez étendre CI_Controller pour créer un contrôleur de Base:
http://ellislab.com/codeigniter/user-guide/general/core_classes.html
core / MY_Controller.php
<?php
class MY_Controller extend CI_Controller {
public function __construct() {
parent::__construct();
//get your data
$global_data = array('some_var'=>'some_data');
//Send the data into the current view
//http://ellislab.com/codeigniter/user-guide/libraries/loader.html
$this->load->vars($global_data);
}
}
contrôleurs/la bienvenue.php
class Welcome extend MY_Controller {
public function index() {
$this->load->view('welcome');
}
}
vues/la bienvenue.php
var_dump($some_var);
Note: pour obtenir ce vars dans vos fonctions ou controllers, vous pouvez utiliser $this->load->get_var('some_var')
Set application/config / autoload.php
$autoload['libraries'] = array('config_loader');
Créer application/libraries / Config_loader.php
defined('BASEPATH') OR exit('No direct script access allowed.');
class Config_loader
{
protected $CI;
public function __construct()
{
$this->CI =& get_instance(); //read manual: create libraries
$dataX = array(); // set here all your vars to views
$dataX['titlePage'] = 'my app title';
$dataX['urlAssets'] = base_url().'assets/';
$dataX['urlBootstrap'] = $dataX['urlAssets'].'bootstrap-3.3.5-dist/';
$this->CI->load->vars($dataX);
}
}
de votre vues
<title><?php echo $titlePage; ?></title>
<!-- Bootstrap core CSS -->
<link href="<?php echo $urlBootstrap; ?>css/bootstrap.min.css" rel="stylesheet">
<!-- Bootstrap theme -->
<link href="<?php echo $urlBootstrap; ?>css/bootstrap-theme.min.css" rel="stylesheet">
Si ce n'est pas une Variable(d'une valeur de changer) alors je suggère de créer une constante dans la constante.fichier php sous le répertoire de configuration dans le répertoire apps, si c'est une variable, continuez à changer, alors je suggérerais de créer un contrôleur personnalisé dans le dossier core (s'il n'existe pas, allez de l'avant un dossier create "core") sous le dossier apps. Besoin de faire quelques changements dans un autre contrôleur comme mentionné ici : étendez votre nouveau contrôleur avec la classe" CI_Controller". Exemple
ouvrir-php-tag if ( ! défini ('BASEPATH')) exit ('pas d'accès direct au script autorisé'); classe LD_Controller extends CI_Controller { } proche-php-balise
Ici LD_ est mon mot-clé personnalisé, si vous voulez changer, vous pouvez le changer dans config.fichier php sous la ligne# 112 comme indiqué ici: $config ['subclass_prefix'] = 'LD_'; et étendez cette classe dans tous vos controllers comme "class Mynewclass extends LD_Controller.. Et dans LD_controller vous devez écrire la méthode dans laquelle vous voulez définir la variable / tableau de valeurs & appeler ce tableau dans toute l'application comme montré ici : la définition de la variable : var $data = array(); Méthode pour obtenir des valeurs de db à travers la classe Model:
function getbooks()
{
$books = $this->mybooks_model->getbooks(); //array of records
$this->data = array('books'=>$books);
}
pour appeler cette variable dans la vue : print_r($this->data['livres']);); vous obtiendrez toutes les valeurs de tableau... ici nous devons nous assurer qu'au moins un paramètre "$data" doit être passé sinon aucun problème vous pouvez définir ce $data param dans la vue comme montré ici : $this - > load - >view ('mybookstore',$data);
ensuite, il fonctionne tout à fait bien,,, d'amour à partager... amusez-vous un travail les amis
utilisez les sessions dans vos controllers
$this->session->set_userdata('data');
puis de les afficher dans votre vue.
$this->session->userdata('data');
ou inclure une page dans le fichier de vue de base E. g index.php
include "page.php";
puis à la page.php,
ajouter $this->session->userdata('data');
pour tout élément ou div
ensuite, ce sera diffusée sur tous vos points de vue
vous pouvez utiliser $this->load->vars('varname', $data);[ ou de charger des données à 1ère vue seulement] onse et de l'utiliser en tout chargé vues après ce
j'ai lu toutes les réponses, mais imho la meilleure approche est via hook:
Créer un crochet, de recevoir de nouveaux messages, par exemple:
class NewMessages { public function contact() { // Get CI instance CI_Base::get_instance(); $CI = &get_instance(); // <-- this is contoller in the matter of fact $CI->load->database(); // Is there new messages? $CI->db->where(array('new' => 1)); $r = $CI->db->count_all_results('utf_contact_requests'); $CI->load->vars(array('new_message' => $r)); } }
fixez-le à un certain point du flux, par exemple sur 'post_controller_constructor'. De cette façon, il sera chargé à chaque instanciation de votre controller.
$hook['post_controller_constructor'][] = array( 'class' => 'NewMessages', 'function' => 'contact', 'filename' => 'NewMessages.php', 'filepath' => 'hooks', 'params' => array(), );
Maintenant, nous pouvons accéder à notre variable $new_message dans chaque vue ou modèle.
Aussi simple que ça :)