[ zgas @ 27.11.2009. 12:12 ] @
Pravim visejezicni sajt na srpskom i engleskom.
Koristim MVC Zend Framewrok.
Zend Framework iscitava URL RUTU na klasican nacin po semi:

http://domen.com/module/controller/action

zelim da u ovoj url ruti pre svih parametara imam parametar jezika:

http://domen.com/language/module/controller/action

da li imate ideju kako to implementirati?

Klasican nacina rade zend rutera je:
ako ne postoji modul pod tim imenom on trazi da li pod tim imenom postoji kontroler,
ako ne postoji kontroler pod tim imenom on trazi akciju po istim tim imenom.


[ Nikola Poša @ 27.11.2009. 13:40 ] @
Za početak moraš da kreiraš novu rutu:
Code:

$route = new Zend_Controller_Router_Route(
    ':lang/:controller/:action/*',
    array(
        'lang'       => 'sr',
        'module'     => 'default',
        'controller' => 'index',
        'action'     => 'index'
    )
);

Takva ruta će da "hvata" ovako nešto:
http://www.test.com/ -> jezik - srpski, modul - default, kontroler - index
http://www.test.com/en/foo/bar -> jezik - engleski, modul - default, kontroler - foo, akcija - bar.
[ zgas @ 27.11.2009. 14:35 ] @
Da, to je moglo bi se reci brzo i efikasno resenje, ali ono ima nedostatak(ke) koji zelim da izbegnem:

Ako zelim da pozovem "default" modul, "indeks" kontroler, "kontakt" akciju na srpskom moram da pisem:

http://domen.com/sr/default/index/kontakt/

a zeleo bi da to pisem kao standarno sto se koristi:

http://domen.com/sr/kontakt/

Onaj dugacki oblik jedino dolazi u obzir ako modul nije 'default', a kontroler nije 'index'.

Sta tu moze da se uradi?
[ Nikola Poša @ 27.11.2009. 14:57 ] @
E pa ja najpre nisam znao da će taj tvoj sajt imati više modula, tako da bi ona ruta koju sam poslao bila neupoterbljiva, jer njoj nikako ne možeš da proslediš neki drugi modul kao parametar. To bi onda trebalo izmeniti ovako:
Code:

$route = new Zend_Controller_Router_Route(
    ':lang/:module/:controller/:action/*',
    array(
        'lang'       => 'sr',
        'module'     => 'default',
        'controller' => 'index',
        'action'     => 'index'
    )
);

E sad, za to prepravljanje koje tražiš moraš da dodaš još jednu rutu, preko ove prethodne, npr. ovako nešto:
Code:

$route1 = new Zend_Controller_Router_Route(
    ':lang/:action/*',
    array(
        'lang'       => 'sr',
        'module'     => 'default',
        'controller' => 'index',
        'action'     => 'index'
    )
);

I sad bi trebalo da kad dođe neki ovakav zahtev: http://domen.com/sr/kontakt, da ga on prerutira na tu drugu rutu, odnosno, na "default" modul, "index" kontroler i "kontakt" akciju.
[ batika @ 27.11.2009. 15:22 ] @
Savetujem ti da za svaki tip url-a pises novu routu da bi imao user friendly linkove.

Upravo ovakav problem sam i ja imao, i resio sam ga sa 30-tak routa.

Pozdrav
[ zgas @ 27.11.2009. 15:28 ] @
Auuu 'phpandjelko' šta ako imam preko 200 stranica?!

Nadam se Nikola da ce raditi to sto si predlozio.
[ kazil @ 27.11.2009. 16:35 ] @
A jeste se vec poigrali sa chain-ovima? ;)

http://framework.zend.com/issu...Acomment-tabpanel#action_30871

http://framework.zend.com/manu...controller.router.routes.chain
[ kazil @ 27.11.2009. 17:33 ] @
Evo jedan primer sa chain-ovima:

Code:

     public function _initRoutes()
    {
        $this->bootstrap('FrontController');
        $this->_frontController = $this->getResource('FrontController');
        $router = $this->_frontController->getRouter();

        $langRoute = new Zend_Controller_Router_Route(':lang', array('lang' => 'en'));
        $fooRoute = new Zend_Controller_Router_Route_Static(
            'contact',
            array('controller'=>'index', 'action'=>'index')
        );
        $defaultRoute = new Zend_Controller_Router_Route(
            ':controller/:action',
            array(
                'module'=>'default',
                'controller'=>'index',
                'action'=>'index',
            )
        );

        $fooRoute = $langRoute->chain($fooRoute);
        $defaultRoute = $langRoute->chain($defaultRoute);
        
        $router->addRoute('langRouter', $langRoute);
        $router->addRoute('defaultRouter', $defaultRoute);
        $router->addRoute('fooRouter', $fooRoute);
    }


/ => /index/index/lang/en
/sr => /index/index/lang/sr
/sr/contact => /index/index/lang/sr
/sr/foo/ => /foo/index/lang/sr
/sr/foo/bar => /foo/bar/lang/sr

:)

Edit: dodao "langRouter" na router.

[Ovu poruku je menjao kazil dana 27.11.2009. u 18:54 GMT+1]
[ zgas @ 27.11.2009. 18:08 ] @
Ne mogu da shvatim chain-ove.

Ono što je Nikola Poša napisao o registraciji više ruta jedna preko druge mi je mnogo razumljivije i mogu da shvatim princip rada, a nadam se da će i raditi.
[ kazil @ 27.11.2009. 18:21 ] @
Pa prvo napravis route za jezik, pa posle svi ostali route-ovi nasledjuju, nadovezuju - chain-uju - taj route:

Code:

// na langouge route chain-uj default route
$defaultRoute = $langRoute->chain($defaultRoute);


Ovo zapravo daje :lang/:controller/:action

Ovako route za jezik definises samo na jednom mestu, a i kod ostalih route-a ne moras jos dodatno da vodis racuna o jeziku.
[ Nikola Poša @ 27.11.2009. 18:22 ] @
Baci pogled na ovaj tutorijal. Tu imaš primer sa chain-ovanjem "language" i standardne rute.
[ zgas @ 27.11.2009. 18:37 ] @
Hvala 'kazil' sada mi je jasno.
Hvala i Nikola bas je kompletan tutorijal.

Radim ponekad u Zendu i sada mi je jasno kako cu to izvesti.

Jednino ne znam kako to da izvrdem u sopstvenom Framework-u koji sam razvio.
Uradio sam dinamcko i staticko rutovanje kao kod zenda, ali nema chain
i ne znam koliko je komplikovana da ga razvijam i implementiram u moj Framework.

[ batika @ 27.11.2009. 20:16 ] @
Ok. Nisam imao toliko URL-ova.

A nisam radio sa chainovima.

Basicu, sad si pisao blog o chainovanju...
[ kazil @ 27.11.2009. 20:27 ] @
Da, pretocio sam ovaj primer od malopre u post :P

Btw, ne znam da li znate za prevodjenje route-a, mozda ce vam i to biti interesantno:
http://framework.zend.com/manu...s.standard.translated-segments
[ batika @ 27.11.2009. 20:36 ] @
Basicu brate jel ti ikad odmaras?
Sa posla na posao...
[ kazil @ 27.11.2009. 20:39 ] @
Kad se bavis sa onim sto volis, onda to i nije posao ;)
[ gidraa1 @ 28.11.2009. 22:30 ] @
Imam jednostavno pitanje za poznavaoce Zend Frameworka pa posto se tice ruta da ne otvaram novu temu.Imam ovakvu rutu
Code:

$Router->addRoute("test", new Zend_Controller_Router_Route("test1/test",array("controller" => "test1", "action" => "blablabla") ));


E sad to radi i to je ok.Nego posledica toga je da za svaki nov url MORAM praviti rutu da bi se view scripta mogla pozvati.Primer, imam kontroler test1, i u njemu sad akciju novaAction() { } i u view/scripts/nova.phtml, i sad kada pozovem localhost/test1/nova izbaci kao da stranica ne postoji, a kada dodam rutu za tu novaAction onda normalno radi.Pitanje moje bi glasilo, da li to tako treba da bude i da li se moze izbeci nekako.Glupo mi je sad da moram za svaki url praviti rutu samo zato sto sam za jedan url hteo.