CMSWorkbench CMS Templates für Pico Bludit Smarty, Plugins für Bludit WonderCMS Pico, YAML und Flat File CMS, PHP Codings Beispiele, SEO Tricks, Downloads https://cmsworkbench.de/ Sat, 12 Oct 2024 12:30:59 +0200 Sat, 12 Oct 2024 12:30:59 +0200 Pico PicoPagesList mit Twig ohne Plugin realisieren <h2>Das PicoPageList Plugin</h2> <p>Befindet sich der Leser in einem Beitrag und möchte von dort in andere Artikel verzweigen, die ebenfalls im selben Ordner liegen, dann kann man sich des Plugins <code>PicoPagesList.php</code> bedienen und es in verschiedene Templates einhängen. Über dieses Plugin werden weitere Beiträge angezeigt, die sich im selben Ordner befinden.</p> <p>Etwas nachteilig ist jedoch, das der Code für eine an sich simple Aufgabe, sehr kompliziert wirkt und das Layouting teilweise im Plugin erledigt werden muss.</p> <h2>PicoPagesList als Twig Modul</h2> <p>Wesentlich einfacher und der Aufgabenstellung angepasster, wird es mit einem Twig-Modul. Der Vorteil: der Code des Moduls ist sehr klein gehalten und die optische Gestaltung kann wie gewohnt im Template mit CSS-Mitteln erfolgen.</p> <h2>Der Twig-Code</h2> <p>Der Code ist mit wenigen Twig-Befehlen leichtgewichtig und gut verständlich aufgebaut:</p> <pre><code>{% set url = current_page.id %} {% set path = "" %} {% for section in url|split('/',-1) %} {% set path = [path, section, '/']|join %} {% endfor %} &lt;ul&gt; {% for page in pages(path)|sort_by("title") if not page.hidden %} &lt;li&gt;&lt;a href="{{ page.url }}"&gt;{{ page.title }}&lt;/a&gt;&lt;/li&gt; {% endfor %} &lt;/ul&gt;</code></pre> <p><em>PicoPagesList als alternatives Twig-Modul</em></p> <h2>Codebeschreibung</h2> <p>Am Beginn des Moduls wird die aktuelle URL des geöffneten Beitrags, mit dem Befehl <code>split()</code> in einzelne Bestandteile zerlegt. Die URL wird anhand der Slashes in ein Array aufgeteilt, wobei der Dateiname (Beitragsname) entfernt wird <code>(-1)</code>. In der ersten <code>for</code>-Schleife wird die URL zu einem neuen String zusammengesetzt und in <code>path</code> kopiert.</p> <p>Die Variable <code>path</code> wird in der zweiten <code>for</code>-Schleife verwendet, um das aktuelle Verzeichnis nach Beiträgen zu durchsuchen.</p> <h2>Einschränkung</h2> <p>Die Funktion des Twig-Moduls unterliegt mit seinen zehn Programmzeilen auch einer Einschränkung. Damit das Modul ein sinnvolles Ergebnis ermitteln kann, sollte es genau dann aufgerufen werden, wenn sich der Leser in einem Beitrag befindet, bzw. eine Markdown-Datei von Pico geöffnet wurde. Diese Einschränkung entsteht durch den Twig-Befehl <code>url|split('/',-1)</code>, der immer den letzten URL-Teil entfernt, dies wäre der Beitragsname. Würde das Modul innerhalb eines Ordners oder Index gerufen werden, würde es eine falsche Struktur ermitteln.</p> <p>Im Gegensatz dazu, ist das ursprüngliche Pico Plugin <code>PicoPagesList.php</code> mit seinen etwa 250 Programmzeilen deutlich flexibler und Leistungsfähiger aber auch nur wenig spezialisiert wie das hier im Beitrags gezeigte Twig-Modul.</p> Sat, 20 Jul 2024 02:00:00 +0200 https://cmsworkbench.de/pico/twig/page-list-mit-twig https://cmsworkbench.de/pico/twig/page-list-mit-twig Einen RSS Feed für Pico mit Twig erzeugen <h2>Was sind RSS-Feeds?</h2> <p>Kurz gesagt sind RSS-Feeds nichts anderes als kleine Nachrichtenticker, die sich in Ihrem Browser bemerkbar machen, wenn neue Artikel auf Ihrer Lieblingsseite bereit stehen. Dazu benötigen Sie einen RSS-Reader, um den aktuellen Feed einer Webseite zu empfangen. Die kostenlosen RSS-Reader, können Sie über die Einstellungen des Browsers hinzuladen und einrichten. Geben Sie dann noch die URL zu einem Feed einer Webseite ein, dann erhalten Sie regelmäßig einen kleinen Anleser des neuen Artikels der beobachteten Webseite - ganz einfach und easy.</p> <blockquote> <p>In Zeiten von User- und IP-Tracking, sind RSS-Feeds wieder sehr beliebt geworden, denn in den meisten Fällen können Sie damit nervigen Werbebannern und Popups aus dem Wege gehen, denn der Feed ist von der auf der Webseite laufenden Werbung in den meisten Fällen unbeeindruckt.</p> </blockquote> <h2>RSS-Struktur</h2> <p>Der RSS-Feed ist nichts weiter als ein standardisierter Datenstrom der die folgende Struktur haben muss:</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;rss version="2.0"&gt; &lt;channel&gt; &lt;title&gt; Titel des Feeds &lt;/title&gt; &lt;link&gt; URL der Webpräsenz &lt;/link&gt; &lt;description&gt; Kurze Beschreibung des Feeds &lt;/description&gt; &lt;language&gt; Sprache des Feeds (z. B. "de-de") &lt;/language&gt; &lt;copyright&gt; Autor des Feeds &lt;/copyright&gt; &lt;pubDate&gt; Datum("Tue, 8 Jul 2008 2:43:19") &lt;/pubDate&gt; &lt;image&gt; &lt;url&gt; URL einer einzubindenden Grafik &lt;/url&gt; &lt;title&gt; Bildtitel &lt;/title&gt; &lt;link&gt; URL, mit der das Bild verknüpft ist &lt;/link&gt; &lt;/image&gt; &lt;item&gt; &lt;title&gt; Titel des Eintrags &lt;/title&gt; &lt;description&gt; Kurze Zusammenfassung des Eintrags &lt;/description&gt; &lt;link&gt; Link zum vollständigen Eintrag &lt;/link&gt; &lt;author&gt; Autor des Artikels, E-Mail-Adresse &lt;/author&gt; &lt;guid&gt; Eindeutige Identifikation des Eintrages &lt;/guid&gt; &lt;pubDate&gt; Datum des Items &lt;/pubDate&gt; &lt;/item&gt; &lt;item&gt; ... &lt;/item&gt; &lt;/channel&gt; &lt;/rss&gt;</code></pre> <p>Das CMS Pico muss also die zu sendenden Daten in dieses Format verpacken und an den RSS-Reader eines Lesers senden und das ist dank Twig recht leicht erledigt.</p> <h2>Der Beitrag feed.md</h2> <p>Damit der Feed eine URL-Entsprechung in Ihrer Webseite bekommt, muss ein Beitrag mit dem namen <code>feed.md</code> in der typischen Pico-manier erstellt werden. Wenn Sie mögen können Sie die Meta-Attribute des Beitrags wie gewohnt füllen aber am wichtigsten ist das Meta-Attribut <code>Template</code>, denn hier muss <code>feed</code> eingetragen werden, damit Pico das Template <code>feed</code> startet, welches die Daten aus dem CMS sammelt und den Datenstrom an den Feedreader des Lesers sendet.</p> <pre><code>--- Title: RSS Feed Template: feed Hidden: true Description: Sendet den Feed an den Leser ---</code></pre> <p>Den Beitrag sollten Sie im Root des Content-Verzeichnis ablegen, damit er klassisch ala: <code>https://CMSWorkbench.de/feed</code> gerufen werden kann. Diese Form wird in der Regel erwartet, kann aber auch in einem bestimmten Verzeichnis oder in einer speziellen Kategorie liegen.</p> <blockquote> <p>Hinweis: Damit der <code>feed.md</code> Beitrag nicht mit in der regulären Navigation des CMS und zwischen den restlichen Beiträgen erscheint, sollten Sie zusätzlich noch das Meta-Attribut <code>Hidden: true</code> setzen.</p> </blockquote> <h2>Das Twig-Template feed.twig</h2> <p>Das Template <code>feed.twig</code> wird vom Beitrag <code>feed.md</code> aufgerufen und wird die eigentliche Arbeit leisten. Das Twig-Template soll das folgende Coding erhalten:</p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"&gt; {% set RFC822 = "D, d M Y H:i:s O" %} &lt;channel&gt; &lt;title&gt;{{ site_title | e }}&lt;/title&gt; &lt;description&gt;{{ pages.index.meta.description | e }}&lt;/description&gt; &lt;link&gt;{{ base_url }}/&lt;/link&gt; &lt;atom:link href="{{ base_url ~ "/feed" }}" rel="self" type="application/rss+xml"/&gt; &lt;pubDate&gt;{{ "now" | date(RFC822) }}&lt;/pubDate&gt; &lt;lastBuildDate&gt;{{ "now" | date(RFC822) }}&lt;/lastBuildDate&gt; &lt;generator&gt;Pico&lt;/generator&gt; &lt;!-- Der rss-feed sendet alle mit Sticky markierten Beiträge --&gt; {% for page in pages if page.meta.Sticky and not end %} &lt;item&gt; &lt;title&gt; {{ page.title | e }} &lt;/title&gt; &lt;description&gt; {{ page.id | content | e }} &lt;/description&gt; &lt;pubDate&gt; {{ page.date | date(RFC822) }} &lt;/pubDate&gt; &lt;link&gt; {{ page.url }} &lt;/link&gt; &lt;guid isPermaLink="true"&gt;{{ page.url }} &lt;/guid&gt; &lt;/item&gt; {% if loop.index == 5 %}{% set end = true %}{% endif %} {% endfor %} &lt;/channel&gt; &lt;/rss&gt;</code></pre> <p>Bei diesem Twig-Script handelt es sich im wesentlichen, um die vorangegangene Definition des RSS-Feed, allerdings sorgt der Loop dafür, das nicht zwingend immer die neuesten Beiträge gesendet werden, sondern die Beiträge, die vom Redakteur bewusst hervorgehoben wurden (<code>Sticky: true</code>), das ermöglicht eine bessere Steuerung des Outputs Ihrer Webseite. Denn Sie können den Feed beispielsweise auch bei XING einbinden und dort ist es erfahrungsgemäß besser, wenn nur ausgesuchte Beiträge im XING-feed für die Recruiter zu sehen sind (vertrauen Sie mir :).</p> <p>{copyright}</p> <blockquote> <p>Hinweis: der Filter <code>|e</code> soll lediglich dafür sorgen, das Escape-Sequenzen gefiltert werden, um Fehler durch Sonderzeichen zu verhindern. {autor} {mail}</p> </blockquote> Tue, 09 Jul 2024 02:00:00 +0200 https://cmsworkbench.de/pico/twig/rss-feed-erstellen https://cmsworkbench.de/pico/twig/rss-feed-erstellen Ein eigenes CMS programmieren I. <h2 id="eigenes-CMS">Programmieren Sie Ihr eigenes CMS I.</h2> <p>In diesem Workshop programmieren Sie Ihr eigenes individuelles Content Management System. Sie beginnen zunächst mit der <strong>PHP-Programmierung</strong> eines ganz rudimentären aber dennoch funktionsfähigem CMS, das aus <strong>wenigen PHP-Skripten besteht</strong>. Die Entwicklung wird sich größtenteils an das beliebte <strong>MVC-Pattern halten</strong>, damit der Code und die Verzeichnisstruktur übersichtlich bleibt. Damit Sie nicht jedes Code-Beispiel mühsam aus den einzelnen Beiträgen herauskopieren müssen, finden Sie den Quellcode zum fertigen <strong>Download im Teil 1</strong> des Workshops. Nach dem ersten Teil des Workshops wird es noch <strong>zwei weitere Teile</strong> geben, in denen Sie beispielsweise die externe und beliebte <strong>Template-Engine Smarty</strong> einbinden und die Grundfunktionen der Basis-version erheblich aufwerten. Im <strong>dritten Teil</strong> werden Sie das CMS noch mit <strong>Plugins</strong> erweitern und Ihr eigenes Content Management System finalisieren.</p> <h2 id="warum-eigenes-CMS-programmieren">Warum Sie unbedingt ein eigenes CMS programmieren sollten?</h2> <p>Sicherlich ist das Internet voll mit sehr guten Content Management Systemen wie beispielsweise <strong>WordPress</strong>, <strong>Joomla</strong> oder das überaus beliebte <strong>Flatfile CMS Bludit</strong>, die man sehr bequem verwenden kann und mit denen man <em>out of the Box</em> überaus professionelle Webseiten ruckzuck zaubert. Dennoch kann man einen starken Trend im Web erkennen, denn in den vielen Foren werden die Fragen <em>wie man ein eigenes CMS entwickelt</em> immer häufiger gestellt. Doch warum hat dieser Trend in den letzten Jahren so zugenommen?</p> <h2 id="vom-ballast-befreien">Befreien Sie Ihren Content vom Ballast</h2> <p>Sicherlich ist der gute Ruf von WordPress gerechtfertigt, dennoch steigen immer mehr Anwender aus diesem gigantischen Content Management System aus, der Grund? Ganz einfach! WordPress ist unglaublich komplex und nahezu überladen mit Funktionen die man gefühlt kaum noch unter Kontrolle hat. Dazu kommt, das kein Tag vergeht, an dem nicht eine neue Sicherheitslücke in diesem beliebten CMS entdeckt wird. Vielen Usern wird dann im Laufe des Betriebes klar, das sie von dieser unglaublichen Funktionsfülle lediglich 10% nutzen wollen, warum dann nicht auch für ein CMS entscheiden, welches genau diese 10% abdeckt?</p> <h2 id="Corona-Pandemie">Die Corona-Pandemie hat den Trend verstärkt</h2> <p>Die kürzliche Corona-Pandemie hat viele Unternehmen dazu gezwungen ihre Geschäfte und Projekte in das Internet zu verlagern, <em>denn sind Sie nicht im Internet, dann gibt es Sie nicht!</em>. Dabei hat sich deutlich gezeigt, wie schlecht Unternehmen oder Projekte auf die digitale Welt vorbereitet waren. Es mangelt immer noch massiv an Wissen und Erfahrung wie Inhalte im Web positioniert werden können. Folglich stürzten sich viele vollkommen ahnungslos mit WordPress ins Web und mussten nach wenigen Monaten die Segel streichen, da die Seiten entweder einem Angriff zum Opfer vielen oder die eingesetzten Administratoren dem System nicht gewachsen waren, denn gut ausgebildetes Fachpersonal ist besonders in den technischen Berufen in den letzten Jahren Mangelware geworden.</p> <h2 id="Skill-aufbauen">Sie bauen hohen Skill auf</h2> <p>Entwickeln Sie Ihr eigenes Content Management System selbst, dann kennen Sie jede Schraube und jeden Winkel im System - Sie sind dann ein Profi des Systems. So ganz nebenbei sammeln Sie sehr viel Erfahrung rund um viele Webtechniken, die Funktionsweise von Servern unter Linux oder Windows, und und und... Ihr Erfahrungsschatz wird anwachsen und Ihnen wird sicherlich niemand mehr etwas vor machen können.</p> <h2 id="geringer-Angriffsvektor">Geringer Angriffsvektor im eigenen CMS</h2> <p>Nun noch ein Blick auf den wohl wichtigsten Aspekt bei der Programmierung eines eigenen Content Management Systems, die Sicherheit. WordPress ist das weltweit am häufigsten attackierte CMS im Internet, warum? Ganz einfach! Es ist beliebt und hat die meisten Installationen im Web, zudem ist der Quellcode gut dokumentiert und die Anwender des Systems zugegeben auch teils sehr naiv was die Sicherheit des Systems betrifft. WordPress ist also ein lohnenswertes Ziel für Angreifer, da es viele begünstigende Faktoren gibt.</p> <p>Schreiben Sie Ihr eigenes CMS, dann ist es für Angreifer zunächst vollkommen unbekannt und undokumentiert. Zudem können Sie unterstellen, das die Komplexität des Systems kleiner ist und folglich weniger Sicherheitslücken generiert. Sofern sich ein Angriff gegen Ihr CMS überhaupt lohnt, müssten Hacker und Angreifer das System auf Schwachstellen und Sicherheitslücken untersuchen und das kostet viel Zeit und Geld im Vergleich zum möglichen Erfolg des Angriffs. Dies ist im übrigen auch einer der Gründe, warum gerade die bis dahin recht unbekannten Flatfile CMS wie Pico oder Bludit gerade einen rasanten Anstieg der Installationen erleben - denn sie gelten als extrem sicher.</p> <h2 id="geringe-Abhaengigkeit">Geringere Abhängigkeiten zu unsicheren Projekten</h2> <p>Das bekannte und beliebte PICO CMS ist ein gutes Besipiel für die negativen Folgen solcher Abhängigkeiten, denn PICO war sehr lange Zeit nicht unter PHP8+ lauffähig und diese Webseiten mussten unter höheren Kosten des PHP7 Support betrieben werden. PICO konnte über einige Jahre nicht auf die nächste PHP-Version angehoben werden, da die enthaltenen Projekte nur für eine ältere PHP-Version verfügbar waren. Erst im Laufe der Zeit konnten die enthaltenen externen Komponenten von deren Entwicklern auf die neue PHP-Version angehoben werden. Dieser Makel war teuer und ärgerlich für die vielen User und Benutzer von PICO CMS.</p> <p>Ein anderes Beispiel ist WordPress, denn es vergeht kein Tag, an dem nicht eine Sicherheitslücke in irgendeinem der vielen Plugins oder Themes gemeldet wird. Das beliebteste Content Management System dieses Planeten ist zugleich auch das unsicherste CMS der Welt! Plugins und Themes stammen oft aus unsicheren Quellen dubioser Entwickler.</p> Sat, 17 Feb 2024 01:00:00 +0100 https://cmsworkbench.de/php/eigenes-cms-entwickeln https://cmsworkbench.de/php/eigenes-cms-entwickeln Bessere Breadcrumb Navigation mit Twig <h2 id="nav">Breadcrumb Navigation mit Twig</h2> <p>Die so genannte Breadcrumb Navigation (Brotkrumen Navigation) hat sich im Internet sehr stark verbreitet und gehört, zumindest auf komplexen Webseiten, zur Standardnavigation.</p> <pre><code>&lt;a href="/" class="badge bg-secondary"&gt;home&lt;/a&gt; {% for path in current_page.id|split('/',-1) %} {% set tmp = [tmp,path]|join('/') %} &lt;a href="{{tmp}}" class="badge bg-secondary"&gt;{{path}}&lt;/a&gt; {% endfor %}</code></pre> <p><em>Code: automatische Breadcrumb Navigation mit Twig</em></p> <p>Das kurze Coding stellt im Style des Bootstrap-CSS eine Reihe von klickbaren Buttons dar, der zum jeweilig übergeordneten Ordner verzweigen kann. Je Verzeichnis ein Button.</p> <h2>Alternative Variante</h2> <p>Wollen Sie einen etwas leichter lesbaren Code erstellen, können Sie auch gerne das folgende Code-Beispiel nutzen.</p> <pre><code>{% if page.id|split('/')[0] %} {{ page.id|split('/',-1)[0] }} {% endif %} {% if page.id|split('/')[1] %}/{{ page.id|split('/',-1)[1] }} {% endif %} {% if page.id|split('/')[2] %}/{{ page.id|split('/',-1)[2] }} {% endif %} {% if page.id|split('/')[3] %}/{{ page.id|split('/',-1)[3] }} {% endif %}</code></pre> <p><em>Code: diskrete Programmierung</em></p> <p>Der Befehl <code>split()</code> zerlegt die gesamte URL in ein Array und der <code>if</code> prüft die Existenz und zeigt den Inhalt der entsprechenden Stufe an.</p> <blockquote> <p>Allerdings müssen Sie diese Variante manuell erweitern, wenn mehr als vier Verzeichnisebenen in Ihrer Webseite vorkommen. Aus SEO-Sicht, bevorzugen die Suchmaschinen jedoch sehr flache Strukturen und belohnen diese mit gutem Ranking. Eine Strukturebene ist hervorragend.</p> </blockquote> Sun, 07 Jul 2024 02:00:00 +0200 https://cmsworkbench.de/pico/twig/breadcrumb-navigation-3 https://cmsworkbench.de/pico/twig/breadcrumb-navigation-3