28 votes

Codeigniter: meilleur moyen de structurer des vues partielles

Comment feriez-vous la structure de la page ci-dessous dans Codeigniter?

alt text

J'ai réfléchi à la création de séparer les contrôleurs pour chaque section

  1. Menu de navigation de gauche
  2. Contenu de nav
  3. Nom de connexion
  4. Classement

À l'exclusion de la section de contenu (que cela change en fonction du lien sur le menu de navigation de gauche et de contenu de la valeur liquidative utilisée comme un peu sous-menu). Tous les autres articles restent à peu près la même

J'ai pensé faire:

Class User_Profile extends Controller
{

    function index()
    {
        $this->load_controller('Left_Nav');
        $this->load_controller('Content_Nav');
        $this->load_controller('Login_Name');
        $this->load_controller('Leaderboard', 'Board');

        $this->Left_Nav->index(array('highlight_selected_page' => 'blah'));

        $this->load('User');

        $content_data = $this->User->get_profile_details();

        $this->view->load('content', $content_data);

        $this->Login_Name->index();
        $this->Board->index();
    }

}

Évidemment, ce n' load_controller n'existe pas, mais ce functionaility serait utile. Le contrôleur pour chaque section reçoit les données nécessaires à partir du modèle et de chargement d'une page d' $this->view->load()

Il pourrait être un casse-tête pour avoir ce code dans le menu de navigation de gauche des liens comme les Nouvelles, les Utilisateurs, Sur Nous, etc.., Mais là encore pas tous les nav lien a tous ces articles, j'ai donc besoin de cette flexibilité que les sections comme "une vue partielle"

Quelqu'un peut-il suggérer une meilleure façon de faire cela?

24voto

alvincrespo Points 2351

@Reinis réponse probablement frappé la tache correctement pour les anciennes versions de CI à moins de 2,0 cependant beaucoup de choses ont changé depuis lors, j'ai donc pensé que je pourrais répondre à cette question avec une mise à jour de la méthode de ce que j'ai fait.

La plupart des il est similaire à @Reinis méthode décrite ici:http://codeigniter.com/wiki/MY_Controller_-_how_to_extend_the_CI_Controller

Cependant voici les mises à jour nous avons fait:

Étape 1: Créer un MY_Controller.php fichier et le stocker dans /application/core

Étape 2: Dans votre MY_Controller.php fichier mettre dans le contenu suivant:

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

class MY_Controller extends CI_Controller {

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

    function _output($content)
    {
        // Load the base template with output content available as $content
        $data['content'] = &$content;
        echo($this->load->view('base', $data, true));
    }

}

Étape 3: Créer un contrôleur d'échantillon à la base de MY_Controller.php dans ce cas, je vais créer un welcome.php contrôleur à l'intérieur de l'application/controllers/ avec le contenu suivant:

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

class Welcome extends MY_Controller {

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

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

}

Une fois que vous avez ces contrôleurs de jeu, procédez de la manière suivante:

Étape 4: Créer une vue de la base à l'intérieur de /application/views et le nom du fichier base.php le contenu du fichier doit être similaire à ceci:

<!DOCTYPE html>
<!--[if IE 7 ]><html lang="en" class="ie7"><![endif]-->
<!--[if IE 8 ]><html lang="en" class="ie8"><![endif]-->
<!--[if gt IE 8]><!--><html lang="en"><!--<![endif]-->
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <title></title> 
        <link rel="stylesheet" href="<?php echo base_url(); ?>stylesheets/reset.css" media="screen" />
    </head>
    <body>
        <div id="section_main">
            <div id="content">
                <?php echo $content; ?>
            </div>
        </div>
        <?php $this->load->view('shared/scripts.php'); ?>
        </div>
    </body>
</html>

Étape 5: création d'un autre point de vue dans /application/views et le nom de ce point de vue welcome_message.php le contenu de ce fichier sera:

<h1>Welcome</h1>

Une fois, tout cela est terminé, vous devriez voir la sortie suivante:

<!DOCTYPE html>
<!--[if IE 7 ]><html lang="en" class="ie7"><![endif]-->
<!--[if IE 8 ]><html lang="en" class="ie8"><![endif]-->
<!--[if gt IE 8]><!--><html lang="en"><!--<![endif]-->
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <title></title> 
        <link rel="stylesheet" href="http://somedomain.local/stylesheets/reset.css" media="screen" />
    </head>
    <body>
        <!-- BEGIN: section_main -->
        <div id="section_main">
            <div id="content">
                <h1>Welcome</h1>
            </div>
        </div>
        <!-- END: section_main -->
        <script src="/path/to/js.js"></script>
        </div>
    </body>
</html>

Comme vous pouvez le voir <h1>Welcome</h1> a été mis dans le modèle de base.

Ressources:

Espérons que cela aide quelqu'un d'autre de venir à travers cette technique.

19voto

Reinis I. Points 4089

Je ne peux pas garantir que c'est la meilleure approche, mais j'ai créer un contrôleur de base comme ceci:

class MY_Controller extends CI_Controller {

    public $title = '';
    // The template will use this to include default.css by default
    public $styles = array('default');

    function _output($content)
    {
        // Load the base template with output content available as $content
        $data['content'] = &$content;
        $this->load->view('base', $data);
    }

}

La vue 'de base' est un modèle (un point de vue qui comprend d'autres points de vue):

<?php echo doctype(); ?>
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <?php $this->load->view('meta'); ?>
    </head>
    <body>
        <div id="wrapper">
            <?php $this->load->view('header'); ?>

            <div id="content">
                <?php echo $content; ?>
            </div>

            <?php $this->load->view('footer'); ?>
        </div>
    </body>
</html>

Ce qu'il réalise est que chaque contrôleur de roulés de sa sortie dans le modèle de base, et que les vues de la validité de l'HTML au lieu de balises d'ouverture dans une vue et de clôture dans un autre. Si je voudrais un contrôleur spécifique pour utiliser un autre ou pas de modèle, je pourrais remplacer la magie _output() méthode.

Un véritable contrôleur devrait ressembler à ceci:

class Home extends MY_Controller {

    // Override the title
    public $title = 'Home';

    function __construct()
    {
        // Append a stylesheet (home.css) to the defaults
        $this->styles[] = 'home';
    }

    function index()
    {
        // The output of this view will be wrapped in the base template
        $this->load->view('home');
    }
}

Ensuite, j'ai pu utiliser ses propriétés dans mes vues comme ceci (c'est le "méta" afficher qui remplit l' <head> élément):

echo "<title>{$this->title}</title>";
foreach ($this->styles as $url)
    echo link_tag("styles/$url.css");

J'aime mon approche car elle respecte le principe SEC et de l'en-tête, pied de page et d'autres éléments sont inclus qu'une seule fois dans le code.

6voto

Phil Sturgeon Points 19227

Ma bibliothèque de modèles peut gérer tout cela. Vous créez un (ou plusieurs) fichier (s) de disposition contenant les partiels et une balise indiquant l'emplacement du contenu du corps principal.

Syntaxe aussi simple que:

 // Set the layout: defaults to "layout" in application/views/layout.php
$this->template->set_layout('whatever') 

// Load application/views/partials/viewname as a partial
$this->template->set_partial('partialname', 'partials/viewname');

// Call the main view: application/views/bodyviewname
$this->template->build('bodyviewname', $data); 
 

Simples non?

Mettez une partie de cela dans MY_Controller et c'est encore plus facile.

1voto

Ross Points 10658

avez-vous pensé des modèles? Il y a beaucoup de décent à ceux disponibles avec un peu de recherche - vérifier les CI wiki.

des modèles plus ou moins exactement ce que vous êtes après. Vous définissez un modèle de master et de "sections", et ceux-ci sont chargés de vous à chaque fois

ne voulez pas brancher trop donc cela pourrait vous aider à démarrer - modèle de bibliothèques dans CI

1voto

rkj Points 496

Je ferais un MY_Controller pour m'occuper de tout cela. Vous pouvez le compléter avec une mise en page (modèle) / bibliothèque de navigation pour générer toutes les mises en page, navigation, affichage / mise en surbrillance de l'élément de menu sélectionné, chargement des vues, etc.

Je dirais que ce n'est pas la bonne façon de le faire, si vous utilisez un contrôleur pour chaque section de page. Vous pouvez utiliser des vues et des vues imbriquées pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X