Zum Inhalt springen

Templatewechsler IF Funktion

Erstellt am 29. Februar 2008 · 10 Antworten · letzte Antwort am 4. März 2008

Tags: PHP, Frage

ÁndreMansfeld ·

Hallo Freunde,
ich stehe im Moment auf dem Schlauch.
Ich habe mir ne nette Funktion bebastelt um verschiedene HTML Templates, je nach "Kundenstatus" aus meiner Extention auszugeben. Allerdings klappt die Abfrage aus der SQL Tabelle nicht. Hier erstmal der erste Teil des Codes aus der _pi.

function displaySingle(){
//$status = '2'; <- 0,1,2,3 zeigen Wirkung und schalten das Template um :-)
$status = ???; <- hier müßte der Wert vom Datensatz ['kundenstatus']rein
	if ($status== 0){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_normal###");
     		 }else{
     		  if ($status== 1){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_silber###");
     		 }else{
     		  if ($status== 2){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_gold###");
     		 }else{
     		  if ($status== 3){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_platin###");
     		 }
     		 }
     		 }     		 
     		 }

Dort wo die Fragezeichen stehen müßte ich jetzt die Tabelle auslesen und den Wert einsetzen lassen. In der ersten Zeile steht im Moment auskommentiert schon
$status = '2';
Wenn ich diese Zeile benutze funktioniert alles prächtig :-)
Nun soll die Zahl aber eigentlich aus der zum Datensatz gehörigen Tabelle kommen. Mein Problem ist, dass ich die Daten aus der Tabelle eigentlich viel weiter unten erst mit

$row = $this->getItems(t3lib_div::_GET('uid'));
 		$marks = array();
		$marks["###EINTRAG1###"] = $row[0]['eintrag1'];

hole, um eine Ausgabe zu generieren.
Also die Template Funktion ist vor der eigentlichen Ausgabe und deswegen funktionieren ein

$status = $row['kundenstatus'];
oder 
$row = $this->getItems(t3lib_div::_GET('kundenstatus'));

nicht
Bitte um einen kleinen Denkanstoss

Vielen Dank o.O #paralyzed#

Desmond ·

Und warum kannst du die Daten nicht weiter oben auslesen? Also der getItems-Teil?

Übrigens würde ich das ewige if/else bei der Status-Abfrage durch switch ersetzen

ÁndreMansfeld ·

HEHE :o
ich bin ja leider nicht der Profi in PHP und schlage mich so durch.
Also das mit switch werde ich mir mal aneignen (klingt erstmal gut),
aber zurück zum Eigentlichen....
in meiner getItems habe ich eigentlich keinen Teil, der die Ausgabe behandelt.
Lediglich $row wird definiert und dann später in der Templatezuweisung wieder mit

$row = $this->getItems(t3lib_div::_GET('uid'));

inkludiert.
Aber eigentlich hast du recht, das solle funktionieren, dass ich dort schon die Weichen stelle, ich probiers mal....
Gibts denn auch einen Weg die DB (zu dem aufgerufenen Datensatz)in der Templatezuweisung abzufragen.

$status = 'kundenstatus' der 'uid' von getItems

:p oder so ......

Wie auch immer ... ich versuch mal mein Glück

Vielen Dank

Andreas

ÁndreMansfeld ·

Danke für den Link (sofort gebookmarked) :p
für status müßte aber der Wert von 'kundenstatus' rein.
Ich fange nochmal an.
in der Extention gibts neben Name, Strasse, ect.... auch ein Selectfeld mit KUNDENSTATUS.
Dort kann ich normal = 1 silber =2 .. u.s.w. auswählen. In der SQL steht dann in der Tabelle 1 oder 2 oder 3...... Also DB Tabelle = kundenstatus

Wenn ich jetzt aber den Wert 'kundenstatus' als Variable für mein Template Switch hernehmen möchte dann, muß ich bei der Abfrage ja diesen Wert auslesen.
Der Wert steht aber innerhalb der Templatedefinition nicht zur Verfügung, sondern nur innerhalb von getItems.
Als müßte ich jetzt sowohl die 'uid' als auch den 'kundenstaus' holen.
Deswegen meinte ich ja auch

$status = 'kundenstatus' der aktuellen'uid' von getItems

Kann man das zusammenführen?? Z.B

$status = t3lib_div::_GET('uid')'kundenstatus';

Aber egal mit welchen Klammern [ oder( oder{ und Komma ect. ich kriegs nicht hin
#angry#

ÁndreMansfeld ·

Also folgendes habe ich noch dazu herausgefunden.
(innerhalb der Templatefunktion) Danke an Desmond!!!

$kundenstatus = (t3lib_div::_GET('uid'));

schaltet wunderbar die Templates um........
Aber leider werden jetzt die Templates nach 'uid' umgeschaltet. o.O
Ist ja auch logisch, aber warum werden denn dann die Werte aus 'kundenstatus' nicht genommen???? Denn...

$kundenstatus = (t3lib_div::_GET('kundenstatus'));

geht nicht. Da passiert nichts... #angry#

Nochmal zurück zur Frage: Kann man die Abfrage nicht zusammenführen?
also erst die #uid'holen und -> dann den dazugehörigen Wert von 'kundenstatus'auslesen und übergeben?

lieben Gruß an alle die am WE arbeiten

😃 Andreas

Desmond ·

in was für einer Tabelle ist der Kundenstatus? in einer Extension Table?

dann kanst du ein typo3-Query machen:

$res =$GLOBALS['TYPO3_DB']->exec_SELECTquery('*', 'tx_meineextension_meintabelle', 'uid='.t3lib_div::_GET('uid'));
$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res):
$kundenstatus = $row['kundenstatus'];

Wenn der Kundenstatus in der tt_content Tabelle ist, kannst du so drauf zugreifen:

$kundenstatus = $this->cObj->data['kundenstatus'];

gruess

ÁndreMansfeld ·

Hallo Desmond,
Also der Kundenstatus ist in der gleichen Extension.
Ich habe meinen _pi Code in 2 Abschnitten. Einmal die Funktion getItems (dort wird definiert welche Daten ausgegeben werden (und zwar mit $row als AUSGABE) und einmal displaySingle (dort wird $row aufgerufen und abgearbeitet). In getItems gebe ich den Pfad zu meinem HTML Template an und innerhalb von displaySingle verweise ich auf die Subparts mit

$template = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE###");

Nun erhalte ich die gewünschte Ausgabe im richtigen SUB-Template.

Nun möchte ich aber, dass dieser Code dynamisch wird (je nach Kundenstatus ein anderes SUB-Template)
Also habe ich eine IF Funktion geschrieben. Diese heißt $dynamischestemplate
und die sieht so aus:

$kundenstatus = '1';
 		
 		if ($kundenstatus== 0){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_normal###");
     		 }else{
     		  if ($kundenstatus== 1){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_silber###");
     		 }else{
     		  if ($kundenstatus== 2){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_gold###");
     		 }else{
     		  if ($kundenstatus== 3){
      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_platin###");
     		 }
     		 }
     		 }     		 
     		 }

Das funktioniert auch wunderbar, weil ich jetzt in der ersten Zeile ja definiert habe, dass Kundenstatus = 1 ist. Wenn ich 2 schreibe, dann wird auch das 2te anzeigt u.s.w.
Also die IF Funktion greift (wenn auch nicht so schön programmiert siehe SWITCH 😉 )
Wenn ich jetzt $kundenstatus = '1' durch

$kundenstatus = t3lib_div::_GET('uid'));

ersetze werden die Templates auch getreu der 'uid' umgeschaltet, weil der WERT der UID hergenommen wird. HURRA.... Aber
hier möchte ich nicht 'uid' sondern den 'kundenstatus' auslesen. Und genau das geht nicht, denn:

t3lib_div::_GET('kundenstatus'));

liefert nichts zurück (bzw. es wird wie '0' behandelt).

Ich müßte diese Zeile dahingehend ändern, dass ich den Wert von Kundenstatus aus der aufgerufenen UID zurückliefern lasse.
Ich hoffe ich konnte mich verständlich ausdrücken #paralyzed#

Lieben Gruß Andreas

PS:das mit dem Query probiere ich noch, aber eigentlich ist das ja schon funktionstüchtig :-) ich müßte halt nur noch den Kundenstatus übergeben.

Meine Ausgabe in diesem Query sieht im Moment so aus:

$query = "SELECT * FROM tx_test_main";

		$res = mysql(TYPO3_db,$query);
		$out = array();
		while( $row = mysql_fetch_assoc($res) ){
		$out[]=$row;
		
		return $out;

(Klammern nicht mitkopiert) :-)

Desmond ·
ÁndreMansfeld schrieb

ich müßte halt nur noch den Kundenstatus übergeben.

Dann machs doch!

Ich würde aber den SQl-Query (welcher jetzt hardcoded ist) umschreiben zu einem TYPO3-Query.

ÁndreMansfeld ·

Das ist ja das.....
Hab ich schon am WE (nach deinem ersten Post) probiert.
Ich hab

$kundenstatus = $row['kundenstatus']

oder auch so

$kundenstatus = $row[0]['kundenstatus']

oder auch schon so

$kundenstatus = 'kundenstatus'

in den verschiedensten Zeilen innerhalb von

   1.$query = "SELECT * FROM tx_test_main";
   2.$res = mysql(TYPO3_db,$query);
   3.$out = array();
   4.while( $row = mysql_fetch_assoc($res) ){
   5.$out[]=$row;
   6.return $out;

eingefügt. TRY and ERROR

Und im displaySingle mit

$kundenstatus = (t3lib_div::_GET('kundenstatus'));

wieder aufgerufen.
Hat nicht geklappt. #angry#
In welche Zeile genau müßte ich denn das

$kundenstatus = $row['kundenstatus']

denn hinschreiben?
Und stimmt denn dann die Abfrage in displaySingle mit

$kundenstatus = (t3lib_div::_GET('kundenstatus'));

?
Sorry und Danke für deine Hilfe, aber ich glaub ich stehe gewaltig auf dem Schlauch.

Lieben Gruß Andreas

ÁndreMansfeld ·

So Danke an DESMOND!!!!!
Das dynamische wechseln des Templates (also um genau zu sein verschiedene Layoutversionen des Subparts eines Templates) funktioniert so:
Prinzipiell geben wir ja 2 Dinge mit auf die Reise.
1. welches HTML Template mit

$template = $this->templateCode = $this->cObj->fileResource("PFAD ZUM TEMPLATE");

2. welchen Subpart innerhalb des Templates

 $template = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_LISTE###");

Ich lasse mir jetzt den Subpart über eine IF Abfrage ausgeben und dafür definiere ich -> $dynamischestemplate:

$template = $dynamischestemplate;

und eine IF Funktion für den Wechsel. Dafür muß aber innerhalb der Extention auch eine Spalte (z.B. TEMPLATEDESIGN)in der SQL sein. Am besten eine INT Zahl.
Dort habe ich dann definiert wie die Templates angesteuert werden.
Normale Templateausgabe = 0 (bei mir im Beispiel ###TEMPLATE_DISPLAY_SINGLE_normal###)
Variation 1 = 1 (bei mir im Beispiel ###TEMPLATE_DISPLAY_SINGLE_silber###)
Variation 2 = 2 (bei mir im Beispiel ###TEMPLATE_DISPLAY_SINGLE_gold###)

u.s.w.

Dann hole ich mir diese Zahlen aus der SQL DB und verbinde sie mit der IF Abfrage.

$row = $this->getItems(t3lib_div::_GET('uid'));
$templatedesign = $row[0]['templatedesign'];

 		switch($templatedesign){
 		case 0:
 			$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_normal###");
 			break;
 		case 1:
      			$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_silber###");
     			break;
     		case 2:
	      		$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_gold###");
     			break;
     		case 3:
      			$dynamischestemplate = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_DISPLAY_SINGLE_platin###");
     			break;
     		 }

$template = $dynamischestemplate;

Jetzt nur noch die verschiedenen Designs in die HTML Vorlage und entsprechend benennen.
Mein Problem war, dass ich die IF Abfrage außerhalb von

$row = $this->getItems(t3lib_div::_GET('uid'));

gemacht hatte. Jetzt klappts...

Vielen Dank nochmal an Desmond