Navigieren
Dieser Artikel befasst sich mit dem Navigieren zwischen Seiten. Weiter wird erklärt, wie du Seiten in deiner Applikation identifizieren kannst.
MurlPage
Murl
steht für "Magic URL". Mit page\model\nav\murl\MurlPage
können Seiten auf magisch einfache Weise verlinkt werden.
Denke daran, dass Page Controller normale Entities sind. Für jede erfasste Seite wird eine Instanz einer PageController-Entity in der Datenbank gespeichert. Möchtest du also eine bestimmte Seite verlinken, kannst du zum Beispiel über den EntityManager den Page Controller dieser Seite abfragen und ihn dazu verwenden, mit MurlPage::obj()
einen Link zu dieser Seite zu generieren.
Der BlogPageController
der Blog-Seite einer bestimmten Kategorie (siehe Beispiel 2 des Artikels Konfigurierbare Page Controller) lässt sich zum Beispiel folgendermassen abfragen:
$criteria = $em->createSimpleCriteria(BlogPageController::getClass(), array('category' => $category)); $targetBlogPageController = $criteria->toQuery()->fetchSingle();
Hast du den passenden BlogPageController
gefunden, kannst du MurlPage::obj()
nutzen, um die Ziel-Seite zu verlinken. In einer HtmlView könnte dies folgendermassen aussehen:
$html->link(MurlPage::obj($targetBlogPageController)->pathExt(array('detail', $blogArticle->getId())));
Im oben stehenden Beispiel erweitern wir die Url zur Ziel-Seite um den Pfad detail/{blogArticleId}
. Informationen über weitere URL-Manipulationsmöglichkeiten findest du in der API-Dokumentation.
Du kannst MurlPage
natürlich auch in Controllern ...
class ExampleController extends ControllerAdapter { public function doFoo() { // code $this->redirect(MurlPage::root()); } }
... oder kontextunabhängig nutzen.
MurlPage::current()->toUrl($n2nContext)
Das oben stehende Beispiel generiert eine URL zur aktuellen Seite.
Um zu überprüfen, ob eine Zielseite vorhanden ist, kannst du $view->buildUrl()
nutzen. So kannst du sicherstellen, dass eine Zielseite vorhanden ist, bevor du einen Link oder Codeblock ausgibst.
Folgendes Beispiel prüft ob eine Url existiert und gibt nur dann den Code aus:
<?php if (null !== ($url = $view->buildUrl(MurlPage::home(), false))): ?> <div class="link-wrapper"> <?php $html->link($url) ?> </div> <?php endif ?>
MurlPage
findest du in der API-Dokumentation. Weitere Anwendungs-Beispiele für Murls im Allgemeinen findest du im Artikel Murl.Tags
Du kannst Seiten mit Tags auszeichnen, die dir helfen, diese identifizieren zu können. Dies hilft dir beim Erstellen von Links, Navigationen usw. Für jede Seite wird der Name des PageControllers sowie der Name der jeweiligen Page-Methode automatisch als Tag hinzugefügt. Hast du zum Beispiel nur eine Seite vom Typ "blogPage" aus BlogPageController
erfasst (siehe Beispiel 2 des Artikels Konfigurierbare PageController), so lässt sich diese Seite ohne weitere Tags identifizieren.
Nutze MurlPage::tag()
, um einen Link zu einer Seite mit entsprechenden Tags zu generieren.
<?php $html->link(MurlPage::tag(BlogPageController::class, 'blogPage')) ?>
Sind aber mehrere Seiten dieses Typs erfasst, müssen wir die gewünschte Seite genauer identifizieren können. Hierfür gibt uns der PageController die Möglichkeit, über die Methode getAdditionalTagNames()
weitere Tags zu definieren.
class BlogPageController extends PageController { private static function _annos(AnnoInit $ai) { $ai->p('category', new AnnoManyToOne(Category::getClass())); $ai->m('blogPage', new AnnoPage()); } private $category; public function getCategory() { return $this->category; } public function setCategory(Category $category) { $this->category = $category; } protected function getAdditionalTagNames(): array { return array($this->category->getId()); } public function blogPage(BlogController $blogController, array $delegateCmds = null) { $blogController->setCategory($this->category); $this->delegate($blogController); } }
BlogPageController::blogPage()
soll die Blog-Artikel der in der Eigenschaft BlogPageController::$category
definierten Kategorie anzeigen. Im oben stehenden Beispiel haben wir nun die Tags um die Id dieser Kategorie ergänzt. Diese können wir nun verwenden, um einen Link zur Blog-Seite einer bestimmten Kategorie zu generieren.
<?php $html->link(MurlPage::tag(BlogPageController::class, 'blogPage', $targetCategory->getId()) ->pathExt(array('detail', $blogArticle->getId())) ?>
Hooks
Wie im Artikel Hooks beschrieben, kann der Rocket-Nutzer Seiten mit "Hooks" kennzeichnen. Ein Link zu einer mit Hook "foo" gekennzeichneten Seite lässt sich zum Beispiel folgendermassen generieren:
<?php $html->link(MurlPage::hook('foo')) ?>
Hooks eignen sich aber besonders, um das Hauptelement eines Navigations-Bereichs zu kennzeichnen.
<?php $pageHtml->navigation(Nav::hook('asideNav')) ?>
Im oben stehenden Beispiel generieren wir eine Navigation ausgehend von der Seite, die mit dem Hook "asideNav" gekennzeichnet ist. Hiermit lässt sich zum Beispiel eine Aside-Navigation für Seiten wie "Impressum", "Disclaimer" usw. generieren.
Hooks können vom Rocket-Nutzer während der Laufzeit beliebig angepasst werden. Sie eignen sich besonders, um Navigations-Bereiche (z. B. "main" oder "aside") zu kennzeichnen. Nutze Hooks also erst, wenn dir Tags nicht mehr weiterhelfen.
Der Unterscheid zwischen Hooks und Tags ist also Folgender: Hooks können vom Rocket-Nutzer selbst den verschiedenen Seiten zugewiesen werden. Die Tags einer Seite werden hingegen vom jeweiligen Page-Controller bestimmt.
PageHtmlBuilder
Der page\ui\PageHtmlBuilder
bietet dir zahlreiche Möglichkeiten, um UI-Elemente (z. B. Navigationen) zu generieren. Informationen und Beispiele findest du in der API-Dokumentation.