web-dev-qa-db-fra.com

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

Je commence un grand projet codeigniter et j'aimerais essayer de créer des "mini" vues réutilisables pour des extraits de contenu, telles que des boucles de données pouvant ê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 c'est le cas, comment? Ou devrais-je appeler la "mini vue" depuis le contrôleur et ainsi transmettre le code de la vue à la vue principale?

62
David

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

1. Chargez une vue imbriquée à l'intérieur du contrôleur

Chargez la vue à l'avance et passez à l'autre vue. Tout d'abord mettre 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);
?>

Puis mettez <?=$menu?> dans votre vue, au point où vous souhaitez que le menu apparaisse.

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

Tout d'abord mettre ceci dans le contrôleur:

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

Puis mettez ceci dans le /application/views/home.php vue:

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

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

À 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 inclure php. Bien qu'indirectement les deux soient identiques, la 1ère méthode est plus claire et plus propre que la 2ème!

109
sandip

Honnêtement, je préfère le faire en disposant des vues de modèle puis en chargeant les données nécessaires du contrôleur, ce qui signifie beaucoup moins de code répété et suit le concept DRY 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 modèle ressemblerait à quelque chose comme ceci:

template.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);

Cette façon de procéder présente de nombreux avantages. Premièrement, je peux avoir plusieurs modèles. Par exemple, dans mon cas, deux principaux, un pour les vues de page complètes sans barre latérale et un pour les pages avec barre latérale, j’appelle également une instruction if pour décider de l’en-tête à inclure, le régulier ou celui avec le menu administrateur dedans.

Oui, je pourrais inclure l'en-tête, la barre latérale et le pied de page dans chaque page de la vue principale, mais cela aboutit à une tonne de code en double. Et que se passe-t-il si, par exemple, je veux que toutes mes pages aient quelque chose de nouveau, un autre petit extrait? À l'aide de modèles, j'ajoute l'extrait de code au modèle approprié, et c'est fait. En empruntant l’autre itinéraire, je trouve chaque page et j’ajoute la vue des extraits de code, c’est comme si, de mon point de vue, le code CSS était inutile, et donc inutile.

17
Rick Calder

METHODE 1

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

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


METHODE 2

ou dans le contrôleur, vous pouvez charger plus d’une vue comme celle-ci:

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

Aucune méthode n'est meilleure que l'autre, cela dépend si vous devez transmettre certaines données (dans ce cas, utilisez method2) ou si vous souhaitez inclure une vue dans une partie spécifique de votre vue principale (dans ce cas, il est préférable d'utiliser method1. )


METHODE

Passer 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 souhaitez transmettre des données complètes à votre vue d'inclusion, procédez comme suit: dans votre contrôleur:

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

à votre avis

$this->load->view('includes/included_view', $nestedView);
5

C’est un moyen simple d’inclure des vues dans des vues. Il n’est pas nécessaire de charger des vues à l’avance.

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
Rahul Chipad

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

Vous créez un nouvel assistant (dans application/helpers) avec un nom (par exemple, 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 appelez une seule vue en ce qui concerne MVC et appelez les fonctions à partir de votre assistant personnalisé.

class Hello extends CI_Controller {

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

}
0
Tudor