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
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.
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
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.
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