Potrzebuję niestandardowej trasy dla mojej witryny:

Wszystko takie jak: www.site.com/457485789479 powinno być kierowane do index/index z param ID/45.. wszystko inne powinno działać z domyślnymi ustawieniami zend framework.

Mam taką trasę:

resources.router.routes.test.type = "Zend_Controller_Router_Route"
resources.router.routes.test.route = ":id"
resources.router.routes.test.defaults.module = "default"
resources.router.routes.test.defaults.controller = "index"
resources.router.routes.test.defaults.action = "index"
resources.router.routes.test.defaults.id = ""

Ale teraz "URL ViewHelper" nie działa i wszystko idzie do "/" czy ktoś widzi błąd i może pomóc`?

0
opHASnoNAME 12 sierpień 2011, 21:41

2 odpowiedzi

Najlepsza odpowiedź

Korzystanie z niestandardowej trasy, takiej jak example.com/:id, zastąpi trasę domyślną. Ma to niezamierzone konsekwencje, ponieważ nie będą już działać example.com/:module ani example.com/:controller. Oto, co zrobiłem, aby osiągnąć to, o co prosisz.

Potrzebowałem tego adresu URL dla stron statycznych:

 example.com/about 

Zachowując domyślną trasę, więc to nadal działa

example.com/:module
example.com/:controller

Sposób, w jaki to zrobiłem, polegał na użyciu wtyczki do sprawdzenia, czy moje żądanie może zostać wysłane. Gdyby żądanie nie mogło zostać wysłane przy użyciu domyślnej trasy, zmieniłbym żądanie na odpowiedni moduł, aby załadować moją stronę. Oto wtyczka, którą możesz zmodyfikować do swoich potrzeb:

class My_Controller_Plugin_StaticPageRoute extends Zend_Controller_Plugin_Abstract
{
    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $dispatcher = Zend_Controller_Front::getInstance()->getDispatcher();
        // Can this request be dispatched
        if (!$dispatcher->isDispatchable($request)) {
            // return if not a single level request
            if ('default' != $request->getModuleName() 
                && 'index' != $request->getActionName()) {
                return;
            }
            // Get param to be used in new request ie. example.com/:param
            $param = $request->getControllerName();
            // Set the request where to try next
            $request->setModuleName('default');
            $request->setControllerName('index');
            $request->setActionName('index');
            $request->setParam('id', $param);

            /** Prevents infinite loop if you made a mistake above **/
            if ($dispatcher->isDispatchable($request)) {
                $request->setDispatched(false);
            }

        }

    }
}
0
brady.vitrano 13 sierpień 2011, 00:47

Powinieneś użyć Zend_Controller_Router_Route_Regex zamiast Router_Route

$router->addRoute('router-name', new Zend_Controller_Router_Route_Regex(
            '(\d{2,})',
            array(
                'controller' => 'index',
                'action' => 'index'
            ),
            array(1 => 'id'),
            '%d'
        ));
0
Dmitry Z. 12 sierpień 2011, 22:52