XF1.x xF 1.5.x - (m)ein XF-Lexikon im Eigenbau...

otto

Die 5k-Labertasche
Lizenzinhaber
Registriert
11. Dez. 2010
Beiträge
5.180
Punkte
448
XF Version
  1. 2.2.15
XF Instanz
Hosting
PHP-Version
8.2.x
MySQL/MariaDB
10.3.x
Provider/Hoster
Strato/Hetzner
Mangels Alternativen und dank gebrochener Zusagen ... nun, selbst ist der Mann - also ran an eine Lösung.

Ausgangssituation:
Wir haben ehemals das Hobby-Gartenteich.de mit phpBB2plus betrieben, mit einem Lexikon Add-on das wir beim späteren Umstieg auf vBulletin 3.5 per Hand! in das vBLexikon Add-onvon Vossi importieren (besser abtippen) mussten.
Damals nur rund 1.000 Einträge wurden daraus bis zum bisher letzten Umstieg auf xenForo runde 1.800 Einträge und diese müssen wir nun (ihr ahnt es) wieder von Hand in das xenforo herüber retten.
Unser Mod-Team ist begeistert... ;) aber fässt abermals kräftig mit an. Schön ist anders und nichts ist so sicher wie der Wandel.​

Fragestellung:
Wie ein Lexikon aufbauen, in dem die Daten zumindest recht sicher gespeichert werden ohne dabei auf ein Add-on angewiesen zu sein? Und das alles low budget versteht sich ...​

Lösung:
Hauptziel - verzicht auf ein spezielles Lexikon Add-on! Zum Speichern der Einträge nutzen wir ausschließlich Themen und Attachments, denn diese sind bei Importern im Ernstfall Standard und können automatisch in eine andere Forensoftware übernommen werden.

Optik und Usebility - hier kann man gefahrlos auf Add-ons oder eigenen Code setzen - denn wenn es da mal zu Problemen kommt sind zumindest die Daten des Lexikon sicher.
Die Add-ons die wir brauchen, gibt es bisher noch in jedem Forensystem.​

Das xenForo bringt einige benötigte Komponenten für das Lexikon bereits mit:
- alphabetischen Sortierung der Themen
- Beitrags Historie

Zunächst legt man seine Lexikonstrucktur aus Kategorien und Foren an wie man es auch mit den Foren bereits getan hat.
Also zB.:
- Kategorie Lexikon
---- Forum 1
---- Unterkategorie 1
------- Forum 2
------- Forum 3
--- Unterkategorie 2
------- Forum 4
------- Forum 5
------- Forum 6
... eben wie wir es bei unserem Lexikon benötigen.
Da wir dadurch unter Umständen viele Foren mit identischen Rechten/Einstellungen benötigten könnten, bietet sich ein kleines kostenloses Add-on an was uns diese Arbeit etwas erleichtert:
- Icewind Clone Node aktuell Version 1.0.1 (Stand August 2014)
Damit kann man die benötigten Foren und Kategorien sehr flott anlegen, in dem man einmal angelegte und eingerichtete einfach kopiert so oft man möchte.​

Nun wäre es schön, wenn das erste Attachment eines Lexikoneintrages automatisch als Thumbnail in der Liste der Einträge zu sehen wäre:
lexikon_selfmade_10.jpg

Dazu können wir ein weiteres beliebtes kostenloses Add-on installieren:
- Thumbnails by Waindigo aktuell Version 2.0.2 (Stand August 2014)

Damit auch die Kategorien unseres Lexikon nicht so trostlos aussehen wollen wir vor jeder Kategorie ein Icon was deren Inhalt symbolisiert.
Dazu brauchen wir kein Add-on - das geht recht einfach über die EXTRA.CSS .
Dabei verwenden wir diesen Code, den wir für jede Kategorie in die Extra.css kopieren und anpassen:
PHP:
/*Kategorie 1 Icon */
.node.node_XX .forumNodeInfo .nodeIcon, .node.node_XX .categoryForumNodeInfo .nodeIcon {
    background-image: url("data/images/nodes/kategorie_01.png");
    background-position: 0px 0px;
    opacity: 1.0;
}
XX ist mit der ID der entsprechenden Kategorie zu ersetzen und der Pfad zum Icon "lexikon_pflanzen.jpg" muss angepasst werden.​

Damit wäre ein einfaches Lexikon bereits erstellt. Wir können es aber jederzeit weiter verfeinern... :)

Ein sehr wichtiger Punkt ist mit unter ein Eingabeformular um die Einträge in das Lexikon einheitlich gestalten zu können auch wenn es später mehrere Autoren gibt.
Wir brauchen ein Formular Add-on, wobei dieses:
- LiquidPro Simple Forms aktuell Version 2.1.2 (Stand August 2014)
eine sehr gute Wahl darstellt und mit 25$ bezahlbar ist.
Damit sind viele auch unterschiedlichste Formulare möglich, sowie - jeweils ein "Neuer Eintrag" Button in den Lexikon Kategorien. Der "Neues Thema" Button wird dabei einfach ersetzt.
Die Ausgabe des Formulars kann mittels der Standard BBcodes aber auch mit HTML nahezu frei angepasst werden.​

Man kann nun neue Einträge erstellen, die - wenn ein Bild hochgeladen wurde auch automatisch ein Vorschaubild anlegen. Wir sortieren alphabetisch und haben eine Historie um Versionen der Einträge zu vergleichen. Und wir haben eine Eingabemaske für das einheitliche Bild.

Was stört sind nun die Signaturen der Autoren. Zumindest in einem Lexikon brauch man das nicht - also weg damit. Dabei hilft uns:
- IwDRP Forum Signature Control 1.0
Womit wir für jedes Forum einzeln entscheiden können, ob Signaturen angezeigt werden oder nicht. Also im Lexikon ausschalten, im rest des Forum bleiben sie bestehen.

Das Lexikon sollte nun auch als Tab im oberen Menü zu finden sein und die Kategorien als Sub-Tabs darunter - dabei hilft das bekannte:
- Nodes As Tabs 1.2.2
Wir legen damit unsere Menüstruktur fest um den Benutzern schnellen Zugriff zu bieten.

In unserem speziellen Fall wo wir nun viele Einträge aus einem alten bestehenden Lexikon übernehmen mussten (per copy and paste!) kam noch ein Problemchen hinzu - der neue Eintrag Autor war nicht mehr der originale. Das ist schlecht, aber lösbar:
- Change Author 1.4
Damit kann man jedem Administrator das Recht geben, den Autor eines Beitrages zu ändern. Schön. :)

Das bisherige Ergebnis dieser Tour sieht nun so aus und ist wie man sieht natürlich noch nicht fertig - wir importieren zur Zeit die alten Einträge... ;)

lexikon_01.jpg lexikon_02.jpg lexikon_03.jpg lexikon_04.jpg lexikon_05.jpg

Bilder von den Formularen folgen bei Interesse...

Was noch fehlt:
- Suche begrenzt auf Forum UND Unterforen als Standard wenn man im Lexikon ist
- Crosslinking - Thementitel der Einträge in den Themen/Beiträgen des "Restforum's" automatisch verlinken

Wenn da jemand hilfreiche Tipps hätte - wäre schön.


Wie man sieht kann man mit relativ überschaubarem Aufwand ein Lexikon im xenforo schaffen, das im Ernstfall auch einen Wechsel der Forensoftware überstehen würde, was die Inhalte anbelangt ohne völlig auf Lexikon Funktionalität verzichten zu müssen. ;)

Für weitere Vorschläge oder auch Kritik bin ich offen. :)
 
Zuletzt bearbeitet:
Könntest dir überlegen ob du nicht die "Daten" in eine Tabelle packst.
 
geht leider nicht... :(

das vblexikon hatte im nach hinein eine recht blöde Art die Daten zu speichern. Der reine Text - ja. Aber die Formulardaten wurden anderweitig in der alten DB abgespeichert - da haben wir sie schneller so kopiert. ;)
 
Vielleicht erweitert WMTech sein Addon Link Essentials um Support für Themen Verlinkung (Lexikon Style)
 
So was habe ich auch gesucht. Deine Idee ist hervoragend.
Gibt es was neues bezüglich WMTech?
 
WMTech hat gesagt das es wohl ein anderes Addon sein müsste, schade eigentlich.
 
Ja - ich denke mal es müsste ja auch so programmiert sein, das es nicht das ganze Forum völlig ausbremst. Da steckt wohl einiges an Arbeit dahinter, aber ich muss sagen das Lexikon im Bausatz ist dennoch eine feine Sache und vor allem Upgrade-sicher! ;)

Falls es da Fragen gibt - ich würde mich gern zu dem Thema (Lexikon-Bausatz) austauschen. :)
 
Hallo,

ich hab mal wieder ein Stück am Lexikon weiter optimiert. Da wir für das Lexikon ja die Forenstruktur des xenforo verwenden, wird im Lexikon auch einiges angezeigt, was dort eigentlich nutzlos ist. Also weg damit... :D

Templates: thread_list und thread_list_item

Es gilt den Kopf der Themen Listen Tabelle zu entschlacken - aber nur in den Lexikon "Foren". Verzichten kann man auf die Anzahl der Antworten, da es keine gibt - es wird ja immer der erste Beitrag editiert, der Lexikon Eintrag also. Weiterhin überflüssig, die Anzeige des Autors des letzten Beitrages - auch hier: weil keine Antworten auf Einträge vorgesehen - überflüssig.

Hier nun die Änderungen mittels xenforo TMS:

Template: thread_list
Schlüssel der Anpassungen: lexikon_thread_list
Beschreibung: Anpassungen für Lexikon in der Themenliste der Lexikon Foren (ID's)

Suche:
PHP:
<dd class="stats">
            <a href="{xen:link forums, $forum, '_params={$orderParams.reply_count}'}" class="major"><span>{xen:phrase replies}{xen:helper sortArrow, $order, $orderDirection, reply_count}</span></a>
            <a href="{xen:link forums, $forum, '_params={$orderParams.view_count}'}" class="minor"><span>{xen:phrase views}{xen:helper sortArrow, $order, $orderDirection, view_count}</span></a>
        </dd>
        <dd class="lastPost"><a href="{xen:link forums, $forum, '_params={$orderParams.last_post_date}'}"><span>{xen:phrase last_message}{xen:helper sortArrow, $order, $orderDirection, last_post_date}</span></a></dd>

Ersetze:
PHP:
<!-- JW start thread list header edit in lexikon nodes  -->
        <xen:if is="in_array({$forum.node_id}, array(1, 2, 3, 4))">
        <dd class="lastPost"><center>
            <a href="{xen:link forums, $forum, '_params={$orderParams.view_count}'}" class="minor"><span>{xen:phrase views}{xen:helper sortArrow, $order, $orderDirection, view_count}</span></a>
        </center></dd>
        <xen:else />
        <dd class="stats">
            <a href="{xen:link forums, $forum, '_params={$orderParams.reply_count}'}" class="major"><span>{xen:phrase replies}{xen:helper sortArrow, $order, $orderDirection, reply_count}</span></a>
            <a href="{xen:link forums, $forum, '_params={$orderParams.view_count}'}" class="minor"><span>{xen:phrase views}{xen:helper sortArrow, $order, $orderDirection, view_count}</span></a>
        </dd>
        <dd class="lastPost">
            <a href="{xen:link forums, $forum, '_params={$orderParams.last_post_date}'}"><span>{xen:phrase last_message}{xen:helper sortArrow, $order, $orderDirection, last_post_date}</span></a>
        </dd>
        </xen:if>
<!-- JW end thread list header edit in lexikon nodes -->
Wobei
PHP:
<xen:if is="in_array({$forum.node_id}, array(1, 2, 3, 4))">
"1, 2, 3, 4" durch deine Foren ID's der Lexikon Foren ersetzt werden muss.


Template: thread_list_item
Schlüssel der Anpassungen: lexikon_thread_list_item
Beschreibung: Anpassungen für Lexikon in der Themenliste der Lexikon Foren (ID's)

Suche:
PHP:
<div class="listBlock stats pairsJustified" title="{xen:phrase members_who_liked_first_message}: {xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.first_post_likes}}">
       <dl class="major"><dt>{xen:phrase replies}:</dt> <dd>{xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.reply_count}}</dd></dl>
       <dl class="minor"><dt>{xen:phrase views}:</dt> <dd>{xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.view_count}}</dd></dl>
   </div>

   <div class="listBlock lastPost">
     <xen:if is="{$thread.isRedirect}">
       <div class="lastPostInfo">{xen:phrase n_a}</div>
     <xen:else />
       <dl class="lastPostInfo">
         <dt><xen:if is="{xen:helper isIgnored, $thread.last_post_user_id}">{xen:phrase ignored_member}<xen:else /><xen:username user="$thread.lastPostInfo" /></xen:if></dt>
         <dd class="muted"><a{xen:if '{$visitor.user_id}', ' href="{xen:link posts, $thread.lastPostInfo}" title="{xen:phrase go_to_last_message}"'} class="dateTime"><xen:datetime time="$thread.lastPostInfo.post_date" /></a></dd>
       </dl>
     </xen:if>
   </div>

Ersetze:
PHP:
<!-- JW start thread list item edit in lexikon -->
<xen:if is="in_array({$forum.node_id}, array(1, 2 , 3, 4))">
   <div class="listBlock lastPost" title="{xen:phrase members_who_liked_first_message}: {xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.first_post_likes}}">
       <dl class="major"><center>{xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.view_count}}</center></dl>
   </div>
<xen:else />
   <div class="listBlock stats pairsJustified" title="{xen:phrase members_who_liked_first_message}: {xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.first_post_likes}}">
       <dl class="major"><dt>{xen:phrase replies}:</dt> <dd>{xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.reply_count}}</dd></dl>
       <dl class="minor"><dt>{xen:phrase views}:</dt> <dd>{xen:if $thread.isRedirect, '&ndash;', {xen:number $thread.view_count}}</dd></dl>
   </div>

   <div class="listBlock lastPost">
     <xen:if is="{$thread.isRedirect}">
       <div class="lastPostInfo">{xen:phrase n_a}</div>
     <xen:else />
       <dl class="lastPostInfo">
         <dt><xen:if is="{xen:helper isIgnored, $thread.last_post_user_id}">{xen:phrase ignored_member}<xen:else /><xen:username user="$thread.lastPostInfo" /></xen:if></dt>
         <dd class="muted"><a{xen:if '{$visitor.user_id}', ' href="{xen:link posts, $thread.lastPostInfo}" title="{xen:phrase go_to_last_message}"'} class="dateTime"><xen:datetime time="$thread.lastPostInfo.post_date" /></a></dd>
       </dl>
     </xen:if>
   </div>
</xen:if>
<!-- JW end thread list item edit in lexikon -->
Wobei auch hier wieder:
PHP:
<xen:if is="in_array({$forum.node_id}, array(1, 2, 3, 4))">
"1, 2, 3, 4" durch deine Foren ID's der Lexikon Foren ersetzt werden muss, die auch schon zuvor im thread_list Template angegeben wurden.


Ergebnis:
Vorher:
lexikon_01.png

Nachher:
lexikon_02.png

Funktioniert so im xenforo 1.3.0 mit Standard Style. Schöne Feiertage... :)
 
Sehr schöne Arbeit, Otto.

Ich wollte mir das Lexikon gerade einmal ansehen, die Themen selbst sind aber nur für registrierte Mitglieder sichtbar.
Warum macht ihr das? Das ist doch erstklassiger Suchmaschinen-Content. ;)
 
@Heffalump
Weil google gern den Text haben könnte, aber eben nicht die Attachments. Und da hat das xenfor halt leider Defizite. ;)

@Maestro2k5
Müsstest mal dein Template posten, meine Anpassungen sollten mit dem Standardstyle problemlos funktionieren. Auf Drittanbieter Styles kann ich nur bedingt eingehen - da muss man selber ran und anpassen. Sorry.
 
Weist do wo du Änderungen machen musstest? Ich habs noch auf 1.3.0 laufen - glaub aber nicht das es da wirklich Änderungen gab - seltsam.

Auf jeden Fall wird es noch weitere Optimierungen geben und Feedback ist immer gut. :D ;)
 
@Maestro2k5 Hast du mal geschaut ob ein AddOn schon Änderungen an dem Template vorgenommen hat? Oder aber du zuviel Zeichen beim Replace genommen hast?
 
Gesagt getan - heut hab ich mir mal fix die Suche vorgenommen, wir wollen schließlich das die Benutzer wenn sie im Lexikon sind auch dort einfach suchen können. Dazu muss nur ein Template per TMS angepasst werden:

Xenforo 1.3.0 Standard Style - xenforo TMS System

Template: search_bar_forum_only
Schlüssel der Anpassungen: lexikon_suchoptionen
Beschreibung: Anpassungen für die Suche im gesamten Lexikon (ID's)

Art der Anpassung: Einfaches ersetzen

Suche:
PHP:
<label title="{xen:phrase search_only_x, 'title={$forum.title}'}"><input type="checkbox" name="nodes[]" value="{$forum.node_id}"
    id="search_bar_nodes" class="Disabler AutoChecker" checked="checked"
    data-uncheck="#search_bar_thread" /> {xen:phrase search_this_forum_only}</label>
    <ul id="search_bar_nodes_Disabler">
        <li><label><input type="checkbox" name="type[post][group_discussion]" value="1"
            id="search_bar_group_discussion" class="AutoChecker"
            data-uncheck="#search_bar_thread" /> {xen:phrase display_results_as_threads}</label></li>
    </ul>

Ersetze:
PHP:
<xen:if is="{$forum.node_id} == 197">
    <label title="{xen:phrase search_only_x, 'title={$forum.title}'}"><input type="checkbox" name="nodes[]" value="{$forum.node_id}"
    id="search_bar_nodes" class="Disabler AutoChecker" checked="checked"
    data-uncheck="#search_bar_thread" /> Nur Lexikon durchsuchen</label>
    <ul id="search_bar_nodes_Disabler">
        <li><label for="ctrl_child_nodes"><input type="checkbox" name="child_nodes" id="ctrl_child_nodes" value="1"
            {xen:checked '{$search.child_nodes}'} checked="checked"/> incl. aller Unterkategorien</label></li>
    </ul>
<xen:else />
<xen:if is="in_array({$forum.node_id}, array(211, 215, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 260, 261, 227, 228, 229, 231))">    <label title="{xen:phrase search_only_x, 'title={$forum.title}'}"><input type="checkbox" name="nodes[]" value="{$forum.node_id}"
    id="search_bar_nodes" class="Disabler AutoChecker" checked="checked"
    data-uncheck="#search_bar_thread" /> Nur diese Kategorie durchsuchen</label>
<xen:else />
    <label title="{xen:phrase search_only_x, 'title={$forum.title}'}"><input type="checkbox" name="nodes[]" value="{$forum.node_id}"
    id="search_bar_nodes" class="Disabler AutoChecker" checked="checked"
    data-uncheck="#search_bar_thread" /> {xen:phrase search_this_forum_only}</label>
    <ul id="search_bar_nodes_Disabler">
        <li><label><input type="checkbox" name="type[post][group_discussion]" value="1"
            id="search_bar_group_discussion" class="AutoChecker"
            data-uncheck="#search_bar_thread" /> {xen:phrase display_results_as_threads}</label></li>
    </ul>
</xen:if>
</xen:if>

Speichern.


Was wurde getan?
Zunächst wird die ID der Lexikon Hauptkategorie abgefragt (
PHP:
<xen:if is="{$forum.node_id} == 197">
197 mit der ID deiner Lexikon Hauptkategorie ersetzen!) um hier die Schnellsuche entsprechend anzupassen, das default nur im gesamten Lexikon UND allen Unterkategorien des Lexikon gesucht wird.
lexikon_suche_01.jpg

Dann wird abgefragt ob man sich in einer der eigentlichen Lexikon Kategorien befindet (
PHP:
<xen:if is="in_array({$forum.node_id}, array(211, 215, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 260, 261, 227, 228, 229, 231))">
Hier die IDs durch die IDs der entsprechenden eigentlichen Lexikon Kategorien ersetzen, die Hauptkategorie ID darf hier nicht auftauchen!) um dort ebenfalls die Schnellsuche entsprechend anzupassen.
lexikon_suche_02.jpg

Es wurden einige Phrasen direkt im Template angepasst wie man sieht, wer mehrsprachig fährt, kann das jederzeit über neu erstellte eigene Phrasen individuell anpassen.
Am Ende wird für alle nicht abgefragten Kategorien die Standard Schnellsuche angezeigt - fertig. :)



Ich wollte es über eine <xen:elseif ... Anweisung lösen, aber irgendwie hatte das TMS damit ein Problem bei mir, daher diese Variante. ;)
Wer Änderungen, Hinweise oder Kritik hat darf sie gern äußern. :)
 
In Sachen Auto-Linker ... bin ich zumindest ein Stückchen weiter. Im Moment hab ich Brivium und Waindigo angeschrieben die solche Addons bereits haben, wo im Posttext definierte Wörter durch Links zB. ersetzt werden können. Das suchen wir ja im Grunde, nur das man die zu ersetzenden Wörter nicht von Hand einpflegt sondern diese automatisch aus den Themem Titeln in definierten Foren ausliest und den Link zum Thema nutzt.

Kann doch nicht sooo schwer sein für nen fähigen Programmierer... ;)
 
Kannst du mal ein Screenshot zeigen wie es aussieht wenn du dort ein neues Thema hinzufügst?
 
Zurück
Oben