2012-11-20 3 views
0

CakePHP에서 쿼리를 수행하거나 CakePHP에서 경로를 수행하는 것에 대해 가장 먼저 알지 못해서 내 질문에 대한 해결책을 찾는 방법을 알지 못합니다. 어쩌면 당신이 도울 수 있습니다.CakePHP : Route의 MySQL 쿼리

나는 사용자가 갈 수 있기를 원하는 :

http://www.domain.com/movies/1 

또는

http://www.domain.com/movie-nickname 

는 모두 "페이지"컨트롤러 "보기"조치에 액세스합니다. 그리고 그들은 각 페이지의 URL에 대한 별명을 가지고 있지만, 경우 빈 URL이됩니다 왼쪽

(내가 그들을 단순히 http://www.domain.com/pages/1에 가고 싶지 않아) = 페이지 ID로 1

을 마련해야 모두 첫 번째 예와 같이 http://www.domain.com/CATEGORY/PAGE이됩니다.

별명가 비어 있지 않은 경우,라고 나는 내 길 내부 쿼리를 할 수있는 방법이있다 "페이지의 ID를 선택 WHERE 별명 = '별명'"이 위에

, 별명이 경우 페이지 테이블에서 "this that"이고 URL은 http://www.domain.com/this-that이어야합니다. 즉, 하이픈을 공백으로 바꾸고 그 다음에 쿼리를 실행해야 함을 의미합니다.

Router::connect(
    '/:category/:page', 
    array('controller' => 'pages', 'action' => 'view'), 
    array(
     'pass' => array('page'), 
     'page' => '[0-9]+', 
     'category' => 'shows|music|games|books|hobbies' 
    ) 
); 

내가 할 수 찾고 있어요 두 번째 옵션이다 :

나는 첫 번째 URL에 대한 경로가?

답변

0

나는 내 사용자 지정 라우팅을 알아 냈습니다.

App::uses('ClassRegistry', 'Utility'); 

// HOMEPAGE 
Router::connect('/', array('controller' => 'index', 'action' => 'index')); 

$requestURI = explode('/', $_SERVER['REQUEST_URI']); 
$scriptName = explode('/',$_SERVER['SCRIPT_NAME']); 

for($i= 0;$i < sizeof($scriptName);$i++) 
     { 
     if ($requestURI[$i]  == $scriptName[$i]) 
       { 
       unset($requestURI[$i]); 
      } 
     } 

$param = array_values($requestURI); 

$param1 = $param[0]; // domain.com/page-nickname 
$param2 = $param[1]; // domain.com/category_id/page_id 

// convert 'page-nickname' to 'page nickname' which is what it would be in db 
$pagelink = str_replace('-', ' ', $param1); 

// initiate Page mode; 
$pagesModel = ClassRegistry::init('Page'); 

// check if there is a matching page in the db that has link column like 'page nickname' 
$matchedpage = $pagesModel->find('first', array(
    'conditions' => array('Page.link LIKE' => "$pagelink"), 'recursive' => '0' 
)); 


// Cache::write('routepagelinks', $pagelinks); 

// if there is a match 
if($matchedpage['Page']['id']){ 
    Router::connect('/' . $param1, array('controller' => 'pages', 'action' => 'view', 'page' => $matchedpage['Page']['id']), array(
    'pass' => array('page'), 
    'page' => '[0-9]+' 
    )); 

// ... more custom routing if there is a match 

} 

// general routing info here 


// if no page-nickname, routes page for domain.com/category_id/page_id 
Router::connect(
'/:category/:page', 
array('controller' => 'pages', 'action' => 'view'), 
array(
    'pass' => array('page'), 
    'page' => '[0-9]+', 
    'category' => 'shows|music|games|books|hobbies' 
    ) 
); 
0

가능할 수도 있지만 라우터가 그런 논리를 수행하는 것을 자주 보지 못합니다. 종종 라우터는이를 통해 컨트롤러로 전달하고 컨트롤러는 URL 경로를 분석합니다.

증명을 위해 기본 수정 경로가 어떻게 작동하는지 생각해보십시오. 라우터가 기존 id에 대해 데이터베이스를 테스트하지 않습니다. 컨트롤러가 않습니다.