Вопрос про грамотный роутинг!

Итак, я снова ударился в изучение уже новой версии LS и пишу некоторые плагины.
И вот возник такой вопрос по роутингу.
Буду очень благодарен за подсказки.

Например, в конфиге я указал такую конструкцию

Config::Set('router.page.countries', 'PluginGeo_ActionCountry');


таким образом все что будет в браузере набрано domain.com/countries/ пойдет в экшн ActionCountry
урлы будут вида /countries/Ukraine/ или /countries/Ukraine/Kiev/ и так далее.

Можно ли как-то прописать так, чтобы /countries/Ukraine/ шло в экш ActionCountry
а /countries/Ukraine/Kiev/ в ActionCity а /countries/Ukraine/Kiev/Hotels/ в ActionHotel и так далее.

И еще, в экшене ActionCountry я написал так

protected function RegisterEvent()
    {        
        $this->AddEventPreg('/^[\w\-\_]*$/i','actions');       
    }


но когда я пытаюсь сделать вот так:

print_r($this->GetParams())


то при адресах вида /countries/ и /countries/Belarus/ ничего не выдает, пустой массив т.е. НО зато когда есть урл вида /countries/Belarus/Minsk то в него попадает уже Minsk и так далее, а как мне собственно получить все вхождения в урл )

есть вариант такой

$sUrlFull=join('/',$this->GetParams());
        if ($sUrlFull!='') {
            $sUrlFull=$this->sCurrentEvent.'/'.$sUrlFull;
        } else {
            $sUrlFull=$this->sCurrentEvent;
        }


но он не очень красивый мне кажется.

Спасибо всем отозвавшимся )

5 комментариев

avatar
Ладно, оставим пока один вопрос: как из одного экшена вызвать другой?
avatar
экшен не должен «вызываться». это обработчик.
Если нужно обработку разных данных, используй модули. Например Geo_SetCity(oCity);
avatar
Собственно я покопался и сделал пока что так:

В кофиге прописал так:

Config::Set('router.page.countries', 'PluginGeo_ActionCountry');
     Config::Set('router.page.hotels', 'PluginGeo_ActionHotel');
     Config::Set('router.page.paces', 'PluginGeo_ActionPlace');
     Config::Set('router.page.cities', 'PluginGeo_ActionCity');


Создал хук для плагина

HookAction.class.php

в котором такой код

<?php
/**
 * Created by JetBrains PhpStorm.
 * User: USER
 * Date: 12.09.12
 * Time: 21:29
 * To change this template use File | Settings | File Templates.
 */

class PluginGeo_HookAction extends  Hook
{
    public function RegisterHook() {
        $this->AddHook('init_action','InitAction',__CLASS__,900);
    }

    public function InitAction() {

        $sEvent=$sActionReal=Router::GetActionEvent();
        $aParamsNew=$aParamsReal=Router::GetParams();
        $aParamsNew = array_pad($aParamsNew, -(count($aParamsNew)+1), $sEvent);
        $sUrlRequest=implode('/',$aParamsNew);

        if(preg_match('~^([\w_\-]+)$~i',$sUrlRequest,$aMatch))
        {
            Router::Action('countries','country',$aMatch);
        }
        elseif(preg_match('~^([\w_\-]+)/([\w_\-]+)$~i',$sUrlRequest,$aMatch))
        {
            Router::Action('cities','city',$aMatch);
        }
        elseif(preg_match('~^([\w_\-]+)/([\w_\-]+)/(Hotels)$~i',$sUrlRequest,$aMatch))
        {
            Router::Action('hotels','index',$aMatch);
        }
        elseif(preg_match('~^([\w_\-]+)/([\w_\-]+)/(Places)$~i',$sUrlRequest,$aMatch))
        {
            Router::Action('places','index',$aMatch);
        }
    }
}


вроде работает
avatar
$sEvent=$sActionReal=Router::GetActionEvent();
Это убивает совместимость с ранними версиями.

Насчет когда да, можно конечно редиректить то очевидно что удобнее все такие использовать модули )
avatar
ну я тестирую все на последней версии и назад врядли буду откатывать. Но вы правы, код странный и в будущем плохо масштабируемые, а вот про модули пока ничего сказать не могу, не разобрался еще (
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.