Zum Inhalt springen

Marker befüllen in eigener Extension

Erstellt am 23. Oktober 2009 · 5 Antworten · letzte Antwort am 29. Oktober 2009

Tags: Templates & Layouts, Frage

DAAfH ·

Hallo liebe Forum- und TYPO3-Gemeinde,

ich bin gerade dabei meine erste Extension selber zu schreiben! Was bis her auch danke einiger Tutorials und Codebeispielen gut klappte. Dennoch hänge ich seit 2 Tagen an einem Punkt fest an dem ich einfach nicht weiter weiss... leider finde icha uch nichts passendes im Forum oder bei Google.

Hier das Problem: Meine Marker werden im Template richtig mit den Ergebnissen aus dem SQL query befüllt!

Jetzt wollte ich das ganze noch einmal machen und dann eine verändertes Query abzusetzten.

function main($content, $conf) {
		$this->conf=$conf;
        		
		$this->pi_setPiVarDefaults();
		
		$content="";
			
	//Get the template definited by setup.txt
	$this->templateCode = $this->cObj->fileResource($conf['templateFile']);
	
	//Get the parts out of the template
	$template = array();
	$template['total'] = $this->cObj->getSubpart($this->templateCode,'###TEMPLATE###');
	$template['item'] = $this->cObj->getSubpart($template['total'],'###TEMPLATE_ITEM###');
	$template['item2'] = $this->cObj->getSubpart($template['total'],'###TEMPLATE_ITEM2###');
			
	//Fill Markers
	//ehemalige function getItem()
	$config['pid_list'] = trim($this->cObj->stdWrap($this->conf['pid_list'],$this->conf['pid_list.']));
	$config['pid_list'] = $config['pid_list'] ? implode(t3lib_div::intExplode(',',$config['pid_list']),',') : $GLOBALS['TSFE']->id;
	list($pid) = explode(',',$config['pid_list']);
	$query = 'SELECT * FROM  tx_medienliga_data WHERE pid IN ('.$pid.') ORDER BY sorting';
	$res = mysql_query($query); //geändert von $res = mysql(TYPO3_db,$query); <- alte schreibweise und wird in php5 nicht mehr unterstütz //TYPO3_db fällt weg da aktuelle db automatisch benutz wird
	$out=array();
		$i = 0;
	 	while($row = mysql_fetch_assoc($res)){
			$out[$i]=$row;
			$i++;
	 	}
		
	$rows = $out;
	
	for($i=0;$i<count($rows[$i]);$i++) this-="">conf['image.']['file'] = 'uploads/tx_medienliga/'.($rows[$i]['image']); //Pfad zum uploadsordner der EXT
			$theImgCode=$this->cObj->IMAGE($this->conf['image.']); //Speichert den Code Pfad zum Bild mit http:// etc. ; ohne diese Zeile würde nur uploads/tx_ext_key/etc. rauskommen
			
			//Position abfragen
			if ($rows[$i]['position'] = 8-) {
				$playersposition = 'Torwart';
			}
			if ($rows[$i]['position'] = 4) {
				$playersposition = 'Abwehr';
			}
			if ($rows[$i]['position'] = 2) {
				$playersposition = 'Mittelfeld';
			}
			if ($rows[$i]['position'] = 1) {
				$playersposition = 'Angriff';
			}
			
			//Marker mit den Werten aus der DB befüllen
			$markerArray['###FIRSTNAME###'] = $rows[$i]['firstname'];
			$markerArray['###LASTNAME###'] = $rows[$i]['lastname'];
			$markerArray['###IMAGE###'] = $theImgCode;
			$markerArray['###GOALS###'] = $rows[$i]['goal'];
			$markerArray['###POSITION###'] = $playersposition;

			$contentItem .= $this->cObj->substituteMarkerArrayCached($template['item'], $markerArray);

	}
	
	for($i=0;$i<count($rows[$i]);$i++) this-="">conf['image.']['file'] = 'uploads/tx_medienliga/'.($rows[$i]['image']); //Pfad zum uploadsordner der EXT
			$theImgCode=$this->cObj->IMAGE($this->conf['image.']); //Speichert den Code Pfad zum Bild mit http:// etc. ; ohne diese Zeile würde nur uploads/tx_ext_key/etc. rauskommen
			
			//Position abfragen
			if ($rows[$i]['position'] = 8-) {
				$playersposition = 'Torwart';
			}
			if ($rows[$i]['position'] = 4) {
				$playersposition = 'Abwehr';
			}
			if ($rows[$i]['position'] = 2) {
				$playersposition = 'Mittelfeld';
			}
			if ($rows[$i]['position'] = 1) {
				$playersposition = 'Angriff';
			}
			
			//Marker mit den Werten aus der DB befüllen
			$markerArray2['###FIRSTNAME2###'] = $rows[$i]['firstname'];
			$markerArray2['###LASTNAME2###'] = $rows[$i]['lastname'];
			$markerArray2['###IMAGE2###'] = $theImgCode;
			//$markerArray2['###GOALS2###'] = $rows[$i]['goal'];
			//$markerArray2['###POSITION2###'] = $playersposition;

			$contentItem2 .= $this->cObj->substituteMarkerArrayCached($template['item2'], $markerArray2);

	}
	
	//Finalize and create the content by replacing the 'content' marker in the template
	$subpartArray = array();
	$subpartArray['###TEMPLATE_ITEM###'] = $contentItem;
	
	$subpartArray2 = array();
	$subpartArray2['###TEMPLATE_ITEM2###'] = $contentItem2;
	
	$content = $this->cObj->substituteMarkerArrayCached($template['total'],$markerArray, $subpartArray,$markerArray2,$subpartArray2);
	
	return $content;
	}
}

Die Marker in TEMPLATE_ITEM werden richtig befüllt! Die Marker unter TEMPLATE_ITEM2 wird nur mit dem letzten Element aus dem Array befüllt!

		    <div id="slider1">
		        <ul id="slider1Content">
			       	
			            <li class="slider1Image">
			                <img src="uploads/tx_medienliga/Tamas_Hajnal.jpg" width="168" height="252" border="0" alt="" title="" />
			                <span class="left"><strong>Angriff</strong><p>Tore: </p><p>10</p></span>
						</li>
					
			            <li class="slider1Image">

			                <img src="uploads/tx_medienliga/Nuri_Sahin.jpg" width="168" height="252" border="0" alt="" title="" />
			                <span class="left"><strong>Angriff</strong><p>Tore: </p><p>10</p></span>
						</li>
					
			            <li class="slider1Image">
			                <img src="uploads/tx_medienliga/Markus_Feulner.jpg" width="168" height="252" border="0" alt="" title="" />
			                <span class="left"><strong>Angriff</strong><p>Tore: </p><p>10</p></span>

						</li>
					
					<div class="clear slider1Image"></div>
		        </ul>
		    </div>
			
			<div id="slider1">
		        <ul id="slider1Content">
					###TEMPLATE_ITEM2###
				            <li class="slider1Image">
				                <img src="uploads/tx_medienliga/Markus_Feulner.jpg" width="168" height="252" border="0" alt="" title="" />

				                <span class="left"><strong>###POSITION2###</strong><p>Tore: </p><p>###GOALS2###</p></span>
							</li>
					###TEMPLATE_ITEM2###
					<div class="clear slider1Image"></div>
		        </ul>
		    </div>
		</div>

Dazu wird der Marker ###TEMPLATE_ITEM2### als Klartext angezeigt... also irgendwie steh ich aufm Schlauch oder habe noch etwas falsch verstanden?!?!

Hoffe ihr könnt mir helfen 🙂

Gruß Oli

DAAfH ·

Update:

Ich habe nun herausgefunden, dass

$content = $this->cObj->substituteMarkerArrayCached($template['total'],$markerArray, $subpartArray,$markerArray2,$subpartArray2);

nicht geht da substituteMarkerArrayCached nur 3 Array erwartet .. also

$content = $this->cObj->substituteMarkerArrayCached($template['total'],$markerArray, $subpartArray,$wrapArray);

oder so ählich. Jemand eine Idee wie ich da ganze dann doch realisieren kann?

Gruß Oli

digedag ·

Also dein Code sieht ehrlich gesagt nicht danach aus, als ob du viele Tutorials gelesen hast. Wenn du für TYPO3 programmierst, dann solltest du auch die API nutzen. Das fängt schon bei der Datenbankabfrage an. Warum verwendest du nicht $GLOBALS['TYPO3_DB']?

Und wenn du Probleme mit der Anwendung von TYPO3 Funktionen hast, dann ist ein Blick in die API-Doc meistens ganz hilfreich. 😉

Und die Schleife in deinem Code scheint einer sehr seltsamen Bedingung zu folgen:

for($i=0;$i<count($rows[$i]);$i++)

Vermutlich willst du eher das hier:

for($i=0;$i<count($rows);$i++)

Und damit nicht in jedem Schleifendurchlauf wieder gezählt wird, solltest du es so schreiben:

for($i=0, $cnt=count($rows);$i<$cnt;$i++)

Eventuell behebt das ja dein eigentliches Problem...

Warum legst du die Ergebnisse der DB-Abfrage eigentlich erst in die Variable $out, nur um sie dann der Variablen $rows zuzuweisen? Das kannst du doch auch gleich so machen:

$rows=array();
while($row = mysql_fetch_assoc($res)){
  $rows[]=$row;
}
DAAfH ·

Hallo digedag,

danke erst mal für deine Antwort 🙂

Deine Vorschläge beziehen sich alle auf meine PHP-Kenntnisse und ich bin dir auch sehr dankbar für die Verbesserungsvorschläge ! Habe sie auch alle verwendet und werden probieren in Zukunft da besser aufzupassen! Nichts des do trotz löst es nicht mein TYPO3 Problem mit dem substituteMarkerArrayCached. Denn auch mit deinen Vorschlägen ändert sich nichts an der Ausgabe da mein PHP Code zwar umständlicher war aber nicht falsch.

Das Tutorial an das ich mich hiel lautete Own Extension with HTML-Template und da kam nichts vor aus der TYPO3-API in Hinsicht auf die DB.

Werd mir das Ganze aber mal zu gemüte führen!