2013-10-24 5 views
0

Я хочу, чтобы создать удобный URL, как это:Zend Framework создать удобный URL

mysite.com/flat-sale/london/1-room/1 

Когда части URL является параметры:

flat-sale is post/list/type/1 
london is city/123 
1-room is rooms/1 
and 1 id page/1 

для этого я создал таблицу в базе данных - url_alias. Эта таблица содержит три колонок: помощи, URL, Алиса

Я вставил в этой таблице следующих строк:

1 post/list/type/1 flat-sale 
2 city/123   lonodon 
3 1-room   rooms/1 

Я использую Controller_Plugin для разбора URL:

class My_Controller_Plugin_UrlAlias extends Zend_Controller_Plugin_Abstract { 

    public function routeStartup(Zend_Controller_Request_Abstract $request) {  


     $alias = substr($request->getRequestUri(), 1);  
     $pattern = "([^/]+)";  

     //this model for CRUD from tables url_alias 
     $resources = new Admin_Resource_Materialalias(); 

     $match = array(); 

     if (preg_match_all($pattern, $alias, $match)) { 
      $url = array();   
      foreach($match['0'] as $m) {   
       //this is page 
       if (preg_match("#^[\d]+$#", $m)) { 
        $url[] = "page/$m"; 
       } else { 
        $url[] = $resources->getUrl($m); 
       }    
      } 
      $url = implode("/", $url); 

      //echo $url; 
     } 

     if (isset($url) && strlen($url)) {  
     $request->setRequestUri($url);  
     } 
    } 
} 

Этого плагин работа в совершенстве.

Но мне еще нужно создать URL-адрес: mysite.com/flat-sale/london/1-room/1. Для этого я создал новый View_Helper:

class My_View_Helper_Alias extends Zend_View_Helper_Url { 

    public function alias(array $urlOptions = array(), $name = null, $reset = false, $encode = true) { 
     $url = $this->url($urlOptions, $name, $reset, $encode); 

    $pattern = "#([^/]+)\/([^/]+)\/([-a-zA-Z0-9_/.]+)#"; 
    $params_pattern = "#([^/]+\/[\d]+)#"; 

    if (preg_match($pattern, $url, $match)) {   

     $resources = new Admin_Resource_Materialalias();   

     if (preg_match_all($params_pattern, $match[3],$params)) {    

      $p_alias = array();    
      foreach($params[0] as $p) {     
       //add controller, action and first params 
       if (empty($p_alias)) { 
        $p = "/".$match[1].'/'.$match[2]."/".$p;            
       }     
       //this is page 
       if (preg_match("#page\/([\d]+)#", $p, $page)) {      
        $p_alias[] = $page[1]; 
        continue; 
       } 
       //this model for CRUD from tables url_alias 
       $part = $resources->getAlias($p); 
       $p_alias[] = strlen($part)?$part:$p;     
      } 

      $alias = implode("/",$p_alias); 
     } 
    } 

     $alias = strlen($alias)? $alias : $url;   
     return $alias;  
    }   
    } 

Этот помощник также работать, но я думаю, что это не является оптимальным. Может кто-нибудь комментировать этот код или, возможно, имеет такую ​​же задачу? Спасибо.

Проблема решается так, спасибо за KA_lin:

routes.flat_sale_city_rooms.route = /:type/:city/:rooms/:page 
routes.flat_sale_city_rooms.defaults.module = main 
routes.flat_sale_city_rooms.defaults.controller = post 
routes.flat_sale_city_rooms.defaults.action = list 
routes.flat_sale_city_rooms.reqs.type = [^/]+ 
routes.flat_sale_city_rooms.reqs.city = [^/]+ 
routes.flat_sale_city_rooms.reqs.rooms = [^/]+ 
routes.flat_sale_city_rooms.defaults.page = 1 
routes.flat_sale_city_rooms.reqs.page = \d+ 

routes.flat_sale_city.route = /:type/:city/:page 
routes.flat_sale_city.defaults.module = main 
routes.flat_sale_city.defaults.controller = post 
routes.flat_sale_city.defaults.action = list 
routes.flat_sale_city.reqs.type = [^/]+ 
routes.flat_sale_city.reqs.city = [^/]+ 
routes.flat_sale_city.defaults.page = 1 
routes.flat_sale_city.reqs.page = \d+ 

ответ

1

Попробуйте Bootstrap.php добавить что-то вроде:

$route = new Zend_Controller_Router_Route (
    'user/summary/:id/connection', 
    array('controller' => 'user', 
      'action'  => 'get-summary', 
      'id'   => FALSE, 
     ) 
    ); 
$router->addRoute('equity', $route); 

И это создает пользовательские URL-адреса, которые вы можете позвонить:

user/my-personal-url, 
user/my-personal-url/connection 

Предполагая, что Zend 1 используется

+0

вы предлагаете для моей цели, как это: '$ маршруту = новый Zend_Controller_Router_Route ( ': тип /: город /: Номера /: страница', массива ('контроллер' = > 'post', 'action' => 'list', 'city' => false, 'rooms' => false, 'page' =>: page ) ); $ router-> addRoute ('equity', $ route); 'И получить псевдоним для этих параметров в контроллере? – vedmed

+0

Да ... У меня также был этот вопрос относительно дружественного URL :) –

+1

KA_lin, спасибо! – vedmed

Смежные вопросы