Zum Inhalt springen

Extension schreiben: Übung

Erstellt am 19. November 2010 · 4 Antworten · letzte Antwort am 6. Dezember 2010

Tags: PHP, Frage

JakobRa ·

Hallo,
ich versuche gerade eine kleine Extension zu schreiben um ein bisschen Übung zu bekommen.

Dazu habe ich mir eine DB Tabelle mit den Feldern 'title', 'kat' und 'inhalt' angelegt.
Nun versuche ich die Felder 'title' und 'kat' auszulesen und nach Kategorien(kat) geordnet als Link auszugeben.

Der Link soll mir, wenn ich mal soweit bin 🙂, einfach das passende 'inhalt' Feld in einer Box neben dem Menü ausgeben.

Das ganze soll später mal so aussehen:
Kategorie: Kategorie 1
<link>Title 1 von Kategorie 1</link>
<link>Title 2 von Kategorie 1</link>

Das habe ich bis jetzt geschrieben:

...
function main($content, $conf) {
		$this->conf = $conf;
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL();
		
		$this->id=$GLOBALS['TSFE']->id;
		$this->template=$this->cObj->fileResource('EXT:tp_test/template.html');
	
		//Menü erstellen
		$content .= $this->menu();
		
		return $this->pi_wrapInBaseClass($content);
	}
	
	function menu()
	{
		$menu = $this->cObj->getSubpart($this->template,'###MENU###');
		$sub = $this->cObj->getSubpart($menu,'###KAT###');
		
		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('title,kat','mytest');
		
		if($res)
		{
			$list = '';
			while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
			{
				$markerArray['###LINK###'] = $this->pi_list_linkSingle($row['title']);
				$list .= $this->cObj->substituteMarkerArrayCached($sub,$markerArray);
			}
			$subpartArray['###KAT###'] = $list;
			
		}
		else
			return $this->cObj->substituteMarkerArrayCached($menu,$markerArray,$subpartArray,array());
	}
...

Die template.html sieht so aus:

...
<body>
<!-- ###MENU### begin -->
<h2>Menü</h2>
<!-- ###KAT### begin -->
<ul>
<li>###LINK###</li>
</ul>
<!-- ###KAT### end -->
<!-- ###MENU### end -->
</body>
...

Leider funktioniert das jetzt schon nicht. Deshalb wollte ich euch um Hilfe bitten.

Wäre schön wenn ihr mir ein bisschen weiterhelfen könntet.

Viele Grüße,
Jakob

vince ·

Servus,

function menu()
	{
		$menu = $this->cObj->getSubpart($this->template,'###MENU###');
		$sub = $this->cObj->getSubpart($menu,'###KAT###');
 
		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('title,kat','mytest');
 
		if($res)
		{
			$list = '';
			while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
			{
				$markerArray['###LINK###'] = $this->pi_list_linkSingle($row['title']);
				$list .= $this->cObj->substituteMarkerArrayCached($sub,$markerArray);
			}
			$subpartArray['###KAT###'] = $list;
 
		}
		else
	return $this->cObj->substituteMarkerArrayCached($menu,$markerArray,$subpartArray,array());
	}

Ich würd sagen das "else" stört ein wenig. Einfach mal weglassen....

sonst gibt die Methode menu() ja nur dann was zurück, wenn die Query nicht geklappt hat, sprich wenn if($res) false zurückgibt. Bei true werden zwar die Marker gefüllt (das sieht auch alles ganz prima aus), aber nix wird zurückgegeben.

Ein anderen Fehler kann ich grad nicht erkennen...

Ach ja: die Abfrage ist so glaub ich so besser:

 $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('title,kat','mytest','','','','');

(obwohl das andere von Dir auch klappen müsste)

Gruß,

Vince.

JakobRa ·

Hey Vince,
danke dir für die schnelle Antwort! 🙂
Habe den Code ausgebessert, er zeigt mir jetzt eine Liste mit Links an.

Habe zusätzlich noch mein Template ein wenig verändert.
So das er nicht jeden Link in ein eigenes <ul> steckt sondern alle in eins.

Der Code jetzt:

function menu()
{
	$menu = $this->cObj->getSubpart($this->template,'###MENU###');
	$sub = $this->cObj->getSubpart($menu,'###KAT###');
	$sub_item = $this->cObj->getSubpart($sub,'###KAT_ITEM###');
 
	$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
		'title,kat','mytest','','','','');
 
	if($res)
	{
		$list = '';
		while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
		{
			$markerArray['###LINK###'] = $this->pi_list_linkSingle($row['title']);
			$list .= $this->cObj->substituteMarkerArrayCached($sub_item,$markerArray);
		}
			$subpartArray['###KAT_ITEM###'] = $list;
 
	return $this->cObj->substituteMarkerArrayCached($menu,$markerArray,$subpartArray,array());
	}
}

Das geänderte Template:

...
<body>
<!-- ###MENU### begin -->
<h2>Menü</h2>
<!-- ###KAT### begin -->
<ul>
<!-- ###KAT_ITEM### begin -->
<li>###LINK###</li>
<!-- ###KAT_ITEM### end -->
</ul>
<!-- ###KAT### end -->
<!-- ###MENU### end -->
</body>
...

Jetzt mach ich mich an den nächsten Schritt, das sortieren der Links nach Kategorien.

Würde mich über Tipps freuen, habe nämlich gerade keine Idee wie ich das machen könnte. 🙂

Viele Grüße,
Jakob

vince ·

Hallo,

Sortieren kannst du die Ausgabe direkt in der Query.

z.B.

SELECT titel,kat FROM mytest ORDER BY kat

bzw. in der Extension:

$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
		'title,kat','mytest','','','kat','');

die Methode hat ja folgende 6 Parameter:
select, from, where, group by, order by, limit

Andere Möglichkeit:

Du ließt zuerst alle kategorien aus mit
SELECT distinct kat FROM mytest

und dann für jede einzelne Kategorie die Einträge

Gruß,

Vince.

JakobRa ·

Hey,
danke Vince! =)

So sieht das ganze jetzt aus:

function menu()
{
	$menu = $this->cObj->getSubpart($this->template,'###MENU###');
	$sub = $this->cObj->getSubpart($menu,'###KAT###');
	$sub_item = $this->cObj->getSubpart($sub,'###KAT_ITEM###');
 
	$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
		'title,kat','mytest','','','kat','');
 
	if($res)
	{
		$list = '';
		while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
		{
                        if($kat != $row['kat']) {
                            $kat = $row['kat'];
                            $markerArrayKatTitle['###KATTITLE###'] = $row['kat'];
                            $list .= $this->cObj->substituteMarkerArrayCached($sub,$markerArrayKatTitle);
                        }

			$markerArray['###LINK###'] = $this->pi_list_linkSingle($row['title']);
			$list .= $this->cObj->substituteMarkerArrayCached($sub_item,$markerArray);
		}
	        $subpartArray['###KAT###'] = $list;
 
	        return $this->cObj->substituteMarkerArrayCached($menu,$markerArray,$subpartArray,array());
	}
}

das Template:

...
<body>
<!-- ###MENU### begin -->
<h1>Menü</h1>
<!-- ###KAT### begin -->
<h2>###KATTITLE###</h2>
<ul>
<!-- ###KAT_ITEM### begin -->
<li>###LINK###</li>
<!-- ###KAT_ITEM### end -->
</ul>
<!-- ###KAT### end -->
<!-- ###MENU### end -->
</body>
...

Die Ausgabe sieht so aus:

Menü

Test 1

-###LINK###

-Seite 1 : Test 1
-Seite 2 : Test 1

Test 2

-###LINK###

-Seite 4 : Test 2
-Seite 10 : Test 2

Wo ist mein Fehler, was könnte ich verbessern?

Das nächste woran ich arbeiten möchte ist:
Wenn ich auf einen Link klicke soll neben dem Menü der Text(liegt im gleichen Datensatz in der DB), angezeigt werden.

Vllt. kann mir dazu jemand einen kleinen Tipp geben. =)

Liebe Grüße,
Jakob