2011-04-11 5 views
3

je le code suivant dans un contrôleur:CodeIgniter - répétition de code et les variables passage aux fonctions

<?php 

class Student extends CI_Controller 
{ 

function index() 
{ 
    $data = $this->init->set(); 

    $this->parser->parse('include/header', $data); 
    $this->parser->parse('student/student_index', $data); 
    $this->parser->parse('include/footer', $data); 
} 

function planner() 
{ 
    $data = $this->init->set(); 

    $this->parser->parse('include/header', $data); 
    $this->parser->parse('student/student_cal', $data); 
    $this->parser->parse('include/footer', $data);  
} 

} 
?> 

Comme vous pouvez le voir, il y a beaucoup de répétitions ici. Fondamentalement tout cela. J'ai déjà mis mes variables dans un modèle, donc je n'ai qu'à appeler la fonction modèle à chaque fois au lieu de mettre l'ensemble des données $ array au début de chaque fonction. Quoi qu'il en soit, j'ai essayé de réduire la répétition ici en procédant comme suit:

<?php 

class Student extends CI_Controller 
{ 

function index() 
{ 
    $data = $this->init->set(); 

    $this->parser->parse('include/header', $data); 

    switch($this->uri->segment(2)) 
    { 
     case '': $this->home($data); break; 
     case 'planner': $this->planner($data); break; 
    } 
    $this->parser->parse('include/footer', $data); 
} 

function home($data) 
{ 
    $this->parser->parse('student/student_index', $data); 
} 


function planner($data) 
{ 
    $this->parser->parse('student/student_cal', $data); 
} 

} 
?> 

Cela fonctionne en quelque sorte, très bien pour ma page d'accueil. Il analyse les variables et il n'y a aucun problème. Cependant, sur la page 'planificateur', je reçois des erreurs:

Message: Missing argument 1 pour le planificateur de l'élève()

du message: Undefined variable: données

Message: Invalid argument fourni pour foreach()

Je suis assez sûr que je reçois ces erreurs parce que la fonction ne reçoit pas en quelque sorte le tableau $data. J'ai également lu dans les documents de CI que le troisième segment d'une URL est passé en argument, et dans ce cas le troisième segment est inexistant, donc rien n'est passé. Cependant, les documents CI ne m'ont pas dit comment je pouvais passer mon tableau $data de la fonction index() à ma fonction planner(). Je me demande également pourquoi la fonction de la maison fonctionne très bien, sans erreurs.

Répondre

3

Maintenant, je ne vois pas la raison de cette refactoring si elle va rendre le code vraiment difficile à regarder. Je ne suis pas tout à fait sûr de ce que fait la fonction d'analyse, donc la façon dont je l'ai changé était de passer le paramètre comme une chaîne, mais de préférence je chargerais le contenu dans un tampon et le passerais de cette façon. Mais voici un peu plus propre et, espérons-le lisible, amovible de la duplication ... et j'espère que cela fonctionne :).



class Student extends CI_Controller 
{ 

    private function load_student_page($content){ 
     $data = $this->init->set(); 

     $this->parser->parse('include/header', $data); 
     $this->parser->parse($content, $data); 
     $this->parser->parse('include/footer', $data); 

    } 

    function index() 
    { 
    $this->load_student_page('student/student_index'); 
    } 

    function planner() 
    { 
    $this->load_student_page('student/student_cal'); 
    } 

} 
2

Comme vous l'avez dit, CodeIgniter essaie de passer le troisième segment en tant que paramètre, mais il n'existe pas.

Vous devrez peut-être utiliser la fonction "_remap".

class Student extends CI_Controller { 

    public function _remap($method, $parameters) 
    { 
     $data = $this->init->set(); 
     $this->parser->parse('include/header', $data); 

     switch($this->uri->segment(2)) 
     { 
      case '': $this->home($data); break; 
      case 'planner': $this->planner($data); break; 
     } 

     $this->parser->parse('include/footer', $data); 
    } 

}

+0

Hmm, j'ai essayé mais je n'arrivais pas à le faire fonctionner. Je suppose que je vais jouer avec ça plus tard; Un peu perdu un peu de temps à essayer cette autre «solution» ici. Je regardais la fonction _remap plus tôt, mais cela ne ferait pas vraiment ce que je voulais faire. Peut-être que je l'utilisais mal! :) Je vais jeter un coup d'oeil à nouveau, et peut-être chercher des modèles .. Je suppose que je ne comprends vraiment pas ce cadre :( – cabaret

Questions connexes