Zum Inhalt springen

Funktionen von externen Classen aufrufen

Erstellt am 25. Juni 2007 · 12 Antworten · letzte Antwort am 28. Juni 2007

Tags: PHP, Frage

THE_AI ·

Salut a tout le monde 🙂

So Leute 🙂 Ich schreibe seit lange eine Extension, dass Seminare verwalten soll. Ich habe den Kickstarter benutzt um das Grundgerüst zu erzeugen.

Die pi1 Klasse wird immer grösser, und grösser und deswegen habe ich mir heute gedacht, dass es vielleicht nützlich wäre, wenn ich die Funktionen die in pi1 aufgerufen werden in einer anderen Datei aufrufe.

Hier eine Erläuterung mit PHP Kode.

In meiner pi1 Klasse habe ich folgendes:

function main($content, $conf) {
$this->pi_loadLL();

		//		parse XML data into php array
		$this->pi_initPIflexForm();

		//		get values
		$this->config['view'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'view_input', 'sVIEW');
		$this->config['eview'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'eview_input', 'eVIEW');
		$this->config['pageforsingleview'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'pageforsingleview', 'eVIEW');
		$this->config['maxReviewOnPage'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'maxReviewOnPage', 'eVIEW');
		$this->config['pageBrowser'] = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'pageBrowser', 'eVIEW');

switch ($this->config['view']) {
			case 'single' :
				$content .= $this->singleView();
				break;
			case 'list' :
				$content .= $this->listView();
				break;
			case 'edit' :
				$content .= $this->editView();
				break;
			case 'meineSeminare' :
				$content .= $this->meineSeminare();
				break;
		}

		return $this->pi_wrapInBaseClass($content);
	}

So in backend lege ich eine Seite und lege ich da meine Extension. Ich habe dann die Möglichkeit einen Ansicht auszuwählen (listView, singleVie und so weiter).

Ich möchte jetzt meine editView in einer externen Datei schreiben.

require_once (PATH_tslib . 'class.tslib_pibase.php');


class tx_editview extends tslib_pibase {

	function editView() {
		echo 'test';

		$content = 'editView';
		$template = $this->cObj->fileResource('EXT:xxx/template/xxx_template.html');

		$sql = $GLOBALS['TYPO3_DB']->sql_query("SELECT *  FROM xxx ");
		$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($sql);

		// 		Substitutionen festlegen

		$markerArray['###SUBJECT###'] = '<input type="text" name="subject" size="20" value="' . $row['subject'] . '" />';

		//		Subpart extrahieren
		$subpart = $this->cObj->getSubpart($template, "###TEMPLATE_EDITVIEW###");

		//		Substitution durchf&#65533;hren
		$content = $this->cObj->substituteMarkerArray($subpart, $markerArray);

		return $content;

	}

	}

if (defined('TYPO3_MODE') && bla bla bla;
}
?>

Jetzt in meiner pi1 Klasse habe ich tx_editview.php included und da mache ich eine instanz der Klasse und dann starte ich die Funktion.

function editView(){

	$editview = new tx_editview();
	$editview->editView();


	}

ich bekomme mein echo ausgegeben (test), aber nicht die Markers. Irgenwie wird der Content nicht gefüllt.
Was ist daran falsch? Was muss noch in meiner editview-Datei geschrieben werden?
Ich habe überlegt, dass es vielleicht besser wäre wenn ich die pi1 erweitere (editview extends pi1) dann aber habe ich das Problem, dass innerhalb von pi1 wieder pi1 aufgerufen wird und das ist mit einer Fehlermeldung verbunden.

Danke im Voraus!

wurgli ·

Hallo,

bin jetzt nicht unbedingt der Profi aber ich würde sagen, dein Rückgabewert von editView() wird nirgendshin übergeben.

$editview->editView();

würd ich auf

$content .= $editview->editView();

und außerdem heißt deine Funktion in dem anderen Plugin auch editView(). Weiß jetzt nicht ob das auch einen Fehler gibt, da du die Funktion eh über ein anderes Objekt aufrufst aber ich würde sie umbenennen.

THE_AI ·

Hallo wurgli und danke für die Antwort.

Ich habe deine Threads gelesen, aber hilft deine Lösing nicht.

return $content habe ich in der Funktion in der editview Datei.

$content .= $editview->editView();

Bewirkt gar nichts - mein echo aber bleibt da 🙂

Ich bin sicher, dass das Problem von den Markers kommt.

NickD ·

wenn das echo in der funktion ausgegeben wird, wird diese auch aufgerufen. also es ist sicher ein problem der marker!

THE_AI ·

Es gibt aber etwas mehr. Ich benutze der Business Template, das mit Typo3 kommt.
Er besteht aus zwei Frames. Und in dem zweiten Frame ist zwar mein echo ausgegeben, aber es gibt kein Hintergrund.

NickD ·

hast du geprüft ob der pfad stimmt?
zum testen würde ich das template mal in fileadmin legen, also :

$template = $this->cObj->fileResource('fileadmin/templates/template.html');

THE_AI ·

Der Pfad muss ja stimmen!
Wenn ich alles in meiner Main-Klasse schreibe - dann erscheint alles so wie es soll.

bobsomoto ·

Also ersmal hallo, ich geb wurgli recht ...du hast zwar ein return content in deiner fkt editview() aber dieser content muss auch an einen anderen oder vielmehr in einen anderen contentbehälter rein...denn return content erzeugt ja keinen content, sondern die letzte Zeile in deiner Mainfkt erzeugt diesen....mit $editview->editview() schiesst du den Inhalt der in der editview() erzeugt wird ins leere....
die main muss so aussehen wie sie aussieht bei dir, aber die in deiner pi enthaltene fkt editview muss so aussehen:

   1.
    function editView(){
          $editview = new tx_editview();
          return $editview->editView();
    }

oder

function editView(){
          $editview = new tx_editview();
          $content = $editview->editView();
          return $content;
    }

dann müsste es funzen!

Gruss Boris

THE_AI ·

Noch einmal Danke für die Hilfe!

Bobsomoto - vielleicht hast du recht, aber zur Zeit hilft deine Lösung nicht.

Ich habe ein bisschen Debugging gemacht (ah echo ich liebe dich 🙂)

Ich habe folgendes geschrieben:

function editView() {
		echo $content.'1'.'<br />';

		$content = 'editView';

		echo $content.'2'.'<br />';

		$template = $this->cObj->fileResource('EXT:xxx/template/xxx.html');
//		
		echo $content.'3'.'<br />';
		$sql = $GLOBALS['TYPO3_DB']->sql_query(" SELECT *  FROM xxx ");
		$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($sql);

		// 		Substitutionen festlegen

		$markerArray['###SUBJECT###'] = '<input type="text" name="subject" size="20" value="' . $row['subject'] . '"/>';
		$markerArray['###AUTHOR###'] = $row['author'];
		$markerArray['###TARGETGROUP###'] = $row['targetgroup'];
		$markerArray['###PLACE###'] = $row['place'];
		$markerArray['###TRAINER###'] = $row['trainer'];
		$markerArray['###COST###'] = $row['cost'];
		$markerArray['###CATEGORIES###'] = $this->loadCategories();
		;


		echo $content.'4'.'<br />';
//Subpart extrahieren
		$subpart = $this->cObj->getSubpart($template, "###TEMPLATE_EDITVIEW###");
		//		Substitution durchf&#65533;hren
		$content = $this->cObj->substituteMarkerArray($subpart, $markerArray);

		echo $content.'5'.'<br />';

		return $content;

	}

Als Ergebnis bekomme ich:
1
editView2

Mein echo 3 ist nicht ausgegeben? Hm was ist los?
Wenn ich das gleiche mit meinen anderen Funktionen mache z.B. listView() bekomme ich das erwartende Ergebnis.

Es scheint so aus, dass nach $template = $this->cObj->fileResource('EXT:bw_seminardb/template/seminardb_template.html'); der Script stoppt.

P.S. Und wieso in meiner PHP Code .'<br />' ist ausgegeben als .'' ?

bobsomoto ·

Hallo AI..also ich in deinem code ist ein Semikolon zu viel, ich denke nicht daß das der Fehler ist...vielleicht hasse ja auch nur was rausgeschmissen.....von welcher Grösse der pi sprechen wir überhaupt, weil ich persönlich garnix aus der pi Klasse rausschmeissen würde, hauptsache das ist sauber in einer Fkt ausgelagert...nichts destotrotz, entweder ich würde die editView als Fkt in der pi
zum funktionieren bringen und wenn die 100% läuft auslagern wenns unbedingt sein muss oder wenn die listView ausgelagert ist und funzt kopier die 1:1 und änder die
aber in Einzelschritten das wenn was falsch ist du weisst was!!!
Was anderes kann ich dazu nicht sagen ohne den ganzen code zu sehen und selbst Hand anzulegen.....

Gruss Boris

THE_AI ·

Zur Zeit ist nur 50% meiner Extension fertig. (SingleView und ListView)(300 Zeilen)
Ich muss noch editView machen.
Wenn alles in der pi Klasse ist, dann funktioniert es. Die Klasse ist auch nicht so groß aber am Ende wird ja wahrscheinlich mehr als 900 Zeilen sein und ich will dass ich alles schön strukturiere.
Ich sehe kein Grund für das Ding nicht zu funktionieren.

editView so wie du es siehst - funktioniert wenn es im pi1 ist, aber nicht wenn es in einer anderen Klasse ausgelagert ist. Das nervt mich ja viel.

bobsomoto ·

Gerade fällt mir auf das ich gerade an einem ähnlichen Problem sitze, ich rufe ne php datei in einer url auf, in form von http://www.meineseite.de/link.php die automatisch einloggen soll. Die funktioniert wenn ich die logindaten innerhalb der
datei deklariere, sobald ich versuche die aus der db zu laden funktioniert bei mir ein später in der datei enthaltenes header(); nicht mehr, also praktisch genau wie bei dir...ich hab mittlerweile rausbekommen das bei mir wohl irgendwelche t3lib klassen nicht richtig eingebunden sind....das würde heissen das du bei der auslagerung deiner Klasse vielleicht auch noch etwas einbinden musst damit die ausgabe und die restlichen echos nicht ignoriert werden, denn bei mir wird das vorher funktionierende header(); auf einmal auch ignoriert, obwohl es nichts enthält was mit den nicht eingebundenen dingen in zusammenhang steht! Vielleicht hilft dir das

Gruss Boris

THE_AI ·

Ich habe PHP show error endlich gestartet und es hat sich festgestellt, dass mein cObj fehlt.

Jetzt bei meinem Funktionaufruf schreibe ich

function editView(){

	    $editview = new tx_editview();
		$editview->cObj = $this->cObj;
        return $editview->editView();


	}

Und es klappt soweit. Danke für die Hilfe!