Meilleure méthode pour inclure des vues dans les vues dans CodeIgniter

Je démarre un grand projet codeigniter et je voudrais essayer de créer des vues 'mini' réutilisables pour des extraits de contenu comme des boucles de données qui peuvent être affichées sur différentes pages/contrôleurs.

Est-il préférable d'appeler les vues depuis la vue du contrôleur principal? Si oui, comment? Ou devrais-je appeler la "mini vue" du contrôleur et passer ainsi le code de la vue à la vue principale?

51
demandé sur tereško 2013-03-05 14:23:55

5 réponses

Les vues des autres vues sont appelées vues imbriquées . Il y a deux façons d'inclure des vues imbriquées dans CodeIgniter:

1. Charger une vue imbriquée dans le contrôleur

Chargez la vue à l'avance et passez à l'autre vue. Mettez d'abord ceci dans le contrôleur:

<?php
// the "TRUE" argument tells it to return the content, rather than display it immediately
$data['menu'] = $this->load->view('menu', NULL, TRUE);
$this->load->view ('home', $data);
?>

Ensuite, mettez <?=$menu?> dans votre vue à l'endroit où vous voulez que le menu apparaisse.

2. Charger une vue "depuis l'intérieur" d'une vue

Mettez D'abord ceci dans le contrôleur:

<?php
  $this->load->view('home');
?>

Ensuite, mettez ceci dans la vue /application/views/home.php:

<?php $this->view('menu'); ?>

<p>Other home content...</p>

A propos de la meilleure méthode, je préfère la 1ère méthode à la 2ème, car en utilisant la 1ère méthode, je n'ai pas à mélanger le code, ce n'est pas comme include php. Bien qu'indirectement les deux soient les mêmes, la 1ère méthode est plus claire et plus propre que la 2ème!

89
répondu sandip 2016-04-12 17:38:44

Honnêtement, je préfère le faire en ayant des vues de modèle puis en les chargeant avec les données nécessaires du contrôleur, cela signifie beaucoup moins de code répété et suit le concept sec mieux que de charger des vues à partir de vues. Surtout pour des choses comme les en-têtes, les pieds de page et les menus.

Donc, ma vue de modèle ressemblerait à ceci:

Modèle.php

$this->load->view('header',$title);
$this->load->view('sidebar',$sidebar_content);
$this->load->view('main_content',$main_content);
$this->load->view('footer');

Ensuite, dans mon contrôleur, je passe les données requises au modèle comme ceci:

$data['title'] = 'Home Page';
$data['sidebar_content']='pages/standard_sidebar';
$data['main_content'] ='pages/my_home_page'; 
$this->load->view('template',$data);

Il y a un certain nombre de les avantages à le faire de cette façon. La première est que je peux avoir plusieurs modèles, par exemple, j'ai, dans mon cas, deux principaux, un pour les vues de page complète sans barre latérale et un pour les pages avec une barre latérale, j'appelle aussi une instruction if pour décider quel en-tête inclure, le normal ou celui avec le menu admin.

Oui, je pourrais inclure l'en-tête, la barre latérale et le pied de page dans chaque page de vue principale, mais cela finit par une tonne de code en double. Et que se passe t il si par exemple je veux que toutes mes pages quelque chose de nouveau, un autre petit extrait? En utilisant des modèles, j'ajoute l'extrait au modèle approprié et c'est fait. En allant dans l'autre voie, je trouve chaque page et ajoute la vue d'extrait là-bas, c'est l'équivalent d'avoir CSS dans la page à mon avis, inutile et finalement non maintenable.

15
répondu Rick Calder 2013-03-05 12:17:09

MÉTHODE 1

J'utilise cette méthode dans ma vue pour insérer la vue include où je veux

$this->load->view('include/include_view');


MÉTHODE 2

Ou dans le contrôleur, vous pouvez charger kore de vue comme ceci:

$this->load->view('header_view');
$this->load->view('list_view');
$this->load->view('footer_view');

N'est pas une meilleure méthode, dépend si vous devez passer des données (dans son cas, utilisez la méthode2) ou si vous voulez inclure une vue dans une partie spécifique de votre vue principale (dans ce cas, il est préférable d'utiliser la méthode 1)


MÉTHODE 3

Transmettre des données à votre vue d'inclusion par votre vue principale

Dans votre contrôleur:

$data['title'] = "Title";
$this->load->view('main_view',$data);

À votre avis

$data2['title'] = $title;
$this->load->view('include/include_view',$data2);

Si vous voulez transmettre des données entières à votre vue d'inclusion, vous pouvez le faire dans ce mode: dans votre contrôleur:

$data['nestedView']['title'] = 'title';

À votre avis

$this->load->view('includes/included_view', $nestedView);
5
répondu Alessandro Minoccheri 2013-03-05 11:04:27

C'est un moyen simple d'inclure des vues dans les vues.il n'est pas nécessaire de charger les vues à l'avance.il suffit de passer le chemin de vue à une autre vue.

Dans votre contrôleur, utilisez ceci:

$data['middle'] = 'includeFolder/include_template_view';  //the view you want to include
$this->load->view('main_template_view',$data);  //load your main view

Et dans main_template_view vous pouvez inclure d'autres vues:

$this->load->view($middle);
4
répondu Rahul Chipad 2013-03-05 11:37:38

À mon avis pour résoudre de manière plus efficace ce problème, je l'ai fait:

Vous créez un nouveau helper (dans application/helpers) avec name (es. common_helpers.php, le trait de soulignement est important). Dans ce fichier, vous mettez toutes les fonctions par exemple construire des morceaux de html en commun.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    function getHead(){
    require_once(APPPATH."views/common/head.php");
    }   

    function getScripts(){
    require_once(APPPATH."views/common/scripts.php");
    }

    function getFooter(){
    require_once(APPPATH."views/common/footer.php");
    }

Dans votre contrôleur, vous n'appelez qu'une seule vue en ce qui concerne MVC et appelez les fonctions de votre assistant personnalisé.

class Hello extends CI_Controller {

   public function index(){
       $this->load->helper('common');
       $this->load->view('index');   
   }

}
1
répondu Tudor 2015-10-27 14:56:06