0

CakePHPでクエリを実行したり、CakePHPでルートを実行したりすることについての最初のことはわからないので、質問の解決策を見つける方法すらわかりません。多分あなたは助けることができます。

ユーザーが次の場所にアクセスできるようにしたい:

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

また

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

どちらも「ページ」コントローラー、「表示」アクションにアクセスします。そして、両方ともページID=1を考え出す必要があります。

(単にhttp://www.domain.com/pages/1にアクセスしてほしくない)

各ページにはURLのニックネームがありますが、空白のままにすると、最初の例に示すように、URLはhttp://www.domain.com/CATEGORY/PAGEになります。

ニックネームが空白のままになっていない場合、ルート内で「SELECT id FROM pages WHERE nickname ='nickname'」というクエリを実行する方法はありますか?

さらに、ページテーブルのニックネームが「thisthat」の場合、URLはhttp://www.domain.com/this-thatである必要があります。つまり、ハイフンをスペースに置き換えてからクエリを実行する必要があります。 。

最初のURLのルートは次のとおりです。

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

私が探している2番目のオプションは可能ですか?

4

2 に答える 2

0

可能かもしれませんが、ルーターがそのようなロジックを実行していることはあまりありません。多くの場合、ルーターはこれをコントローラーに渡し、コントローラーはURLパスの分析を処理します。

証拠として、ネイティブ編集ルートがどのように機能するかを検討してください。ルーターは、データベースの既存のIDをテストしません。コントローラはそうします。

于 2012-11-20T15:22:31.313 に答える
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'
    )
);
于 2013-01-17T19:11:45.853 に答える