Nachtrag 2: Einem Plugin eigene Seiten im Adminbereich zu geben ist relativ simpel. Soll die Seite aber im offenen Bereich des Blogs dargestellt werden, wird das Verfahren etwas komplizierter. Denn anstatt einfach auf das Event zu warten, das beim Besuchen unserer Seite geworfen wird, muss bei jedem Seitenaufruf geschaut werden, ob dies nicht unsere Seite ist.
Das listsearch-Plugin dient mir als Beispiel, wobei ein Großteil des Codes direkt dem contactform-Plugin entnommen ist.
Prüfen
Kern des ganzen ist also zu erkennen, ob dies die richtige Seite ist. Deshalb ist selected() die wichtigste Funktion. Sie gibt immer dann true aus, wenn der Seitenname "searchresults" an der richtigen Stelle in der URL ist.
function selected() {
global $serendipity;
if (!empty($serendipity['POST']['subpage'])) {
$serendipity['GET']['subpage'] = $serendipity['POST']['subpage'];
}
if (
$serendipity['GET']['subpage'] == '/index.php?/searchresults'
||
preg_match('@^' . preg_quote($serendipity['serendipityHTTPPath'].'searchresults') . '@i', $serendipity['GET']['subpage'])
) {
return true;
}
return false;
}
Im richtigen Moment Darstellen
Leider ist das Zeigen der Seite nicht ganz einfach. Obwohl es im Grunde nur ein Event ist:
case 'entries_header':
if ($this->selected()) {
$this->show();
}
Wobei show() dann die Seite ausgibt und weiter unten beschrieben wird. Doch es müssen noch zwei weitere Events gefangen werden, damit alles passt. Um den Seitentitel zu setzen, ist 'genpage' gefragt:
case 'genpage':
$args = implode('/', serendipity_getUriArguments($eventData, true));
if ($serendipity['rewrite'] != 'none') {
$nice_url = $serendipity['serendipityHTTPPath'] . $args;
} else {
$nice_url = $serendipity['serendipityHTTPPath'] . $serendipity['indexFile'] . '?/' . $args;
}
if (empty($serendipity['GET']['subpage'])) {
$serendipity['GET']['subpage'] = $nice_url;
}
if ($this->selected()) {
$serendipity['head_title'] = QUICKSEARCH;
$serendipity['head_subtitle'] = htmlspecialchars($serendipity['blogTitle']);
}
break;
Wichtiger noch als ein guter Titel ist, dass außer unserem Inhalt keine anderen Beiträge auftauchen. Dafür muss 'clean_page' gesetzt werden:
case 'entry_display':
if ($this->selected()) {
if (is_array($eventData)) {
$eventData['clean_page'] = true; // This is important to not display an entry list!
} else {
$eventData = array('clean_page' => true);
}
}
return true;
break;
show()
Nun ist klar, wann wir etwas anzeigen. Im Idealfall wird aber nun nicht einfach irgendwas ausgegeben, sondern die Ausgabe Smarty übergeben. Daher ist show() gar nicht so simpel, deshalb hier nur der elementare Teil:
function show() {
...
if (!headers_sent()) {
header('HTTP/1.0 200');
header('Status: 200 OK');
}
if (!is_object($serendipity['smarty'])) {
serendipity_smarty_init();
}
$serendipity['smarty']->assign(
array(
'results' => $results
)
);
$template = 'listsearch.tpl';
$tfile = serendipity_getTemplateFile($template, 'serendipityPath');
#serendipity_getTemplateFiles returns filename if no file found
#in the templates instead of false (?)
if ($tfile == $template) {
$tfile = dirname(__FILE__) . "/$template";
}
$inclusion = $serendipity['smarty']->security_settings[INCLUDE_ANY];
$serendipity['smarty']->security_settings[INCLUDE_ANY] = true;
$content = $serendipity['smarty']->fetch('file:'. $tfile);
$serendipity['smarty']->security_settings[INCLUDE_ANY] = $inclusion;
echo $content;
}
Es wird der richtige header für eine gefundene Seite ausgegeben, Smarty initialisiert falls es noch nicht getan wurde und danach die listsearch.tpl mit den gefundenen Beiträgen ($results) gefüllt. An dieser Stelle könnte man natürlich noch viel mehr übergeben, so reicht der echte Code an dieser Stelle noch die Trefferanzahl weiter.
Nun kann die Seite "index.php?/searchresults" des Blogs aufgerufen werden.