2012-03-27 30 views
1

Ich versuche eine Erweiterung meiner Klasse Controller zu schreiben. Das Problem ist, ich kann nicht herausfinden, wie ..Ich kann meinen Controller nicht erweitern

Ich habe die folgende Klasse namens Test, in dem es eine Funktion gibt, die einfach aaaa und in der gleichen Datei, am Ende, als meine Controller zurückgibt:

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

     function echoMe(){ 

      return 'aaaaaaaaaaaaaaaaa'; 
     } 
    } 

Innerhalb meiner Controller Klasse habe ich eine Funktion, die die allgemeine Ausgabe für eine Kunden-Homepage ist. Ich versuche, die Funktion echoMe von der Verlängerung oben zu nennen, aber ich halte

Call to undefined Methode Controllers bekommen :: echoMe()

Hier wird die Client-Funktion (der Anruf an echoMe() ist ganz oben):

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); 
    } 

Ich weiß, das ist eine sehr einfache Frage. Ich habe versucht, this Guide zu folgen, aber etwas klickt nicht ...

Könnte jemand bitte helfen? Wie kann ich die Funktion echoMe() von test aufrufen?

Ich weiß, wie man nur eine brandneue Klasse schreibt und es nennt, aber ich versuche zu lernen, wie man richtig erweitert und immer wieder versagt.

Soll ich den "Test" irgendwo innerhalb der Controller aufrufen?

+0

Bitte fügen Sie den Code, wo Sie 'controller_client1()' nennen. – Niko

Antwort

3

In der config.php setzen Sie das Präfix für die Datei, die Sie erweitern möchten. So sollte es My_test sein, wenn Sie diese Voreinstellung geändert haben (angezeigt unten)

/* 
|-------------------------------------------------------------------------- 
| 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_'; 

Achten Sie darauf, den Controller in den richtigen Ordner haben (application/Kern in codeigniter 2.1.0), dann sollten Sie kein haben Problem. Hoffe, das hilft

hier ist mein Controller, den ich erweitern. Die Datei wird My_Controller.php genannt (creative Ich weiß)

<?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 
} 

?> 

Haben Sie sehen, ich habe zwei erweiterten Controllern in der gleichen Datei. Mein erstreckt Code sieht wie folgt aus:

<?php 
class home extends MY_Controller 
{ 

und dann nur My_Controller mit My_Admin ersetzen, wenn ich das Admin erweitern möchten.

+0

Ah, ich benutze eigentlich keinen Code Igniter Ich schreibe meinen eigenen kleinen MVC Rahmen .. Ich habe Code Zünder noch nicht benutzt. Gibt es eigentlich einen Sinn, meinen eigenen Controller auf diese Weise zu erweitern, oder ist es genauso einfach und effizient, einfach nur einen neuen Kurs zu machen? – John

1

Versuchen Sie, diese (allgemeine Idee, nicht CodeIgniter only):

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

Denken Sie daran, test erweitert Ihre Controller Klasse, nicht umgekehrt - so können Sie Ihre Methoden außerhalb der test Klasse/Objekt nicht nennen Beispiel.

Es kann auch eine gute Idee sein, auf eine neue Version von CodeIgniter zu aktualisieren - achten Sie jedoch auf den Namen des neuen übergeordneten Controllers.

EDIT

Ok, das enought werden sollte, um Ihnen den Einstieg - beachten Sie, dass es PHP5 ist, nicht PHP4, so Bauer __construct und nicht den Klassennamen genannt werden:

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

Ich bekomme folgendes: 'Aufruf zu undefinierter Methode Controller :: Controller()' beim Versuch den neuen test() in meiner client1-Funktion innerhalb der Haupt-Controller-Klasse aufzurufen – John

+0

Wie gesagt, Sie können Ihre neuen Controller-Methoden nicht aufrufen in der alten Steuerung ist es umgekehrt - zum Beispiel, wenn dein 'Controller' eine Methode' echoMe' hätte, dann könntest du diese Methode von deinem 'test extends Controller'-Controller aus aufrufen, verstehst du? – Shomz

+0

Sehen Sie meinen aktualisierten Code, es sollte genug sein, um Sie zu beginnen. – Shomz

1

echoMe() Funktion definiert ist in test Klasse und nicht in Controller Klasse. Wenn die controller_client1-Funktion mit der Instanz Controller class aufgerufen wird, ist echoMe nicht vorhanden, da sie nicht innerhalb der Klasse Controller definiert ist.

Die beste Möglichkeit, dies zu erreichen, ist das Erstellen einer leeren echoMe Funktion in der Basis Controller Klasse. Auf diese Weise funktioniert Polymorphismus. Beim Aufrufen der controller_client1-Funktion aus der Instanz test Klasse wird die Methode dieser Klasse ausgeführt. Andernfalls wird die Methode aus der Basisklasse ausgeführt.

Ich hoffe, dass ich nicht den Punkt der Frage entging :)

+0

Nein ich verstehe was du meinst. Es ist logisch, dass ich nichts von Test aufrufen kann, bis irgendwo im Controller aufgerufen wird. Ich versuche, die öffentlichen, Mitglieder- und Admin-Funktionen durch Erweiterungen des Controllers zu trennen .. aber bisher schade kläglich. – John

+0

Sie können ** Methoden von 'test' aufrufen, die nicht in' Controller' definiert sind, aber nur wenn Sie eine Instanz der 'test'-Klasse haben, z. '$ testObject = neuer test(); $ testObject-> echoMe(); 'das wird funktionieren, aber $ controllerObject = new Controller(); $ controllerObject-> echoMe(); 'dies wird nicht, außer' echoMe() 'ist definiert in' Controller'. – Kosta

1

echo $this -> echoMe(); fehl, weil seine in dem Kind (extended) Klasse erstellt und Ihr es in der übergeordneten Klasse aufrufen. Die Frage ist ein wenig schwer zu verstehen.

abstract class Controller{ 
    public function __construct(){ 

    } 

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

}

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

Ich denke, die Frage ist eigentlich schon von Kosta beantwortet worden, aber es könnte einige Missverständnisse an Ihrer Seite sein. Also lassen Sie mich das um einige Beispielcode erweitern:

"erweitert" bedeutet nicht, dass die tatsächliche Controller-Klasse erweitert wird. Die neue Klasse "test" erbt nur jede einzelne Methode und Eigenschaft, die von der Controller-Klasse nicht als "privat" deklariert ist. Die Controller-Klasse selbst bleibt unberührt.

Verwandte Themen