Die Firma "Karelischer Entwickler" präsentiert das Update 0.3.0 "Schuja" für das Content-Management-System "GIRVAS". Die Version löst die Codestufe "Woizy" ab und erhält den Namen nach dem Fluss Schuja — einem der größten Flüsse der Republik Karelien, der aus dem See Suojarwi entspringt und in den Onegasee mündet. Die Tradition, CMS-Versionen nach karelischen Gewässern zu benennen, unterstreicht die regionale Zugehörigkeit des Produkts und seine Einbindung in die Landschaft heimischer Technologieentwicklungen.
Dieses Release konzentriert sich auf die Entwicklung von Werkzeugen zur Content-Navigation, Suchfunktionen und Suchmaschinenoptimierung sowie enthält wesentliche technische Verbesserungen des Systemkerns.
Integrierte Suchmaschine

Eine der wichtigsten Neuerungen der Version ist die Implementierung einer Volltextsuchmaschine, die ohne externe Dienste und Plugins funktioniert.
Die Suche erfolgt in Titeln, Beschreibungen, Hauptinhalten und Schlüsselwörtern von Einträgen. Implementiert wurde eine AND-Suchlogik mit automatischer Aufteilung der Anfrage in einzelne Wörter und Ausschluss von Satzzeichen, was das Auffinden relevanter Materialien auch bei ungenauen Formulierungen ermöglicht. Die Ergebnisrelevanz basiert auf konfigurierbaren Gewichtungsfaktoren: Übereinstimmungen in Titeln haben Priorität vor Übereinstimmungen im Dokumenttext.
Im Admin-Panel werden die Suchfunktionen in zukünftigen Updates erweitert: angemeldete Benutzer können nach Einträgen, statischen Seiten und Systembenutzern suchen.
Eintragsarchiv mit Datumsnavigation
Version 0.3.0 führt ein integriertes Eintragsarchiv ein — ein Werkzeug für die chronologische Content-Navigation.
Die Funktion gruppiert Einträge automatisch nach Jahren und Monaten und zeigt die Anzahl der Veröffentlichungen für jedes Zeitintervall an. Die Navigation unterstützt die Filterung nach Kategorien: Der Benutzer kann sowohl das allgemeine Archiv aller Site-Einträge als auch das Archiv einer einzelnen Kategorie einsehen. Die Breadcrumbs werden dynamisch basierend auf dem ausgewählten Zeitraum und der Kategorie generiert und ermöglichen eine bequeme Navigation durch die Archivebenen. Die Archivseiten sind für Suchmaschinen optimiert — Meta-Tags werden automatisch generiert und die URLs der Archivseiten sind in die dynamische Sitemap aufgenommen.
Kategoriehierarchie und verbesserte Navigation

Das Update implementiert Unterstützung für Unterkategorien mit rekursivem Baumdurchlauf. Die Kategorieseite zeigt nun Einträge unter Berücksichtigung aller verschachtelten Unterkategorien an, was eine umfassendere Darstellung des Inhalts ermöglicht.
Die Breadcrumbs auf Kategorie- und Eintragsseiten zeigen die vollständige Hierarchiekette von der Stammkategorie bis zur aktuellen Position. Diese Verbesserung verbessert sowohl die Benutzernavigation als auch die interne Verlinkung der Site für Suchmaschinen.
Integrierter SEO-Content-Analysator

In den Seiten- und Eintrags-Editor des Admin-Panels ist ein clientseitiger SEO-Analysator integriert, der ohne Serveranfragen arbeitet.
Der Analysator führt eine Prüfung in fünf Bereichen durch: Titel, Meta-Beschreibung, Schlüsselwörter, Inhalt und URL. Zu den geprüften Parametern gehören Länge und Inhalt der SEO-Tags, Vorkommen von Schlüsselwörtern in Überschriften, im ersten Absatz und im Haupttext, Korrektheit der Überschriftenhierarchie, Vorhandensein von Alt-Texten bei Bildern, das rel="nofollow"-Attribut bei externen Links, Erkennung von "nackten" URLs und Empfehlungen zu deren Formatierung im Markdown-Format. Die Analyseergebnisse werden sofort mit Farbkodierung, Fortschrittsbalken und konkreten Verbesserungsempfehlungen angezeigt.

Inhaltsblöcke

Im Admin-Panel gibt es einen neuen Bereich "Inhaltsblöcke", der zur Verwaltung spezialisierter Elemente dient, die in Themenbereiche eingebettet werden, ohne Vorlagen bearbeiten zu müssen.
Mehrere Blocktypen werden unterstützt:
- "Personalisierter" — beliebiger Inhalt mit Markdown-Formatierung;
- "Cabinet" — Benutzer-Miniprofil mit automatischer Anzeige des Anmeldeformulars für nicht angemeldete Besucher;
- "Kategorieliste" — hierarchische Liste aller Eintragskategorien;
- "Leer" — spezialisierter Typ für die Integration durch Drittanbieter-Module.
Für jeden Block werden Anzeigeregeln über reguläre Ausdrücke definiert, die auf die URL angewendet werden. Bei Übereinstimmung der angeforderten Adresse mit dem Muster wird der Block im entsprechenden Bereich des Themas angezeigt.
Technische Verbesserungen des Kerns
Version 0.3.0 enthält wesentliche Überarbeitungen der QueryBuilder-Komponente — dem internen SQL-Query-Builder:
- Unterstützung für JOINs (INNER, LEFT, RIGHT, FULL) mit adaptiver Generierung von Bedingungen für MySQL und PostgreSQL hinzugefügt;
- CaseExpression-Klasse für die Konstruktion von CASE-Ausdrücken implementiert, einschließlich spezialisierter Methoden für die JSON-Suche;
- Umfassende Indexunterstützung hinzugefügt: Erstellung und Löschung unter Berücksichtigung der Typen
BTREE,HASH,GIST,GIN,SPGIST,BRIN,FULLTEXTsowieUNIQUE,CONCURRENTLY,IF NOT EXISTSund partieller Indizes mit WHERE-Bedingungen.
Bei der CMS-Installation werden jetzt automatisch optimierende Indizes für alle Tabellen erstellt, einschließlich GIN-Indizes für JSONB-Felder (PostgreSQL) und eines partiellen Index für veröffentlichte Einträge. Fehler bei der Indexerstellung werden protokolliert, ohne den Installationsprozess zu unterbrechen.
Der EntryCategory-Klasse wurde Caching initialisierter Daten hinzugefügt, das wiederholte Datenbankabfragen bei mehreren Aufrufen der initData()-Methode verhindert.
Migration
Dateisystem-Update
Wir empfehlen dringend, das Update über das offizielle CMS "GIRVAS"-Repository zu beziehen. Wenn Sie es standardmäßig verwenden, führen Sie im Stammverzeichnis Ihres Projekts den Konsolenbefehl git pull aus, nachdem Sie zuvor auf den Branch production gewechselt haben (falls Sie zuvor einen anderen Branch verwendet haben).
Nach dem Dateisystem-Update leeren Sie den Cache: rm -R ./cache/* (der Pfad kann je nach tatsächlichem Standort im System abweichen).
Datenbank-Migration
Nach dem erfolgreichen Update der CMS-Dateien muss eine Datenbankmigration durchgeführt werden. Dazu müssen je nach Art Ihres DBMS mehrere SQL-Abfragen an Ihre Datenbank ausgeführt werden (einfach kopieren und einfügen).
Für MySQL
-- Erstellung der Tabelle für Inhaltsblöcke --
CREATE TABLE IF NOT EXISTS content_blocks (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name TEXT NOT NULL,
texts JSON,
metadata JSON,
createdUnixTimestamp INTEGER NOT NULL DEFAULT 0,
updatedUnixTimestamp INTEGER NOT NULL DEFAULT 0
);
-- Indizes für Tabelle entries
CREATE INDEX idx_entries_category ON entries (categoryID);
CREATE INDEX idx_entries_author ON entries (authorID);
CREATE INDEX idx_entries_created ON entries (createdUnixTimestamp DESC);
CREATE INDEX idx_entries_updated ON entries (updatedUnixTimestamp);
CREATE UNIQUE INDEX idx_entries_name_unique ON entries (name);
-- Indizes für Tabelle entries_categories
CREATE INDEX idx_entries_categories_parent ON entries_categories (parentID);
CREATE UNIQUE INDEX idx_entries_categories_name_unique ON entries_categories (name);
-- Indizes für Tabelle entries_comments
CREATE INDEX idx_entries_comments_entry ON entries_comments (entryID);
CREATE INDEX idx_entries_comments_author ON entries_comments (authorID);
CREATE INDEX idx_entries_comments_created ON entries_comments (createdUnixTimestamp DESC);
-- Indizes für Tabelle pages_static
CREATE UNIQUE INDEX idx_pages_static_name_unique ON pages_static (name);
CREATE INDEX idx_pages_static_author ON pages_static (authorID);
CREATE INDEX idx_pages_static_created ON pages_static (createdUnixTimestamp DESC);
-- Indizes für Tabelle users
CREATE UNIQUE INDEX idx_users_login_unique ON users (login);
CREATE UNIQUE INDEX idx_users_email_unique ON users (email);
-- Indizes für Tabelle users_sessions
CREATE INDEX idx_users_sessions_user ON users_sessions (userID);
CREATE INDEX idx_users_sessions_token ON users_sessions (token);
-- Indizes für Tabelle forms_data
CREATE INDEX idx_forms_data_form ON forms_data (formID);
CREATE INDEX idx_forms_data_created ON forms_data (createdUnixTimestamp DESC);
-- Indizes für Tabelle web_channels
CREATE UNIQUE INDEX idx_web_channels_name_unique ON web_channels (name);
-- Indizes für Tabelle metrics
CREATE INDEX idx_metrics_date ON metrics (date);
Für PostgreSQL
-- Erstellung der Tabelle für Inhaltsblöcke --
CREATE TABLE IF NOT EXISTS content_blocks (
"id" SERIAL NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"texts" JSONB,
"metadata" JSONB,
"createdUnixTimestamp" INTEGER NOT NULL DEFAULT 0,
"updatedUnixTimestamp" INTEGER NOT NULL DEFAULT 0
);
-- Indizes für Tabelle entries
CREATE INDEX IF NOT EXISTS idx_entries_category ON entries ("categoryID");
CREATE INDEX IF NOT EXISTS idx_entries_author ON entries ("authorID");
CREATE INDEX IF NOT EXISTS idx_entries_created ON entries ("createdUnixTimestamp" DESC);
CREATE INDEX IF NOT EXISTS idx_entries_updated ON entries ("updatedUnixTimestamp");
CREATE UNIQUE INDEX IF NOT EXISTS idx_entries_name_unique ON entries ("name");
CREATE INDEX IF NOT EXISTS idx_entries_texts_gin ON entries USING GIN (texts);
CREATE INDEX IF NOT EXISTS idx_entries_metadata_gin ON entries USING GIN (metadata);
CREATE INDEX IF NOT EXISTS idx_entries_published ON entries ("createdUnixTimestamp" DESC) WHERE (metadata::jsonb->>"isPublished")::boolean = true;
-- Indizes für Tabelle entries_categories
CREATE INDEX IF NOT EXISTS idx_entries_categories_parent ON entries_categories ("parentID");
CREATE UNIQUE INDEX IF NOT EXISTS idx_entries_categories_name_unique ON entries_categories ("name");
-- Indizes für Tabelle entries_comments
CREATE INDEX IF NOT EXISTS idx_entries_comments_entry ON entries_comments ("entryID");
CREATE INDEX IF NOT EXISTS idx_entries_comments_author ON entries_comments ("authorID");
CREATE INDEX IF NOT EXISTS idx_entries_comments_created ON entries_comments ("createdUnixTimestamp" DESC);
-- Indizes für Tabelle pages_static
CREATE UNIQUE INDEX IF NOT EXISTS idx_pages_static_name_unique ON pages_static ("name");
CREATE INDEX IF NOT EXISTS idx_pages_static_author ON pages_static ("authorID");
CREATE INDEX IF NOT EXISTS idx_pages_static_created ON pages_static ("createdUnixTimestamp" DESC);
CREATE INDEX IF NOT EXISTS idx_pages_static_texts_gin ON pages_static USING GIN (texts);
-- Indizes für Tabelle users
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_login_unique ON users ("login");
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email_unique ON users ("email");
-- Indizes für Tabelle users_sessions
CREATE INDEX IF NOT EXISTS idx_users_sessions_user ON users_sessions ("userID");
CREATE INDEX IF NOT EXISTS idx_users_sessions_token ON users_sessions ("token");
-- Indizes für Tabelle forms_data
CREATE INDEX IF NOT EXISTS idx_forms_data_form ON forms_data ("formID");
CREATE INDEX IF NOT EXISTS idx_forms_data_created ON forms_data ("createdUnixTimestamp" DESC);
-- Indizes für Tabelle web_channels
CREATE UNIQUE INDEX IF NOT EXISTS idx_web_channels_name_unique ON web_channels ("name");
-- Indizes für Tabelle metrics
CREATE INDEX IF NOT EXISTS idx_metrics_date ON metrics ("date");
Fazit
Das CMS "GIRVAS"-Update 0.3.0 "Schuja" vereint die Entwicklung von Benutzer-Navigations- und Suchwerkzeugen mit einer tiefgreifenden technischen Modernisierung des Kerns. Wir empfehlen allen Benutzern, das Update durchzuführen, um die verbesserten Suchfunktionen, die benutzerfreundliche Content-Archivierung und die neuen Suchmaschinenoptimierungswerkzeuge zu nutzen.
Kommentare