Heim > Backend-Entwicklung > PHP-Tutorial > Die Anatomie der intelligenten Suche in der Joomla-Kunst. Erstellen eines Plugins I.

Die Anatomie der intelligenten Suche in der Joomla-Kunst. Erstellen eines Plugins I.

Barbara Streisand
Freigeben: 2024-12-04 22:29:11
Original
361 Leute haben es durchsucht

Im vorherigen Artikel haben wir uns mit den Funktionen der intelligenten Suchkomponente von Joomla vertraut gemacht und über die Parameter und Konfiguration der geplanten Indizierung mit CRON gesprochen. Beginnen wir mit der Erstellung des Codes für unser eigenes Plugin.

Liste der Ressourcen

Bevor ich mit dem technischen Teil beginne, werde ich einige Artikel erwähnen, die sich direkt mit dem Hauptthema befassen. Sowie Artikel, die sich im Allgemeinen mit der Erstellung und/oder Aktualisierung eines Plugins für die moderne Architektur von Joomla 4 / Joomla 5 befassen. Als nächstes gehe ich davon aus, dass der Leser sie gelesen hat und im Allgemeinen eine Vorstellung davon hat, wie man ein funktionierendes Plugin erstellt für Joomla:

  • Erstellen eines Smart Search-Plugins – offizielle Joomla-Dokumentation. Es gilt für Joomla 3, aber die meisten Bestimmungen blieben für Joomla 4 / Joomla 5 gültig
  • Entwicklung eines Smart Search Plugins, ein Artikel aus dem Joomla Community Magazine aus dem Jahr 2012.
  • Das Buch Joomla Extensions Development von Nicholas Dionysopoulos, das die Entwicklung von Joomla behandelt! Erweiterungen unter Joomla-Versionen 4 und 5.
  • Der Datenbankbereich im neuen Dokumentationsportal manual.joomla.org – für Joomla 4 und Joomla 5. ## Der technische Teil. Entwicklung des Joomla 5 Smart Search Plugins Die intelligente Suchkomponente arbeitet mit Datenanbieter-Plugins, deren Hauptaufgabe dieselbe bleibt: Daten auszuwählen und sie der Komponente zur Indizierung zu übergeben. Mit der Zeit fielen aber auch Neuindizierungsaufgaben in den Aufgabenbereich des Plugins. In diesem Artikel gehen wir davon aus, dass wir die Inhaltsindizierung manuell über das Admin-Panel ausführen. Die Arbeit der CLI ist optisch anders, aber ihr Wesen bleibt das gleiche.

Für erfahrene Entwickler möchte ich sagen, dass das Such-Plugin die Klasse JoomlaComponentFinderAdministratorIndexerAdapter erweitert. Die Klassendatei befindet sich in administrator/components/com_finder/src/Indexer/Adapter.php. Dann werden sie es selbst herausfinden. Als Beispiel können Sie auch die zentralen Plugins für die intelligente Suche von Joomla – für Artikel, Kategorien, Kontakte, Tags usw. – im Ordner plugins/finder studieren. Ich habe an einem intelligenten Such-Plugin für die Komponenten JoomShopping (Joomla E-Commerce-Komponente) und SW JProjects (Ihre eigene Joomla-Erweiterungsverzeichniskomponente mit Update-Server) gearbeitet, sodass ihnen die Klassennamen und einige Nuancen zugeordnet werden. Das meiste davon zeige ich am Beispiel von JoomShopping. Die Lösung des Problems der Mehrsprachigkeit erfolgt am Beispiel von SW JProjects.

Die Dateistruktur des Smart-Search-Plugins

Die Dateistruktur des Smart Search Plugins für Joomshopping unterscheidet sich nicht von der typischen:

The anatomy of smart search in Joomla art Creating a plugin I.
Dateistruktur des Joomla 5 Smart Search Plugins

Dateiservices/provider.php

Mit der Datei provider.php können Sie ein Plugin in einem Joomla DI-Container registrieren und über MVCFactory von außen auf Plugin-Methoden zugreifen.

<?php

/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Wtjoomshoppingfinder
 *
 * @copyright   (C) 2023 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Database\DatabaseInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder;

return new class () implements ServiceProviderInterface {
    /**
     * Registers the service provider with a DI container.
     *
     * @param   Container  $container  The DI container.
     *
     * @return  void
     *
     * @since   4.3.0
     */
    public function register(Container $container)
    {
        $container->set(
            PluginInterface::class,
            function (Container $container) {
                $plugin     = new Wtjoomshoppingfinder(
                    $container->get(DispatcherInterface::class),
                    (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder')
                );
                $plugin->setApplication(Factory::getApplication());

                // Our plugin uses DatabaseTrait, so the setDatabase() method appeared 
                // If it is not present, then we use only setApplication().
                $plugin->setDatabase($container->get(DatabaseInterface::class));

                return $plugin;
            }
        );
    }
};
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Plugin-Klassendatei

Dies ist die Datei, die den Hauptarbeitscode Ihres Plugins enthält. Es sollte sich im Ordner src/Extension befinden. In meinem Fall befindet sich die Plugin-Klasse JoomlaPluginFinderWtjoomshoppingfinderExtensionWtjoomshoppingfinder in der Datei plugins/finder/wtjoomshoppingfinder/src/Extension/Wtjoomshoppingfinder.php. Der Namensraum des Plugins ist JoomlaPluginFinderWtjoomshoppingfinderExtension.

Für den Betrieb ist ein minimaler Satz an Klasseneigenschaften und -methoden erforderlich (auf sie wird zugegriffen, auch von der übergeordneten Adapterklasse).

Die mindestens erforderlichen Eigenschaften der Klasse

  • $extension – ist der Name Ihrer Komponente, der den Typ Ihres Inhalts definiert. Beispiel: com_content. In meinem Fall ist das com_jshopping.
  • $context – ist ein eindeutiger Bezeichner für das Plugin. Er legt den Indexierungskontext fest, in dem auf das Plugin zugegriffen wird. Tatsächlich ist dies der Name der Plugin-Klasse (Element). In unserem Fall Wtjoomshoppingfinder.
  • $layout – ist der Name des Ausgabelayouts für das Suchergebniselement. Dieses Layout wird bei der Anzeige von Suchergebnissen verwendet. Wenn der Parameter $layout beispielsweise auf „article“ gesetzt ist, sucht der Standardansichtsmodus nach einer Layoutdatei mit dem Namen default_article.php, wenn Sie ein Suchergebnis dieses Typs anzeigen müssen. Wenn eine solche Datei nicht gefunden wird, wird stattdessen eine Layoutdatei mit dem Namen default_result.php verwendet. Die Ausgabelayouts mit HTML-Layout befinden sich in components/com_finder/tmpl/search. Allerdings sollten wir unsere Layouts als Überschreibungen platzieren – im HTML-Vorlagenordner – templates/YOUR_TEMPLATE/html/com_finder/search. In meinem Fall habe ich das Layoutprodukt benannt und die Datei heißt default_product.php. The anatomy of smart search in Joomla art Creating a plugin I.
  • $table – ist der Name der Tabelle in der Datenbank, auf die wir zugreifen, um Daten abzurufen, zum Beispiel #__content. In meinem Fall heißt die Haupttabelle mit JoomShopping-Produkten #__jshopping_products.
  • $state_field – ist der Name des Feldes in der Datenbanktabelle, das dafür verantwortlich ist, ob das indizierte Element veröffentlicht wird oder nicht. Standardmäßig heißt dieses Feld „Status“. Im Fall von JoomShopping heißt dieses Feld jedoch product_publish.
<?php

/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Wtjoomshoppingfinder
 *
 * @copyright   (C) 2023 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Database\DatabaseInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder;

return new class () implements ServiceProviderInterface {
    /**
     * Registers the service provider with a DI container.
     *
     * @param   Container  $container  The DI container.
     *
     * @return  void
     *
     * @since   4.3.0
     */
    public function register(Container $container)
    {
        $container->set(
            PluginInterface::class,
            function (Container $container) {
                $plugin     = new Wtjoomshoppingfinder(
                    $container->get(DispatcherInterface::class),
                    (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder')
                );
                $plugin->setApplication(Factory::getApplication());

                // Our plugin uses DatabaseTrait, so the setDatabase() method appeared 
                // If it is not present, then we use only setApplication().
                $plugin->setDatabase($container->get(DatabaseInterface::class));

                return $plugin;
            }
        );
    }
};
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die mindestens erforderlichen Methoden der Klasse

  • setup(): bool – ist eine Methode zum Vorkonfigurieren des Plugins, zum Verbinden von Bibliotheken usw. Die Methode wird während der Neuindizierung (die reindex()-Methode) beim onBeforeIndex-Ereignis aufgerufen. Die Methode muss true zurückgeben, sonst wird die Indizierung unterbrochen.
  • index(): void – ist die Methode, mit der die Indizierung selbst gestartet wird. Es sammelt ein Objekt der gewünschten Struktur aus SQL-Abfragerohdaten, das dann zur Indizierung an die Klasse JoomlaComponentFinderAdministratorIndexerIndexer übergeben wird. Die Methode wird für jedes indizierte Element ausgeführt. Das Methodenargument ist $item – das Ergebnis einer Abfrage an die Datenbank, formatiert in der JoomlaComponentFinderAdministratorIndexerResult-Klasse.
  • getListQuery(): JoomlaDatabaseDatabaseQuery – ist eine Methode zum Abrufen einer Liste indizierter Elemente…

... und hier fangen wir an, in die Details einzutauchen, da die getListQuery()-Methode nicht wirklich obligatorisch ist, obwohl sowohl in der Dokumentation als auch in den meisten Artikeln darüber gesprochen wird.

The anatomy of smart search in Joomla art Creating a plugin I.
Jedes Bild zum Thema „komplexes Schema“ reicht hier aus.

Tauchen Sie ein in die Details. Die Datenstruktur des indizierten Elements.

Es ist erstaunlich, wie oft eine Information oder Idee manchmal im Kreis an uns vorbeizieht, bevor wir sie bemerken und realisieren! Viele Dinge, die länger als ein Jahr vor unseren Augen liegen, werden uns immer noch nicht bewusst und unsere Aufmerksamkeit richtet sich erst nach jahrelanger Erfahrung auf sie.

Im Zusammenhang mit Joomla kommt aus irgendeinem Grund nicht sofort die Vision auf, dass seine Komponenten eine Art gemeinsame Architektur annehmen, die für Joomla charakteristisch ist (obwohl dies eine offensichtliche Tatsache ist). Einschließlich auf der Ebene der Datenbanktabellenstruktur. Schauen wir uns einige Felder der Joomla-Inhaltstabelle an. Ich mache einen Vorbehalt, dass bestimmte Spaltennamen für uns nicht so wichtig sind (Sie können immer SELECT name AS title abfragen), wie groß ist die Datenstruktur für ein indiziertes Element:

  • id – automatische Inkrementierung
  • asset_id – die ID des Eintrags in der Tabelle #__assets, in der die Zugriffsrechte von Gruppen und Benutzern für jedes Element der Site gespeichert sind: Artikel, Produkte, Menüs, Module, Plugins und alles andere. Joomla verwendet das Access Control List (ACL)-Muster.
  • Titel – der Elementtitel
  • Sprache – das Element Sprache
  • Introtext – einleitender Text oder eine kurze sichtbare Beschreibung des Elements
  • Volltext – der vollständige Text des Artikels, die vollständige Beschreibung des Produkts usw.
  • state – das logische Flag, das für den Veröffentlichungsstatus verantwortlich ist: ob das Element veröffentlicht ist oder nicht.
  • catid – die ID der Artikelkategorie. Joomla verfügt nicht nur über „Site-Seiten“ wie in anderen CMS. Es gibt Inhaltseinheiten (Artikel, Kontakte, Produkte usw.), die zu bestimmten Kategorien gehören müssen.
  • erstellt – das Datum, an dem das Element erstellt wurde.
  • Zugriff – Zugriffsrechte-Gruppen-ID (nicht autorisierte Site-Benutzer (Gäste), alle, registriert usw.)
  • metakey – Metaschlüsselwörter für das Element. Ja, seit 2009 werden sie von Google nicht mehr verwendet. Aber in Joomla bleiben sie historisch bestehen, da dieses Feld im Modul „Ähnliche Artikel“ verwendet wird, um mithilfe bestimmter Schlüsselwörter nach tatsächlich ähnlichen Artikeln zu suchen.
  • metadesc – die Metabeschreibung des Elements
  • Publish_up und Publish_Down – das Datum des Beginns der Veröffentlichung und der De-Veröffentlichung des Elements. Dies ist eher eine Option, findet sich aber in vielen Komponenten.

Wenn wir die Tabellen #__content (Joomla-Artikel), #__contact_details (Kontaktkomponente), #__tags (Joomla-Tags), #__categories (Joomla-Kategoriekomponente) vergleichen, dann finden wir fast alle aufgeführten Datentypen überall.

Wenn die Komponente, für die intelligente Such-Plugins erstellt werden, der „Joomla-Methode“ folgt und deren Architektur erbt, können Sie mit einem Minimum an Methoden in der Plugin-Klasse auskommen. Wenn die Entwickler beschließen, nicht nach einfachen Wegen zu suchen und ihren eigenen Weg zu gehen, müssen Sie den harten Weg gehen und fast alle Methoden der Adapter-Klasse neu definieren.

getListQuery()-Methode

Diese Methode wird in 3 Fällen aufgerufen:

  1. Die Methode getContentCount() der Adapter-Klasse dient dazu, die Anzahl der indizierten Elemente abzurufen (wie viele Artikel insgesamt, wie viele Produkte insgesamt usw.). The anatomy of smart search in Joomla art Creating a plugin I. Joomla Smart Search Indexierungsprozess Sie können die Anzahl der indizierten Elemente im Debug-Modus sehen.
  2. Die getItem($id)-Methode der Adapter-Klasse dient dazu, ein bestimmtes indiziertes Element anhand seiner ID abzurufen. Die Methode getItem() wiederum wird in der Methode reindex($id) aufgerufen – während der Neuindizierung.
  3. Die Methode getItems($offset, $limit, $query = null) der Adapter-Klasse ist eine Methode zum Abrufen einer Liste indizierter Elemente. Offset und Limit werden basierend auf den Komponenteneinstellungen festgelegt – wie viele indizierte Elemente im „Bündel“ enthalten sein sollen. The anatomy of smart search in Joomla art Creating a plugin I. Joomla 5 Smart Search Settings Indexer Batch-Größe

Sehen wir uns ein Beispiel für die Implementierung in Joomla-Kern-Plugins an:

<?php

/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Wtjoomshoppingfinder
 *
 * @copyright   (C) 2023 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Database\DatabaseInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder;

return new class () implements ServiceProviderInterface {
    /**
     * Registers the service provider with a DI container.
     *
     * @param   Container  $container  The DI container.
     *
     * @return  void
     *
     * @since   4.3.0
     */
    public function register(Container $container)
    {
        $container->set(
            PluginInterface::class,
            function (Container $container) {
                $plugin     = new Wtjoomshoppingfinder(
                    $container->get(DispatcherInterface::class),
                    (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder')
                );
                $plugin->setApplication(Factory::getApplication());

                // Our plugin uses DatabaseTrait, so the setDatabase() method appeared 
                // If it is not present, then we use only setApplication().
                $plugin->setDatabase($container->get(DatabaseInterface::class));

                return $plugin;
            }
        );
    }
};
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Die Methode getListQuery() gibt ein DatabaseQuery-Objekt zurück, ein Objekt des Abfragekonstruktors, in dem der Name der Tabelle und die Felder zur Auswahl bereits angegeben sind. Die Arbeit damit wird in den Methoden fortgesetzt, die es aufrufen.

Wenn getListQuery() von getContentCount() im DatabaseQuery $query-Objekt aufgerufen wird, werden die eingestellten Werte für select durch COUNT(*) ersetzt.

Wenn getListQuery() von getItem($id) aufgerufen wird, gilt die Bedingung $query->where('a.id = ' . (int) $id) und es wird nur ein bestimmtes Element ausgewählt. Und schon hier sehen wir, dass die übergeordnete Adapterklasse den Tabellennamen in der Abfrage als.* enthält. Das bedeutet, dass wir diese Präfixe auch in unserer Implementierung der getListQuery()-Methode verwenden sollten.

Im Falle des Aufrufs von getListQuery() aus getItems() werden $offset und $limit zu der von uns erstellten Abfrage hinzugefügt, um durch die Liste der zu indizierenden Elemente zu navigieren.
Zusammenfassung: getListQuery() – muss ein „Arbeitsstück“ für drei verschiedene SQL-Abfragen enthalten. Und es ist hier nichts besonders Schwieriges, Joomla zu implementieren. Bei Bedarf können Sie jedoch drei Methoden selbst implementieren, ohne getListQuery() zu erstellen.

Nicht Joomla-Methode: Im Fall von JoomShopping bin ich auf die Tatsache gestoßen, dass ein Produkt mehrere Kategorien haben kann und in der Vergangenheit die Kategorie-ID-Komponente (Catid) für das Produkt in einer separaten Tabelle gespeichert wurde. Gleichzeitig war es viele Jahre lang nicht möglich, die Hauptkategorie für das Produkt festzulegen. Nach Erhalt der Produktkategorie wurde eine Abfrage an die Tabelle mit Kategorien gesendet, wo nur das erste Abfrageergebnis übernommen wurde, sortiert nach der Standardkategorie-ID – also aufsteigend. Wenn wir beim Bearbeiten eines Produkts die Kategorie geändert haben, war die Hauptproduktkategorie diejenige mit der niedrigeren ID-Nummer. Die URL des Produkts basierte darauf und das Produkt konnte von einer Kategorie zur anderen springen.

Aber vor fast 2 Jahren wurde dieses JoomShopping-Verhalten behoben. Da die Komponente eine lange Geschichte und ein großes Publikum hat und die Abwärtskompatibilität nicht einfach aufgehoben werden kann, wurde der Fix optional gemacht. Die Möglichkeit, die Hauptkategorie für das Produkt anzugeben, muss in den Komponenteneinstellungen aktiviert sein. Anschließend wird die main_category_id mit den Produkten in die Tabelle eingetragen.

Aber diese Funktionalität ist standardmäßig deaktiviert. Und im intelligenten Such-Plugin müssen wir die Parameter der JoomShopping-Komponente abrufen und prüfen, ob die Option zum Angeben der Hauptproduktkategorie aktiviert ist (und es wurde möglicherweise kürzlich aktiviert und die Hauptkategorie für einige Produkte ist nicht angegeben – ebenfalls eine Nuance …) und generiert eine SQL-Abfrage, um das/die Produkt(e) basierend auf den Komponentenparametern zu erhalten: entweder eine einfache Abfrage, bei der wir das Feld main_category_id hinzufügen , oder ein JOIN-Anfrage, um die Kategorie-ID auf die alte falsche Weise zu erhalten.

Bei dieser Anfrage kommt sofort die Nuance der Mehrsprachigkeit zum Vorschein. Gemäß der Joomla-Methode wird für jede Sprache der Website ein separates Element erstellt und es werden Verknüpfungen zwischen ihnen eingerichtet. Also für die russische Sprache - ein Artikel. Der gleiche Artikel auf Englisch wird separat erstellt. Dann verbinden wir sie über Sprachzuordnungen miteinander und beim Wechsel der Sprache im Joomla-Frontend werden wir von einem Artikel zum anderen weitergeleitet.

So wird es in JoomShopping nicht gemacht: Daten für alle Sprachen werden in derselben Tabelle mit Produkten gespeichert (Ok). Das Hinzufügen von Daten für andere Sprachen erfolgt durch Hinzufügen von Spalten mit dem Suffix dieser Sprachen (hmm...). Das heißt, wir haben nicht nur ein Titel- oder Namensfeld in der Datenbank. Aber es gibt Felder name_ru-RU, name_en-GB usw.
The anatomy of smart search in Joomla art Creating a plugin I.
Strukturfragment der Joomla JoomShopping-Produkttabelle
Gleichzeitig müssen wir eine universelle SQL-Abfrage entwerfen, damit sie sowohl über das Admin-Panel als auch über die CLI indiziert werden kann. Gleichzeitig ist auch die Auswahl der Indizierungssprache beim Starten der CLI mit CRON eine Aufgabe. Ich gebe zu, dass ich zum Zeitpunkt des Schreibens dieses Artikels eine umfassende Lösung dieses Problems vorerst verschoben habe. Die Sprache wird mit unserer eigenen getLangTag()-Methode ausgewählt, wobei wir entweder die Hauptsprache aus den JoomShopping-Parametern oder die Standardsprache der Website übernehmen. Das heißt, diese Lösung gilt bisher nur für eine einsprachige Website. Die Suche in verschiedenen Sprachen funktioniert noch nicht.

3 Monate später habe ich dieses Problem jedoch gelöst, allerdings bereits im Smart Search Plugin für die SW JProjects-Komponente. Ich werde Ihnen die Lösung weiter erläutern.

Schauen wir uns in der Zwischenzeit an, was bei JoomShopping passiert ist

<?php

/**
 * @package     Joomla.Plugin
 * @subpackage  Finder.Wtjoomshoppingfinder
 *
 * @copyright   (C) 2023 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

\defined('_JEXEC') or die;

use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\Database\DatabaseInterface;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\Plugin\Finder\Wtjoomshoppingfinder\Extension\Wtjoomshoppingfinder;

return new class () implements ServiceProviderInterface {
    /**
     * Registers the service provider with a DI container.
     *
     * @param   Container  $container  The DI container.
     *
     * @return  void
     *
     * @since   4.3.0
     */
    public function register(Container $container)
    {
        $container->set(
            PluginInterface::class,
            function (Container $container) {
                $plugin     = new Wtjoomshoppingfinder(
                    $container->get(DispatcherInterface::class),
                    (array) PluginHelper::getPlugin('finder', 'wtjoomshoppingfinder')
                );
                $plugin->setApplication(Factory::getApplication());

                // Our plugin uses DatabaseTrait, so the setDatabase() method appeared 
                // If it is not present, then we use only setApplication().
                $plugin->setDatabase($container->get(DatabaseInterface::class));

                return $plugin;
            }
        );
    }
};
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Kontrollpunkt

Wir haben eine Methode zum Abfragen der Datenbank von Joomla erstellt und viel über die Funktionsweise des Smart-Search-Plugins gelernt.

Im nächsten Artikel erstellen wir eine Methode zur Indizierung von Inhalten und schließen die Erstellung des Plugins ab. Wir werden uns auch damit vertraut machen, wie indizierte Elemente in der Datenbank gespeichert werden, verstehen, warum dies wichtig ist, und das Problem der Indizierung von Inhalten für mehrsprachige Komponenten mit einer nicht standardmäßigen Implementierung der Mehrsprachigkeit lösen.

Ressourcen der Joomla-Community

  • https://joomla.org/
  • Dieser Artikel im Joomla Community Magazine
  • Joomla-Community-Chat in Mattermost (weiterlesen)

Das obige ist der detaillierte Inhalt vonDie Anatomie der intelligenten Suche in der Joomla-Kunst. Erstellen eines Plugins I.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage