2012-03-27 2 views
1

J'essaie d'écrire une extension à ma classe Controller. Le problème est que je n'arrive pas à comprendre comment ..Impossible d'étendre mon contrôleur

J'ai la classe suivante test dans laquelle il y a une fonction qui retourne simplement aaaa et dans le même fichier, à la fin, comme mon Controller:

class test extends Controller 
    { 
     function test() 
      { 
       parent::Controller(); 
      } 

     function echoMe(){ 

      return 'aaaaaaaaaaaaaaaaa'; 
     } 
    } 

Dans ma Controller classe I ont une fonction qui est la sortie générale pour une page d'accueil de clients. J'essaie d'appeler la fonction echoMe de l'extension ci-dessus, mais je continue à obtenir

Appel à la méthode non définie Controller :: echoMe()

est ici la fonction client (l'appel à echoMe() est juste en haut):

function controller_client1($controlData = NULL) 
    { 
     echo $this -> echoMe(); 

     //as the client page is content from the xml, mmodel needs the page number 
     $pageNumber = ''; 
     if(isset($_GET['number'])) 
      { 
       $num = htmlentities($_GET['number']); 
       if(ctype_digit($num) && $num >= 0) 
        { 
         $pageNumber = $num; 
        } 
      } 
     else{ 
      $pageNumber = 0; 
     } 
     //loading the page content 
     $data = $this->model->model_loadXMLdata($pageNumber); 


     if(!empty($controlData)) 
      { 
       //check if there is any info in the control data sent 
       foreach($controlData as $key => $value) 
        { 
         //add the info to the data array 
         $data[$key] = $value; 
        } 
      } 

     $this->load->load_clientHomePage($data); 
    } 

Je sais que c'est une question très simple. J'ai essayé de suivre le guide this, mais quelque chose ne clique pas ...

Quelqu'un pourrait-il m'aider? Comment puis-je appeler la fonction echoMe() à partir du test? Je sais comment écrire juste une toute nouvelle classe et l'appelle, mais j'essaie d'apprendre comment étendre correctement et continuer à échouer. Est-ce que je suis censé appeler le "test" à partir de Controller quelque part?

+0

Veuillez inclure le code où vous appelez 'controller_client1()'. – Niko

Répondre

3

Dans config.php, vous définissez le préfixe du fichier que vous souhaitez étendre. Il doit donc être My_test, sauf si vous avez modifié ce paramètre prédéfini (affiché ci-dessous)

/* 
|-------------------------------------------------------------------------- 
| Class Extension Prefix 
|-------------------------------------------------------------------------- 
| 
| This item allows you to set the filename/classname prefix when extending 
| native libraries. For more information please see the user guide: 
| 
| http://codeigniter.com/user_guide/general/core_classes.html 
| http://codeigniter.com/user_guide/general/creating_libraries.html 
| 
*/ 
$config['subclass_prefix'] = 'MY_'; 

Assurez-vous que le contrôleur dans le dossier droit (application/core dans CodeIgniter 2.1.0), alors vous ne devriez pas avoir un problème. J'espère que cela aide

voici mon contrôleur que je prolonge. Le fichier est appelé My_Controller.php (créateur je sais)

<?php 
class MY_Controller extends CI_Controller { 

function __construct() 
{ 
    parent::__construct(); 
//constructor code here 
} 

//Custom functions here 
} 

//sencond controller I extend in the same file 
class MY_Admin extends CI_Controller { 

function __construct() 
{ 
//more custom stuff for admin stuff 
} 

//more custom functions for admin stuff 
} 

?> 

vous a voir, j'ai deux contrôleurs étendus dans le même fichier. Mon code extension ressemble à ceci:

<?php 
class home extends MY_Controller 
{ 

puis il suffit de remplacer My_Controller avec My_Admin si je veux prolonger l'administrateur.

+0

Ah, je n'utilise pas réellement Code Igniter J'écris mon propre petit framework MVC .. Je n'ai pas encore utilisé Code Igniter. Y a-t-il vraiment intérêt à étendre mon propre contrôleur de cette façon, ou est-ce aussi simple et efficace d'aller de l'avant et de faire un nouveau cours? – John

1

Essayez cette (idée générale, non CodeIgniter seulement):

$test = new test(); 
echo $test->echoMe(); 

Rappelez-vous, test étend votre classe Controller, et non l'inverse - vous ne pouvez pas appeler vos méthodes en dehors de la classe/objet test exemple.

De même, il peut être judicieux de mettre à niveau vers une nouvelle version de CodeIgniter, mais attention au nouveau nom du contrôleur parent.

EDIT

Ok, cela devrait être enought pour vous aider à démarrer - notez qu'il est PHP5, pas PHP4, si les constructeurs sont appelés __construct et non le nom de classe:

class Controller { 
    public $mainvar; 

    function __construct() { 
     $this->mainvar = '<br />'; 
    } 

    function echoMe() { 
     return 'aaaaaaaaaaaaaaaaa'; 
    } 
} 

class Test extends Controller { 
    function __construct() { 
     parent::__construct(); 
    } 

    function echoMeAgain(){ 
     return 'bbb'; 
    } 
} 

$test = new Test(); 

echo $test->echoMe(); 
echo $test->mainvar; 
echo $test->echoMeAgain(); 
+0

Je reçois ce qui suit: 'Appel à la méthode non définie Controller :: Controller()' en essayant d'appeler le nouveau test() dans ma fonction client1 dans la classe contrôleur principale – John

+0

Comme je l'ai dit, vous ne pouvez pas appeler vos nouvelles méthodes de contrôleur à l'intérieur de l'ancien contrôleur, c'est l'inverse - par exemple, si votre 'Controller' avait une méthode' echoMe', alors vous pourriez appeler cette méthode depuis votre contrôleur 'test extends Controller', comprenez-vous? – Shomz

+0

Voir mon code mis à jour, cela devrait suffire pour vous aider à démarrer. – Shomz

1

fonction echoMe() est définie dans la classe test et non dans la classe Controller. Lorsque la fonction controller_client1 est appelée avec l'instance de classe Controller, echoMe n'existe pas car elle n'est pas définie dans la classe Controller.

La meilleure façon d'y parvenir est de créer une fonction vide echoMe dans la classe de base Controller. De cette façon, le polymorphisme fonctionne. Lorsque vous appelez la fonction controller_client1 de l'instance de la classe test, la méthode de cette classe sera exécutée. Sinon, la méthode de la classe de base sera exécutée.

J'espère ne pas manquer le point de la question :)

+0

Non, je comprends ce que tu veux dire. Il est logique que je ne puisse rien appeler du test avant d'être appelé quelque part dans le contrôleur. J'essaye de séparer le public, le membre et les fonctions administratives par des extensions du contrôleur .. mais jusqu'ici échouant misérablement. – John

+0

Vous pouvez ** appeler ** des méthodes de 'test' qui ne sont pas définies dans' Controller' mais seulement si vous avez une instance de la classe 'test', par ex. '$ testObject = nouveau test(); $ testObject-> echoMe(); 'ceci fonctionnera, mais' $ controllerObject = new Controller(); $ controllerObject-> echoMe(); 'ce sera le cas sauf si echoMe()' est défini dans 'Controller'. – Kosta

1

echo $this -> echoMe(); échouera parce que son créé chez l'enfant (étendu) classe et votre appel dans la classe parente. La question est un peu difficile à comprendre.

abstract class Controller{ 
    public function __construct(){ 

    } 

    public function echoMe($str){ 
     echo $str; 
    } 

}

class test extends Controller{ 
    public function __construct(){ 
     parent::echoMe('aaaaaaaaaa'); 
    } 
} 
0

Je pense que la question a en fait déjà répondu à Kosta, mais il pourrait y avoir un malentendu à vos côtés. Alors laissez-moi étends que, par un exemple de code:

class Controller { 
    public function run() { 
     $this->echoMe(); 
    } 
} 

class test extends Controller { 
    public function echoMe() { 
     echo "works"; 
    } 
} 

// This does NOT work, because Controller::echoMe does not exist 
$controller = new Controller(); 
$controller->run(); 

// This DOES work, because $this will be instance of test, and 
// test::echoMe exists and is callable. 
$test = new Test(); 
$test->run(); 

« ressorts » ne signifie pas que la classe contrôleur réelle est étendu. La nouvelle classe "test" hérite de chaque méthode et propriété qui n'est pas déclarée "private" par la classe Controller. La classe Controller elle-même reste intacte.

Questions connexes