Platzhalter Callback

Mit dem Interface \Alvine\Application\Web\Presenter\Callback\ReplacePlaceholderAccess
und dem Trait \Alvine\Application\Web\Presenter\Callback\Implementation\ReplacePlaceholder kann ein View auf die Platzhalter eines Presenters zugreifen.

Der Callback muss als ersten Parameter den $content als Referenz übergeben und der zweite Parameter muss der Presenter sein.

In diesem Beispiel werden im Text diese Platzhalter placeholder{KEY} gesucht.

function(string &$content, \Alvine\Application\Web\Presenter $presenter){
 // Platzhalter ersetzen
 return $this;
}

Der Callback wird in dem Objekt \Alvine\Application\Web\Presenter\Callback\ReplacePlaceholder gespeichert und dem Presenter übergeben. Der Presenter hat in diesem Beispiel eine Methode getPlaceholder(string $key):string die den Wert für den gefundenen Schlüssel zurück liefert.


$presenter=new Class($assembly) extends \Alvine\Application\Web\Presenter\Page implements \Alvine\Application\Web\Presenter\Callback\ReplacePlaceholderAccess {

    use \Alvine\Application\Web\Presenter\Callback\Implementation\ReplacePlaceholder;

    /**
     * liefert einen Platzhalter zurück
     * 
     * @param string $key
     * @return string
     */
    public function getPlaceholder(string $key): string {
        return "Ersetzung";
    }
};

$callback = new \Alvine\Application\Web\Presenter\Callback\ReplacePlaceholder(function (string &$content, \Alvine\Application\Web\Presenter $presenter) {
                if(\preg_match_all('/(?<ph>placeholder\{(?<key>[^}]+)\})/ims', $content, $matches)) {
                    foreach($matches['key'] as $i=> $key) {
                        $content=\str_replace($matches['ph'][$i], $presenter->getPlaceholder($key), $content);
                    }
                }
                return $this;
});

$presenter->addReplaceCallback($callback);

Der View kann dann auf das Interface prüfen und die Callbacks nacheinander aufrufen

 if($presenter instanceof \Alvine\Application\Web\Presenter\Callback\ReplacePlaceholderAccess) {
            foreach($presenter->getReplaceCallbacks() as $callback) {
                $callback->execute($content, $presenter);
            }
}