Zum Inhalt springen

$this->pi_linkTP fatal error

Erstellt am 24. Juni 2008 · 2 Antworten · letzte Antwort am 25. Juni 2008

Tags: Frage

froemken ·

Hallo zusammen,

meine Extension wird zu groß und so habe ich einige Funktionen in Klassen ausgelagert.

In meiner class.tx_sfwsfmitglieder_pi1.php habe ich dazu folgende Zeile hinzugefügt:

require_once('class.tx_sfwsfmitglieder_func.php');

In dieser Datei ist dann unter anderm diese Funktion zu finden:

function building_header( $piVars ) {
  $this->piVars = $piVars;
  switch( $this->piVars['page'] ) {
  case 2:
    $category = this->category_id2name($this->piVars['category'] );		    return '<h1 class="csc-firstHeader">'.$this->pi_linkTP( 'Mitglieder', array() ).'&nbsp;-&nbsp;'.$category.'</h1>';
    break;
  default:
    return '<h1 class="csc-firstHeader">Mitglieder</h1>';
  }
}

Dort gibt es die Funktion: $this->pi_linkTP, die vorher in der class.tx_sfwsfmitglieder_pi1.php hervoragend geklappt. Jetzt in der neuen Klassendatei klappt die Funktion nicht mehr und in meinem Browser erscheint:

Fatal error: Call to a member function typoLink() on a non-object in /home/worshdbw/www.worshipforum.de/typo3_src-4.1.7/typo3/sysext/cms/tslib/class.tslib_pibase.php on line 304

Kann mir jemand einen Tipp geben, was ich noch machen muss?

Danke Euch

froemken

froemken ·

Ich hab mir den ganzen Kram jetzt mal ein bissl vom mm_forum abgeguckt und war völlig erstaunt, warum dort noch nicht mal eine Instanz der Klasse erzeugt wurde zur tx_mmforum_user.
Nirgends war ein makeInstance('tx_mmforum_user') zu finden.

Nach weiterem Suchen habe ich dann immer wieder mal Methodenaufrufe ala:

KLASSE::METHODE

gefunden.

Dieses System habe ich jetzt auch für meine Extension verwendet und es funktionierte auf Anhieb. Ich brauche nicht einmal diese ganzen Variablen für piVars und Co zu übergeben. Sind schon alle vorhanden.

Was mich wundert ist, dass sich Methoden innerhalb einer Klasse nicht mit $this-> aufrufen lassen, sondern nun auch mit KLASSE::METHODE aufgerufen werden müssen.

Naja...wird wohl daran liegen, dass sie nicht instanziiert worden sind.

Ich verstehe immer noch nicht, warum ich nicht auf $this->pi_linkTP zugreifen konnte, obwohl doch meine Klasse von der tslib_pibase geerbt hat?!

Würd mich freuen, wenn jemand da ein paar Stichworte zu erklären könnte.

froemken

froemken ·

Ich habe gestern noch 3 Stunden die Bücher gewalzt und selbst heute habe ich mich mit dem Thema Vererbung und Co nochmals auseinander gesetzt.

Mit der 2 Doppelpunkt-Syntax (KLASSE::METHODE) kann ich Methoden einer nicht instanziierten Klasse aufrufen. Ja! Aber diese Syntax wird es in dieser Form wohl nur noch in PHP5 geben und in der 6er Version sogar komplett rausgenommen werden. In der 6er Version wird diese Funktion dann nur noch mit Methoden funktionieren, die mit "static" definiert werden.

Na da bin ich ja mal gespannt,wie TYPO3 da in Zukunft drauf reagieren wird.

Für mich heißt das, dass ich besser versuchen sollte meine Klassen zu instanziieren und mit $this darauf zuzugreifen. Immerhin heißt es in dem Buch "PHP 5.1 Kompendium von Markt und Technik" dass Klassen instanziiert werden müssen.

Daran will ich mich halten.

Für mich heißt das: Heraus finden warum $this->pi_LinkTP nicht funktioniert. Die Fehlermeldung: Call to a member function typoLink() on a non-object lässt darauf schließen, dass noch irgendwas KEIN Obkejt ist.

In der class.tslib_pibase.php ist mir dann aufgefallen das die Eigenschaft "var $cObj" zwar deklariert, aber nirgends initialisiert wird. Also hat die Eigenschaft nach der Instanziierung gar keinen Wert und beinhaltet auch kein Objekt der Klasse "tslib_content".

Die Methode, die ich aufrufe (pi_linkTS) führt den Befehl
return $this->cObj->typoLink($str, $conf);
aus. Wie oben gerade geschrieben hat cObj aber noch keinen Wert.

Also habe ich einen Konstruktor in meine Klasse eingebaut, der folgendes ausführt:
$this->cObj = t3lib_div::makeInstance('tslib_cObj');
Mit diesem Befehl werden alle Methoden der Klasse tslib_cObj nach $this-cObj instanziiert. Unteranderem natürlich auch die Methode typoLink.

Dank diesem kurzen Konstruktor kann ich meine Klassen ganz einfach wie gehabt instanziieren und mit $this-> auf meine im Objekt enthaltenen Methoden und Eigenschaften zugreifen.

Ich hoffe damit auch Euch geholfen zu haben.

Stefan Frömken