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