Vom: 24.03.2013

HTML Entities im Pimcore Navigation Plugin bzw. der Zend Navigation

Bildschirmfoto 2013-04-09 um 11.25.49 Ausgefallene Menü´s machen es manchmal notwendig direkt im Pimcore Navigationstitel HTML-Entities einzutragen.

<span style="font-size: 2em;">AD</span>
VERTISING

Grundsätzlich werden die HTML-Entities aber von der Zend Navigation escaped.

1. Möglichkeit (etwas unschön)

Das ganze kann ganz einfach umgangen werden, indem man in seinem Controller folgenden Befehl vor seine Navigation schreibt:

$this->view->setEscape('trim');

Bedenklich an dieser Einstellung ist, dass ich mit diesem Befehl die gesamte View-Verarbeitung umstelle und damit höchst wahrscheinlich andere Probleme schaffe.

2. & solide Möglichkeit

Die Anpassung des Zend_View_Helper_Navigation bzw. diesen zu überladen. Schaut man sich in der Klasse Zend_View_Helper_Navigation (zu finden in /pimcore/lib/Zend/View/Helper/Navigation/Menu.php) die Funktion htmlify (Zend_Navigation_Page $page) mal genauer an, sieht man hier im letzten Teil --> $this->view->escape($label) - welcher für das excapen des Menü´s verantwortlich ist. Diesen Teil müssen wir nun mit unserem angepassten Teil überladen. Hierzu habe ich mir im Ordner /website/views/helpers/ eine neue Datei MeinMenu.php angelegt, welche mit Extends obige Klasse erweitert.

class Website_Helper_RobertsMenu extends Zend_View_Helper_Navigation_Menu {

  public function htmlify(Zend_Navigation_Page $page) {
    // get label and title for translating
        $label = $page->getLabel();
        $title = $page->getTitle();

        // translate label and title?
        if ($this->getUseTranslator() && $t = $this->getTranslator()) {
            if (is_string($label) && !empty($label)) {
                $label = $t->translate($label);
            }
            if (is_string($title) && !empty($title)) {
                $title = $t->translate($title);
            }
        }

        // get attribs for element
        $attribs = array(
            'id'     => $page->getId(),
            'title'  => $title,
            'class'  => $page->getClass()
        );

        // does page have a href?
        if ($href = $page->getHref()) {
            $element              = 'a';
            $attribs['href']      = $href;
            $attribs['target']    = $page->getTarget();
            $attribs['accesskey'] = $page->getAccessKey();
        } else {
            $element = 'span';
        }

        // Add custom HTML attributes
        $attribs = array_merge($attribs, $page->getCustomHtmlAttribs());

//        return '<' . $element . $this->_htmlAttribs($attribs) . '>'
//             . $this->view->escape($label)
//             . '';

        return '<' . $element . $this->_htmlAttribs($attribs) . '>'
             . $label
             . '';
  }

  public function RobertsMenu(Zend_Navigation_Container $container = null) {
return $this->menu($container);
  }

}

Wie man sieht escaped MeinMenu jetzt das Label des Menü´s nicht mehr. Wichtig - mann muss natürlich noch den Helper im Autoloader anmelden (/website/lib/Website/Controller/Action.php):

$this->view->addHelperPath(PIMCORE_WEBSITE_PATH . '/views/helpers/', 'Website_Helper');

Jetzt noch der Aufruf im View:

echo $this->navigation()->RobertsMenu()->renderMenu($nav, array("maxDepth" => 0));

In Kürze gibt es auch den Link zur gerade in der Entwicklung befindlichen Website.