Mit Content_Dump eine interne Verlinkung auf Tag-Basis aufbauen
Posted: Sat Dec 12, 2009 12:33 am
Hallo zusammen,
wollte letztens bei einem Projekt eine Tag basierte Verlinkung innerhalb einer Site umsetzen. Der Content ist als normaler Seitencontent ohne Module angelegt worden. Von der Anzahl sind es recht viele Artikel und ich wollte die Artikel thematisch verknüpfen. Sprich, wenn ein Artikel den Tag "world" hat, soll dieser Tag auf eine Seite verlinken, auf der alle Artikel mit dem Tag "world" zu finden sind.
Da es hier im Forum gerade ein ähnliches Problem auf News-Modul Basis gibt, wollte ich mal meine Lösung auf regulärer Content-Basis vorstellen. Die Code-Beispiele sind sehr runtergedampft auf das Wesentliche. Bei Fragen einfach unten posten.
Hierfür habe ich Content_Dump mit einer Prise Smarty und htaccess verwendet. Allerdings muss man hierfür den Content-Props-Table in der DB um einen Fulltext-Index erweitern. Das ist per se nicht weiter wild, man sollte aber wissen was man da tut
. Ich glaube es müsste auch ohne gehen, performanter ist es aber mit Index
Wenn man dies dann getan hast, können mit CD Beiträge nach bestimmten Inhalten gefiltert werden. Allerdings kann CD nur auf den regulären Seitencontent zugreifen. Ein Zugriff auf andere Module ist nicht möglich. Solange man nur kurze Content-Blöcke mit wenig Inhalt (z.B. Tags) durchsuchst, ist das noch OK von der Geschwindigkeit (hängt natürlich auch von der Konfiguration des Servers ab), als richtige Suche im ganzen Content würde ich dann doch lieber ne richtige Suche verwenden.
Nehmen wir an, die tags pflege ich in einem eigenen Content-Block:
{content block="tags" wysiwyg="false" oneline="true" assign="tags"}
Dabei ist es egal ob "world" als einzelnes Wort in diesem Block steht oder ein Wort von mehreren ist. So kann man z.B. mehrere Tags einem Artikel zuordnen.
Aufbau der Tags als Links:
Mit ein wenig smarty drum herum,wird die Ausgabe des Blocks gleich automatisch verlinkt. Dazu brauchen wir aber noch ein kleines UDT zum erzeugen der Tag-Links:
Name: tag_maker
Der Einbau im Template sähe dann so aus:
Template
heraus kommt dann eine Liste mit Links - damit erzeugt man gleich ne "vertaggte" Liste mit Begriffen zu jedem Artikel. Nehmen wir an es sind die Begriffe "lorem ipsum hello world" als String in der Content-Box gegeben. Dann erhält man folgende Links zurück
erzeugte URL
Übersichtsseite:
Um jetzt ne schicke Übersichtsseite zu erzeugen, auf der alle Artikel mit einem bestimmten Tag angezeigt werden, muss die URL wieder aufgelöst werden, damit wir den Begriff als Parameter übergeben können:
htaccess:
Wenn auf dem Webserver jetzt die URL http://example.com/tags/hello aufgerufen wird, wird sie als http://example.com/index.php?page=tags&tag=hello verarbeitet.
Jetzt wird's spannend. Um die Übersicht zu erzeugen, müssen wir diesen Parameter ("tag=") jetzt annehmen. Das geht recht simple mit etwas Smarty (vorher aber noch eine Seite mit dem Alias "tags" anlegen - Smarty hier rein):
Smarty für Get-Parameter
Und den mit Smarty abgegriffenen Wert übergibt man jetzt an Content_Dump.
{content_dump filter=$tag blockname="tags"}

Alles klar?
Zusammenfassung
1) UDT erstellen damit man die interne Verlinkung erzeugen kann
siehe oben
2) UDT im Artikel-Template einbauen
3) htaccess anpassen damit die URLs korrekt aufgelöst werden
siehe oben
4) Übersichts template erstellen
Je nach Lust und Laune kann man dann dieses Rahmengerüst den eigenen Wünschen anpassen.
Beste Grüße
Nils
wollte letztens bei einem Projekt eine Tag basierte Verlinkung innerhalb einer Site umsetzen. Der Content ist als normaler Seitencontent ohne Module angelegt worden. Von der Anzahl sind es recht viele Artikel und ich wollte die Artikel thematisch verknüpfen. Sprich, wenn ein Artikel den Tag "world" hat, soll dieser Tag auf eine Seite verlinken, auf der alle Artikel mit dem Tag "world" zu finden sind.
Da es hier im Forum gerade ein ähnliches Problem auf News-Modul Basis gibt, wollte ich mal meine Lösung auf regulärer Content-Basis vorstellen. Die Code-Beispiele sind sehr runtergedampft auf das Wesentliche. Bei Fragen einfach unten posten.
Hierfür habe ich Content_Dump mit einer Prise Smarty und htaccess verwendet. Allerdings muss man hierfür den Content-Props-Table in der DB um einen Fulltext-Index erweitern. Das ist per se nicht weiter wild, man sollte aber wissen was man da tut

Wenn man dies dann getan hast, können mit CD Beiträge nach bestimmten Inhalten gefiltert werden. Allerdings kann CD nur auf den regulären Seitencontent zugreifen. Ein Zugriff auf andere Module ist nicht möglich. Solange man nur kurze Content-Blöcke mit wenig Inhalt (z.B. Tags) durchsuchst, ist das noch OK von der Geschwindigkeit (hängt natürlich auch von der Konfiguration des Servers ab), als richtige Suche im ganzen Content würde ich dann doch lieber ne richtige Suche verwenden.
Nehmen wir an, die tags pflege ich in einem eigenen Content-Block:
{content block="tags" wysiwyg="false" oneline="true" assign="tags"}
Dabei ist es egal ob "world" als einzelnes Wort in diesem Block steht oder ein Wort von mehreren ist. So kann man z.B. mehrere Tags einem Artikel zuordnen.
Aufbau der Tags als Links:
Mit ein wenig smarty drum herum,wird die Ausgabe des Blocks gleich automatisch verlinkt. Dazu brauchen wir aber noch ein kleines UDT zum erzeugen der Tag-Links:
Name: tag_maker
Code: Select all
if ($params['content_tags'] != '') {
// explode at space
$links = explode(" ",$params['content_tags']);
// count elements
$counter = count($links)-1;
// walk through all elements
for ($i=0; $i<=$counter; $i++) {
echo = "<a href='http://example.com/tags/$links[$i]/'>$links[$i]</a> ";
}
} else {
$echo = 'this article has no tags';
}
Template
Code: Select all
{content block="tags" wysiwyg="false" oneline="true" assign="tags"}
{tag_maker content_tags=$tags}
erzeugte URL
Code: Select all
http://example.com/tags/lorem
http://example.com/tags/ipsum
http://example.com/tags/hello
http://example.com/tags/world
Um jetzt ne schicke Übersichtsseite zu erzeugen, auf der alle Artikel mit einem bestimmten Tag angezeigt werden, muss die URL wieder aufgelöst werden, damit wir den Begriff als Parameter übergeben können:
htaccess:
Code: Select all
RewriteCond %{REQUEST_URI} ^/tags
RewriteRule ^([^/]*)/([^/]*) index.php?page=$1&tag=$2 [QSA,L]
Jetzt wird's spannend. Um die Übersicht zu erzeugen, müssen wir diesen Parameter ("tag=") jetzt annehmen. Das geht recht simple mit etwas Smarty (vorher aber noch eine Seite mit dem Alias "tags" anlegen - Smarty hier rein):
Smarty für Get-Parameter
Code: Select all
{if isset($smarty.get.tag)}
{assign var=tag value=$smarty.get.tag}
{else}
{assign var=tag value='default'}
{/if}
{content_dump filter=$tag blockname="tags"}

Alles klar?
Zusammenfassung
1) UDT erstellen damit man die interne Verlinkung erzeugen kann
siehe oben
2) UDT im Artikel-Template einbauen
Code: Select all
<__html>
...
<h1>{title}</h1>
<div id="tags">
This article has the following tags:
{content block="tags" wysiwyg="false" oneline="true" assign="tags"}
{tag_maker content_tags=$tags}
</div>
<div id="mainContent">
{content}
</div>
...
</__html>
siehe oben
4) Übersichts template erstellen
Code: Select all
<__html>
...
{if isset($smarty.get.tag)}
{assign var=tag value=$smarty.get.tag}
{else}
{assign var=tag value='default'}
{/if}
<h1>View articles being tagged "{$tag}"</h1>
{content_dump block_name="tags" filter=$tag}
<ul>
{foreach from=$dump item=item}
<li>{cms_selflink page=$item->content->alias}</li>
{/foreach}
</ul>
...
</__html>
Beste Grüße
Nils