Fryboyter

Index.twig des Fryboyter-Themes

Da ich gefragt wurde, wie ich das auf fryboyter.de verwendet Theme erstellt habe, habe ich mir gedacht ich mache mal eine Artikelreihe daraus in der ich die 9 Twig-Dateien erkläre.

Fangen wir mal mit der Datei index.twig an. Diese wird angezeigt, wenn man die Hauptseite aufruft.

{% include '_header.twig' %}
<div class="header"><h1><a href="{{ paths.hosturl }}">Fryboyter</a></h1></div>
<div class="container">
    <div class="row">
        <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
            {% setcontent records = "entries/latest/5" allowpaging %}
                {% for record in records %}
                    <h2><a href="{{ record.link }}">{{ record.title }}</a></h2>
                        {% if record.taxonomy is defined %}
                            {% for type, values in record.taxonomy %}
                            <div class="article-info">Veröffentlicht am {{ record.datepublish|localdate("%d. %B %Y") }} unter:
                            {% for link, value in values %}
                            <a href="{{ link }}">{{ value }}</a>{% if not loop.last %} & {% endif %}
                            {% endfor %}
                            | <a href="{{ record.link }}#isso-thread">Comments</a> </div>
                            {% endfor %}
                        {% endif %}
                    {{ record.body }}
                    <hr/>
                {% endfor %}
            {{ pager('', 3, '_sub_mypager.twig') }}
        </div>
    </div>
</div>
<div class="footer">{% include '_footer.twig' %}</div>
</body>
</html>

Twig bietet die Möglichkeit bestimmte Bereich einer Seite in extra Dateien auszulagern. Mittels include kann man diese dann wie im Baukasten zusammensetzen. In diesem Fall wird in Zeile 1 somit die Datei _header.twig importiert.

In Zeile 2 wird mittels path.hosturl auf die Adresse der Seite verlinkt. In dem Fall also https://fryboyter.de/. Zieht man die Seite irgendwann man auf eine andere Domain um, braucht man hier die Adresse nicht händisch ändern.

In Zeile 6 werden die letzten 5 Einträge aus der Datenbank herausgefischt. Allowpaging ermöglicht es, dass man am Ende einer Seite auf weitere Seiten mit wiederrum 5 Artikeln wechseln kann.

Ab Zeile 7 wird definiert wie jeder einzelne Artikel angezeigt wird.

In Zeile 8 wird als erstes der Titel inkl. entsprechenden Link eines Artikels ausgegeben.

Zeile 9 bis 17 ist schon etwas aufwändiger. Hier wird erst einmal geprüft ob dem betreffende Artikel Taxonomien zugeordnet wurden. Auf dieser Seite wären das die Kategorieren wie osbn oder Allgemein. Wenn dem so ist, wird unter der Zeile der Artikelüberschrift das Datum der Veröffentlichung, gefolgt von den zugeordneten Kategorien angezeigt. Die Anzeige der Kategorien erfolgt hierbei in einer Schleife, so dass zwischen den Kategorien ein & angezeigt wird. Zum Schluss wird am Ende noch die Anzahl der vorhandenen Kommentare angezeigt und auf die Kommentarfunktion verlinkt (Zeile 18).

In Zeile 21 wird dann der Haupttext des Artikels angezeigt (ich arbeite nie mit Teasern).

Zeile 24 bindet die Datei _sub_mypager.twig ein. Hiermit wird am Ende einer Seite der Umschalter angezeigt mit dem man die Seiten wechseln kann.

Abschließend wird in Zeile 28 die Datei _footer.twig importiert.

OSBN | Allgemein

Nachbesserungen an Bolt CMS

Eigentlich war es mir schon klar, dass der Umstieg nicht so klappt wie erhofft. Bisher sind es aber nur ein paar Kleinigkeiten die schnell behoben werden konnten.

Zum einen stand in der PHP-Datei die den OSBN-Feed erstellt noch die Testdomain auf der ich die ganze Zeit an Bolt gebastelt habe. Somit hat gestern der Artikel von mir auf osbn nicht auf fryboyter.de sondern planetlinux.de verlinkt. Mea culpa. Hier habe ich zum einen die PHP-Datei geändert und zum anderen eine 301-Weiterleitung per .htaccess eingerichtet.

Das zweite Problem war mir anfangs nicht ganz klar. Ein Leser von fryboyter.de hat mir mitgeteilt, dass er keine Artikel direkt aufrufen kann, sondern nur die Hauptseite. Schnell bin ich auf die Fehlermeldung “Impossible to access an attribute (“id”) on a null variable” gestoßen die sich auf die Datei record.twig bezieht die für die Anzeige einzelner Artikel zuständig ist. Dort gibt es unter anderem folgenden Code.

{% if user.id == 'X' %}
| <a href="{{ paths.bolt }}editcontent/entries/{{ record.id }}">Bearbeiten</a>
{% endif %}

Hiermit wird geprüft, ob der Nutzer der die Seite aufruft die Id X hat. Wenn ja, wird ein Link angezeigt mit dem man den Aritkel bearbeiten kann. Und genau wegen diesem Code knallt es. Aber warum?

In der Hauptkonfiguration von Bolt gibt es folgenden Bereich…

# Use strict variables. This will make Bolt complain if you use {{ foo }},
# when foo doesn't exist.\
strict_variables: false

Tja hier hatte ich wohl das false auf true geändert um leere bzw. nicht vorhandene Variablen zu unterbinden. Und genau das ist die Ursache des Problems. Anstelle aus dem true wieder ein false zu machen, habe ich einfach obigen Code so abgeändert, dass erst einmal geprüft wird ob user.id definiert ist. Wenn ja, erfolgt die Prüfung auf ID X und wenn nicht, passiert gar nichts.

{% if user.id is defined %}
{% if user.id == 'X' %}
| <a href="{{ paths.bolt }}editcontent/entries/{{ record.id }}">Bearbeiten</a>
{% endif %}
{% endif %}

OSBN | Allgemein

Wordpress ist in Rente gegangen

Heute habe ich Fryboyter.de auf Bolt CMS umgestellt. Das Theme ist, wie man unschwer erkennen kann, Marke Eigenbau. Nach X Versionen mit Schnick Schnack habe ich es einfach mit Fokus auf den Text gehalten.

Für mich ist die Seite aber weiterhin “Beta”, da noch einige Sachen nicht so sind, wie ich es gerne haben möchte.

Wenn man aktuell einen Artikel aufruft erscheint an dessen Ende eine Liste mit Artikel-Vorschlägen. Diese sind aktuell noch unabhängig von der Kategorie. Hier möchte ich es noch schaffen, dass nur Artikel der gleichen Kategorie(n) angezeigt werden den dem aufgerufenen Artikel zugeordnet sind.

Den OSBN-Feed erzeuge ich derzeit alle 30 Minuten über eine PHP-Datei, da sich die Feed-Erweiterung von Bolt CMS nur auf Inhaltstypen und nicht auf Kategorien einschränken lässt. Hier will ich mittelfristig auf eine andere Lösung finden, da die Datei auch dann erzeugt wird, wenn kein neuer Artikel vorhanden ist. Erreichbar ist der Feed nun über https://fryboyter.de/files/feed.xml. Die alte Adresse des OSBN-Feed wird per .htaccess umgeleitet, so dass hier keine Probleme entstehen sollten (sofern der Feed-Reader die Umleitung kapiert).

Die Kommentare laufen ab sofort über Isso. Die Daten werden hierbei in einer SQLite-Datenbank auf meinem Webspace gespeichert, so dass ich hier keine Daten weitergebe.

Wer Fehler findet oder Verbesserungsvorschläge hat, darf sich gerne melden.

Edit: Einen unschönen Fehler habe ich gerade gefunden. Die PHP-Datei mit der ich den OSBN-Feed erzeuge, hat sich noch auf meine Test-Domain bezogen, so dass auf planetlinux.de verlinkt wurde. Das ist nun korrigiert und ich habe eine Weiterleitung auf die richtige Adresse erstellt. Sorry.

OSBN | Allgemein

Bolt CMS - Die Suchfunktion oder warum mich das Routing ans Limit bringt

Die Umstellung von fryboter.de von Wordpress auf Bolt CMS verkommt langsam einer unendlichen Geschichte. Kaum bin ich \“fertig\“, kommt mir eine neue Idee, was ich noch ändern kann. Wichtig war mir aber schon immer die Suchfunktion.

Schon seit ich mir der Umstellung begonnen habe, hat es mich gestört, dass die Suchfunktion bei Bolt nicht funktioniert hat. Das Suchfeld einzubauen war eigentlich kein Problem. Aber bei jeder Suche bekam ich einen Fehler 404 angezeigt. Die Lösung des Problems zeigt mal wieder, dass auch Bolt CMS Ecken und Kanten hat. Wobei man hier nicht von einem Fehler an sich reden kann, sondern davon, dass Bolt CMS einige Stellschrauben hat.

So würde die Grundinstallation beispielsweise auf einen Artikel in Form von https://planetlinux.de/entrie/deutschsprachiger-usenet-server-mit-schwerpunkt-arch-linux verlinken. Da aber Google die Artikel in Form von https://planetlinux.de/deutschsprachiger-usenet-server-mit-schwerpunkt-arch-linux indexiert hat, ist das blöd, weil ich nicht von null anfangen oder mit htaccess tricksen will.

Hier kommt nun der Teil von Bolt CMS ins Spiel der mir immer noch Kopfschmerzen bereitet. Das Routing. Hiermit lassen sich kurz gesagt die Aufrufe umbiegen. Um das “entrie/” aus den Artikellinks zu entfernen habe ich folgendes als erstes in die Datei routing.yml eintragen.

pagebinding:
path: /{slug}
defaults:
   _controller: controller.frontend:record
   contenttypeslug: entrie
   contenttype: entriest;

Als erstes weil die Einträge ganz oben die höchste Priorität haben. Um so weiter unten Sie in der Datei stehen um so weniger Priorität haben sie (und werden somit zum Beispiel nicht beachtet). Das Beispiel zeigt zum Beispiel dass alle Inhalte mit dem Inhaltstyp entries über den Pfad /slug ereichbar sind. Also zum Beispiel https://planetlinux.de/deutschsprachiger-usenet-server-mit-schwerpunkt-arch-linux.

Ein Stückchen weiter unten in der Datei ist bereits die Route für die Suche vorhanden.

search: path: /search defaults: _controller: controller.frontend:search

Aber egal was ich versucht habe, die Suche hat immer nur den Fehler 404 ausgespuckt. Eine Zeit lang war ich soweit, dass es zukünftig einfach keine Suchfunktion geben wird. Punkt. Ende. Aus. Die Lösung war dann doch recht “einfach”. So richtig kapiere ich sie aber trotzdem nicht. Ich habe einfach den Teil mit der sich auf die Suche bezieht über den Teil mit dem Pagebinding eingetragen. Und schon funktioniert die Suchfunktion. Klar es hat etwas mit der Priorität zu tun. Aber /search und /{slug} sind doch zwei unterschiedliche Sachen, oder nicht? Naja das ist erst mal egal. Es funktioniert ja.

Was jetzt noch fehlt ist der RSS-Feed für eine bestimmte Kategorie. Irgendwie muss ich ja meine Artikel auf osbn.de veröffentlichen. Es gibt zwar eine Erweiterung aber diese kann “nur” einen seitenweiten Feed bzw. einen pro Inhaltstyp erstellen. Und der Inhaltstyp umfasst alle Artikel die ich auf fryboyter.de veröffentliche. Da hier auch mal der eine oder andere Artikel veröffentlicht wird, der nichts mit osbn.de zu tun hat ist das blöd… Noch blöder ist es, dass ich absolut keine Ahnung habe wie ich diese Erweiterung ändern könnte.

Ich habe daher einfach mal den Entwickler der Erweiterung auf Github gefragt, ob eventuell in absehbarer Zeit auch Feeds für einzelnen Kategorien möglich sein werden. Bisher habe ich aber noch keine Antwort erhalten. Zur Not habe ich mir auch einfach mal eine PHP-Datei gezaubert die mir einen Feed erstellt. Besonders froh bin ich aber nicht mit der Lösung. Wer will, kann sie sich ja mal ansehen…

echo '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'; ?> 
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    >

<channel>
    <title>Fryboyter.de</title>
    <atom:link href="https://fryboyter.de/files/feed.xml" rel="self" type="application/rss+xml" />
    <description></description>
    <language>de-DE</language>
    <link>https://fryboyter.de</link>    
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>

<?php 

$host = "localhost";
$user = "Nutzer";
$pass = "Passwort";
$dbase = "Datenbankname";

$connection = mysqli_connect("$host" , "$user" , "$pass") OR DIE ("Keine Verbindung zu der Datenbank moeglich.");
mysqli_select_db($connection , $dbase) or die ("Auswahl der Datenbank nicht moeglich.");

// Datenbankabfrage
$query = "SELECT bolt_entries.slug AS slug, bolt_entries.datepublish AS date, bolt_entries.title AS title, bolt_entries.body AS blabla FROM bolt_entries, bolt_taxonomy WHERE bolt_entries.id = bolt_taxonomy.content_id AND bolt_taxonomy.slug = 'osbn' AND bolt_entries.status = 'published' ORDER BY bolt_entries.datepublish DESC LIMIT 20";  
$result = mysqli_query($connection , $query) or die (mysql_error()); 

// Ausgabe der Daten
while ($row = mysqli_fetch_array($result)){ 
    $slug = $row['slug']; 
    $title = $row['title']; 
    $blabla = $row['blabla']; 
    $pubdate = strtotime($row['date']);
    $pubdate = date('r', $pubdate);     
?> 
    <item>
        <title><?php echo $title; ?></title>
        <link>https://planetlinux.de/<?php echo $slug; ?></link>
           <guid isPermaLink="false">https://fryboyter.de/<?php echo $slug; ?></guid>
        <pubDate><?php echo $pubdate; ?></pubDate>
        <description><![CDATA[<?php echo $blabla; ?>]]></description>
    </item>
<?php } /* close while*/ ?>

</channel>
</rss>

Die Ausgabe der Datei in eine XML-Datei weitergeleitet erzeugt zumindest schon mal einen validen Feed. Allerdings müsste ich die Datei per Cronjob laufen lassen. Auf eine Lösung wie die Datei aufgerufen wird, sobald ein neuer Artikel veröffentlicht wurde, bin ich noch nicht gekommen.

OSBN

Fryboyter - Hinweis wegen Freischalten von Kommentaren

Ab und zu fragen bei mir Leute nach, wo denn ihre kürzlich geschriebenen Kommentare abgeblieben sind, da diese nicht sofort angezeigt werden. Dies liegt bei mir daran, dass alle Kommentare erst einmal von mir freigeschaltet werden (oder auch nicht). Einen Hinweis hierzu gab es bisher allerdings nicht.

Gestern habe ich mal wieder eine Nachfrage wegen eines nicht angezeigten Kommentars erhalten. Da ich gerade Urlaub habe, habe ich mich mal ein paar Minuten damit beschäftigt und die functions.php meines Wordpress-Themes erweitert. Wenn nun ein Kommentar abgeschickt wird, wird dieser für den Ersteller mit einem Hinweis angezeigt.

Unterm Strich ist diese Änderung kein Hexenwerk (hier nur der betreffende Codeteil der erstellen Funktion):

<?php if ( $comment->comment_approved == ‘0’ ) : ?> < em class=“comment-approved”><?php _e( ‘Your comment is awaiting moderation.’, ‘fryboyter’ ); ?>< /em>
<?php endif; ?>

Im Grunde wird nur geprüft ob in der Datenbank beim betreffenden Kommentar comment_approved den Wert 0 hat. Wenn ja, wird der Hinweis angezeigt. Dieser ist hier in Englisch angegeben. Das _e bewirkt in dem Fall eine automatische Übersetzung. In diesem Fall in die deutsche Sprache.

Linux | OSBN