Deutschland United States United Kingdom
ContentLion - Open Source CMS

Suchfunktion

Suchfunktion

Habe jetzt mal die Grundlagen für die Such-Funktion als Plugin geschaffen, welches meiner Meinung nach sehr erweiterbar ist.
In den Settings kann man auswählen, welche Such-Funktion man von den einzelnen Plugins gerade verwenden möchte.

Dazu führen Plugins in der activate.php folgenden Code aus:

PHP-Quelltext

1
Plugin_Search_Search::addSearchModul ($title$class$plugin$activated 1);

$plugin ist der Plugin-Pfad, wie er in der info.php steht, damit man dann die Such-Funktionen beim Deinstallieren eines Plugins einfach löschen kann.

Deinstallation mit deactivate.php:

PHP-Quelltext

1
Plugin_Search_Search()::deleteSearchModulByPlugin ($plugin);

Hier wird lediglich wieder $plugin (Plugin-Pfad) benötigt, weßhalb das Ganze ganz einfach sein sollte. ;)

Jedes Such-Plugin muss eine Klasse erstellen, die z.B. wie folgt aussieht:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

class Plugin_<Mein Plugin>_<Meine Klasse> extends Plugin_Search_Search {

    //Muss bei anderen Such-Funktionen überschrieben werden.
    public function getSearchBox () {
        $template = new Template();
        $template->load("plugin_search_searchbox");

        $template->assign_var('ACTION'$this->url);

        echo($template->getCode());
    }

    public function showPage () {

        if (isset($_REQUEST['search']) && !empty($_REQUEST['search'])) {
            $anfrage DataBase::Current()->EscapeString($_REQUEST['search']);
        } else {
            $anfrage null;
            return null;
        }

        $template = new Template();
        $template->load("plugin_<Dein Plugin>_<Template-Datei ohne .html>");

        echo $template->getCode();

    }

    public function getResults ($anfrage) {
        return array();
        //...
    }

}

?>

Übrigens muss der Klassen-Name oben bei $class (activate.php) eingetragen werden.

showPage() wird aufgerufen, wenn die Seite index.php?include=search (ohne ModRewrite) aufgerufen wird, getSearchBox() muss die Such-Box (das Such-Formular) zurückgeben oder einfach per echo() ausgeben und dabei mit action="" auf index.php?include=search verweisen.

Download
Sorry, aber da die eig. Suchfunktion noch nicht fertig ist, kann ich derzeit nur eine Developer-Version raushauen, damit andere wenigstens schon mal Such-Algorhytmen / Such-Funktionen schreiben können... :(
Download: http://contentlion.kingdom-of-lords.de/search_developer.zip

EDIT:
Natürlich muss das Plugin vorher testen, ob das Plugin "search" auch installiert ist. ;)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »JuKu« (9. November 2012, 18:49)


Sehr guter Ansatz, so hab ich mir das vorgestellt! Werde das Plugin am Wochenende mit deinen anderen Plugins testen ;-)

Supi! ;)

Habe noch eine Methode hinzugefügt:

PHP-Quelltext

1
Plugin_Search_Search::setSearchModule($class);


Setzt das aktuelle Such-Modul, sodass der User nicht erst die Einstellungen umändern muss. ;)
(In den Einstellungen werden alle Such-Module angezeigt und können ausgewählt werden, je nach dem, welches man verwenden möchte; durch diese Methode können die Plugins bei der Installation ihr Modul als das "benutzte" setzen, um den Admins die Arbeit noch mehr zu erleichtern.)

Events
Die Klasse wirft wegen der Erweiterbarkeit auch zusätzlich noch ein paar Events. :D

Event-Name | Beschreibung | Parameter
set_search_module | Wird beim Aufruf der Methode setSearchModule() geworfen. | array('class' => $class, 'old_class' => $old_class)
add_search_module | Dieser Event wird beim Hinzufügen eines Modules geworfen. | array('title' => $title, 'class' => $class, 'plugin' => $plugin, 'activated' => $activated)
delete_search_module | Dieser Event wird gerufen, wenn ein Such-Modul gelöscht wird. | array('plugin' => $plugin, 'set_new_module' => $set_new_module)

$set_new_module enthält true, wenn das aktuelle Such-Modul dem entsprach, welches gelöscht werden sollte (also das Standart-Such-Modul wieder gesetzt wurde), ansonsten false.

@stevieswebsite:
Wäre es möglich, dass auch alle (neuen) Events, die das Plugin wirft, mit in die Package.xml-Datei aufgenommen werden können? :D

Noch haben die Plugins keine package.xml, wird ja am Server generiert, könnte man aber machen.

Du solltest hier nochmal einen Blick auf SQL-Injektions werfen, hab einige Stellen gefunden, die nicht escaped wurden. Aber wie gesagt, Struktur sieht schon gut aus ;-)

Jep, kann sein, werde ich noch machen. ;)

Hab grad gesehen, dass du im Branch die sys für die Suche erweitert hast. Mach das mal besser direkt über das Plugin, also ohne Änderung vom Core.

Muss ja deine Sachen bald auch noch mergen ;-)

Hab das plugin eingebunden und wie komme ich jetzt auf plugin selbst drauf? also das ich quasi die suche benutzen kann hab das problem nämlich grad bei mehren plugins oder muss ich erst iwie eine seite erstellen oder so?

Da fehlt noch die nötige Infrastruktur im Core. :D
Füge in den Skin einfach folgendes ein:

PHP-Quelltext

1
EventManager::RaiseEvent("search_box", array('page' => Page::Current(), 'user' => User::Current()->name'userid' => User::Current()->id));


Dann siehst du das Such-Feld, aber ganz fertig ist das alles auch noch nicht. ;)