⏸ Entwicklung beendet – offen für Projektübergabe
Leider fehlt mir die Zeit und Energie, die Entwicklung dieses Plugins aktiv voranzutreiben. Ich werde das Plugin vorerst so archivieren, wie es ist. Beachten Sie, dass Kirby 3.6+ nicht unterstützt wird. Wenn jemand dieses Plugin übernehmen und weiterentwickeln möchte, würde ich mich sehr freuen – bitte melden Sie sich.
Laden Sie dieses Repository herunter, entpacken Sie es und kopieren Sie es nach /site/plugins/search
.
Alternativ können Sie es mit Composer installieren:
composer require distantnative/search-for-kirby
Entscheiden Sie, welchen Anbieter Sie nutzen möchten (die verfügbaren Anbieter finden Sie weiter unten). Und vergessen Sie nicht, den Index (auch unten) vor der ersten Ausführung zu erstellen, wenn Sie den Sqlite- oder Algolia-Anbieter verwenden.
Ersetzen Sie den Ordner /site/plugins/search
durch die neue Version. Lesen Sie unbedingt die Versionshinweise, um wichtige Änderungen zu erfahren.
Oder wenn Sie das Plugin über Composer installiert haben, führen Sie Folgendes aus:
composer update distantnative/search-for-kirby
Das Plugin bietet eine globale Suche über verschiedene Einträge hinweg: pages
, files
und users
.
Sie können definieren, was als Einträge in den Index aufgenommen werden soll (mithilfe der Kirby-Abfragesprache) oder sogar einen Typ vollständig in Ihrer site/config/config.php
deaktivieren:
' search ' => [
' entries ' => [
' pages ' => ' site.find("projects").index ' ,
' files ' => false ,
// users will remain the default
]
]
Standardmäßig sind die folgenden Sammlungen im Index enthalten:
pages
site.index
files
site.index.files
users
kirby.users
Sie können in Ihrer config.php
Datei definieren, welche Inhaltsfelder Ihrer Seiten, Dateien und Benutzer in die Suche einbezogen werden sollen:
' search ' => [
' fields ' => [
' pages ' => [
' title '
],
' files ' => [
' filename '
],
' users ' => [
' email ' ,
' name '
]
]
]
Es gibt mehrere Möglichkeiten, Felder in diesen Arrays zu definieren:
// Simply add the field
' title ' ,
// Add the field, but run it through a field method first
' text ' => ' kirbytext ' ,
// Pass parameters to the field method
' text ' => [ ' short ' , 50 ],
// Use a callback function
' text ' => function ( $ model ) {
return strip_tags ( $ model -> text ()-> kt ());
}
// Turn string field value into number (e.g. for Algolia filters)
' myNumberField ' => function ( $ model ) {
return $ model -> myNumberField ()-> toFloat ();
}
' myVirtualNumberField ' => function ( $ model ) {
return $ model -> myNumberField ()-> toInt () + 5 ;
}
' myDate ' => function ( $ model ) {
return $ model -> anyDateField ()-> toTimestamp ();
}
Sie können in Ihrer config.php
Datei auch definieren, welche Vorlagen (oder Rollen im Fall von Benutzern) in die Suche einbezogen werden sollen:
' search ' => [
' templates ' => [
' pages ' => function ( $ model ) {
return $ model -> id () !== ' home ' && $ model -> id () !== ' error ' ;
},
' files ' => null ,
' users ' => null
]
]
``
If the value is null or an empty array, all templates are allowed. If it is false, all templates are excluded. There are several other options:
```php
// simple whitelist array
[ ' project ' , ' note ' , ' album ' ]
// associative array
[
' project ' => true ,
' note ' => false
]
// callback function
function ( $ model ) {
return $ model -> intendedTemplate () !== ' secret ' ;
}
Das Plugin ersetzt die standardmäßige Panel-Suche (Zugriff oben rechts über das Lupensymbol) durch sein globales Suchmodal:
Das Plugin ersetzt auch die PHP-API-Methoden. Da das Plugin eine globale Suche bietet, ist es am besten, es zunächst mit dem $site-Objekt zu verwenden:
$ site -> search ( ' query ' , $ options = []);
Dennoch kann die Suche auch auf spezifischere Sammlungen eingeschränkt werden (mit etwas Leistungsverlust):
$ page -> children ()-> listed ()-> filterBy ( ' template ' , ' project ' )-> search ( ' query ' , $ options = []);
Das Plugin fügt außerdem eine globale search()
Hilfsfunktion hinzu:
search (string $ query , $ options = [], $ collection = null )
Für das Optionsarray können Sie eine Limit-Option übergeben, um die Anzahl der zurückzugebenden Ergebnisse anzugeben. Darüber hinaus können Sie eine Operatoroption ( AND
oder OR
) angeben, um die Regel festzulegen, nach der mehrere Suchbegriffe kombiniert werden:
collection ( ' notes ' )-> search ( $ query , [
' operator ' => ' AND ' ,
' limit ' => 100
]);
Als Ergebnis erhalten Sie ein KirbyCmsCollection
Objekt.
Das Plugin bündelt drei verschiedene Suchanbieter. Abhängig von Ihrem Standort, Ihren Anforderungen und Ihrer Einrichtung könnte eine davon besser geeignet sein als andere.
sqlite
(Standard)Erstellt eine Index-SQLite-Datenbank mit der SQLite FTS5-Erweiterung (muss verfügbar sein).
In der Konfiguration können Sie den Speicherort für die Datenbankdatei neu definieren und einen absoluten Pfad angeben. Standardmäßig wird die Datenbankdatei als site/logs/search/index.sqlite
erstellt.
// site/config/config.php
' search ' => [
' provider ' => ' sqlite ' ,
' sqlite ' => [
' file ' => dirname ( __DIR__ , 2 ) . ' /storage/search/index.sqlite '
]
]
Die Fuzzy-Option ermöglicht eine Suche, um den Inhalt nicht nur vom Wortanfang, sondern auch innerhalb von Wörtern abzugleichen. Abhängig vom Inhalt kann es die Größe der Indexdatenbank drastisch erhöhen (denken Sie exponentiell), insbesondere wenn lange Textfelder einbezogen werden. Sie können auch Listen von Feldern definieren, die unscharf gemacht werden sollen.
// site/config/config.php
' search ' => [
' provider ' => ' sqlite ' ,
' sqlite ' => [
// Enabled for all fields
' fuzzy ' => true ,
// Disabled completely
' fuzzy ' => false ,
// Only for selected fields
' fuzzy ' => [
' pages ' => [ ' title ' ],
' files ' => [ ' caption ' , ' credits ' ]
],
]
]
Sie können auch einige benutzerdefinierte Gewichtungen definieren, um bestimmte Felder höher einzustufen als andere:
// site/config/config.php
' search ' => [
' provider ' => ' sqlite ' ,
' sqlite ' => [
' weights ' => [
' title ' => 10 ,
' caption ' => 5
],
]
]
algolia
Fügen Sie die Algolia-Suche mit diesem Anbieter nahtlos zu Kirby hinzu:
// site/config/config.php
' search ' => [
' provider ' => ' algolia ' ,
' algolia ' => [
' app ' => . . . , // Algolia App ID
' key ' => . . . , // Algolia private admin key (not just read-only!)
' index ' => ' kirby ' // name of the index to use/create
' options ' => [] // options to pass to Algolia at search
]
]
Um einen ersten Index zu erstellen, bündelt das Plugin einen kleinen Panel-Abschnitt, von dem aus Sie die Erstellung des Index auslösen können. Fügen Sie den folgenden Abschnitt beispielsweise zu Ihrem site.yml
Blueprint hinzu:
sections :
search :
type : search
Standardmäßig stellt das Plugin über Hooks sicher, dass der Suchindex bei jedem Ereignis (Erstellen einer Seite, Hochladen einer Datei, Aktualisieren von Inhalten usw.) aktualisiert wird. Sie müssen sich also nicht jedes Mal, wenn Inhalte bearbeitet werden, darum kümmern, einen neuen Index zu erstellen.
Um automatische Indexaktualisierungen über Hooks zu deaktivieren, fügen Sie Folgendes zu Ihrer site/config/config.php
hinzu:
' search ' => [
' hooks ' => false
]
Sie können den Index auch über die Befehlszeile mit dem im Plugin enthaltenen Shell-Skript ./index
erstellen. Dies kann eine Alternative zum Panel-Abschnitt sein (insbesondere für eine sehr große Indexdatei) oder Hooks in Setups ersetzen, die das Panel nicht verwenden – dann ausgelöst z. B. beim Bereitstellen eines neuen Commits oder über einen Cronjob.
./site/plugins/search/bin/index
Wenn Sie ein benutzerdefiniertes Ordner-Setup verwenden, müssen Sie eine modifizierte Version dieses Skripts erstellen. Kontaktieren Sie uns, wenn Sie Hilfe benötigen.
Dieses Plugin wird „wie besehen“ und ohne Garantien bereitgestellt. Die Nutzung erfolgt auf eigene Gefahr und testen Sie es immer selbst, bevor Sie es in einer Produktionsumgebung verwenden. Wenn Sie auf ein Problem stoßen, erstellen Sie bitte ein Issue.
Beim Generieren des Index kann der Fehler auftreten, dass der Treiber nicht gefunden werden konnte. Dies bedeutet höchstwahrscheinlich, dass in Ihrem Server-Setup die SQLite-Erweiterungen fehlen. Für andere Benutzer hat es geklappt, die folgenden Erweiterungen zu aktivieren:
extension=sqlite3.so
extension=pdo_sqlite.so
Dieses Plugin ist völlig kostenlos und wird unter der MIT-Lizenz veröffentlicht. Die Entwicklung erfordert jedoch Zeit und Mühe. Wenn Sie es in einem kommerziellen Projekt verwenden oder mich einfach dabei unterstützen möchten, dieses Plugin am Leben zu erhalten, leisten Sie bitte eine Spende Ihrer Wahl.