dracoblue.net

Action/View/Module und Route in Agavi rausfinden

Für jedes Module, jede Action(+View) gibt es den ExecutionContainer (AgaviExecutionContainer). Wenn Du also das aktuelle Module, die ausgeführte Action oder den View rausfinden möchtest, machst Du das am einfachsten so:

$action = $this->getContext()->getActionName();
$view = $this->getContext()->getViewName();
$module = $container->getModuleName();

Aber was, wenn Du die "richtige" Action rausfinden möchtest? Die einzig wahre - für den Request? Das ist ein kleines bisschen schwieriger. Hier eine kurze Erklärung wie und warum das geht.

Wann immer man Agavi die Arbeit machen lässt (Umwandeln von Eingabedaten und dem eigentlichen Webbrowseraufruf des Users, in validierte Daten), passiert immer das gleiche. Es wird eine Action gestartet, der View für den passenden Outputtype ausgeführt und das Template gefüllt. Beim Erstellen eines Slots (z.B. aus der View herraus) wird wieder Validierung+Action+View für die Slot-Parameter ausgeführt.

Deshalb kann der echte die Request-Route nicht im ExecutionContainer gefunden werden, sondern irgendwo anders. Im Request.

$route_names = $this->getContext()->getRequest()->getAttribute(
                    'matched_routes', 'org.agavi.routing'
                );

Die Variable $route_names enthalt dann ein Array mit allen Route-Namen:

array(
    'product.edit'
    // Die aktuelle Route heißt "product.edit"
    // in der routing.xml
)

Diese Information hilft uns indirekt um nun auf die Action zu kommen, welche eigentlich ausgeführt wurde. Da das WebRouting auch eine getRoute-Methode hat, welche nur einen route_name erwartet, können wir die Information nun einfach auslesen:

// wir wollen nur die erste route, deswegen
// im Stil list($first) = $array
[strong]list($route_name)[/strong] = $this->getContext()->getRequest()->getAttribute(
    'matched_routes', 'org.agavi.routing'
);

$route = $this->getContext()->getRouting()->getRoute($route_name);

Die neue $route-Variable beinhaltet nun alle Informationen über die Route. In unserem Fall ist aber nur spezielles wichtig.

$module = $route['opt']['module'];
$action = $route['opt']['action'];

Diese Methode sollte man wirklich

nur benutzen, wenn man einen universellen Slot hat, weöcher direkt in einer output_types.xml oder in verschiedenen Seiten benutzt wird und selbstständig und über das modul+action rausfinden kann, wo er eigentlich eingebunden ist.

In agavi, open source, php by @ 05 Mar 2009

comments powered by Disqus

Recent Files

Advertisement

Recent Dev-Articles

Read recently

About

Blogroll