Hallo Forum!
Sicherlich ist es eine triviale Funktion und ich sehe nur mangels tiefergehender Kenntnis den Wald vor lauter Bäumen nicht.
Ich möchte gerne für alle Nachrichten eine Auto-Link-Funktion einbauen. Im Hintergrund habe ich eine Tabelle in der Suchwort/Ersatzurl/Titel stehen. Diese möchte ich auf alle Nachrichten anwenden, dass die Suchwörter aus der Tabelle in den Nachrichten automatisch gefunden und verlinkt werden - auch (und vor allem) für den bereits bestehenden Content. Ohne Worker und nicht nur "ab sofort bei neuen Einträgen", sondern dann halt on the fly.
Ich bin nun soweit dass ich ein kleines Plugin mit einem EventListener auf HtmlOutputNodeProcessor (beforeProcess) geschrieben habe.
Mit $eventObj->getDocument()->getElementsByTagName('p'); hole ich mir die Paragraphen und laufe die in einer Scheife durch.
Prinzipiell kann ich auch die Suchwörter finden in $node->textContent, gegen HTML Code ersetzen kann ich aber nicht. Der Link-HTML-Code wird dann einfach als Text ausgegeben, was zugegebenermaßen auch nicht ganz unverständlich ist.
Also habe ich angefangen wie wild mittels $node->ownerDocument->createElement(); neue Elemente zu erstellen um am Ende die matches vor dem Suchwort, dann das verlinkte Suchwort selbst und dann den match nach dem Suchwort so zusammenzubauen, dass es irgendwie passt. Das ist aber mehr als unelegant und so richtig zum Ziel komme ich damit auch nicht.
Kurz das Wesentliche, auch wenn es eben nicht zielführend ist. Das Ganze nur zu Testzwecken ohne RegExp sondern mit einfachem str_replace.
public function execute($eventObj, $className, $eventName, array &$parameters) {
$nodes = $eventObj->getDocument()->getElementsByTagName('p');
foreach($nodes AS $node){
foreach($this->data AS $key => $val){
if(stristr($node->textContent,$key)){
$node->textContent = str_replace($key, '<a href="$val">'.$key.'</a>', $node->textContent);
}
}
}
}
Nochmal: Ich möchte in allen Nachrichten extern definierte und eingelesene Suchwörter ($this->data) mit einem Link versehen. Wo setze ich da am besten an? Die Möglichkeit dass über die BB-Codes und beim Absenden direkt in den Datensatz zu schreiben, möchte ich vermeiden, da die Liste sich häufiger mal ändert und zum anderen das Forum seit 2001 existiert - der meiste Content also bereits geschrieben ist, die Suchwörter überschaubar, aber in recht häufiger Anpassung.
Ich glaube bei HtmlOutputNodeProcessor bin ich in eine Sackgasse gefahren bzw. setze zu spät an?!
Kann mir hier jemand einen Tipp geben an welcher Stelle ich falsch abgebogen bin und wo ich eigentlich hin muss?
Schöne Ostern!
Armin