CakePHP - Как сделать обратную маршрутизацию со слагом? - PullRequest
5 голосов
/ 24 февраля 2011

Я использую CakePHP 1.3.У меня есть модель продукта.в таблице БД среди прочих есть поля id и slug.

Если у меня есть продукт id:37 и slug:My-Product-Title, я хочу, чтобы URL этого продукта был:

продукты / 37 / My-Product-Title

Вместо стандарта:

продукты / просмотр / 37

Я создал маршрут, который выглядит следующим образом:

Router::connect(
    '/products/:id/:slug',
    array('controller' => 'products', 'action' => 'view'),
    array('pass' => array('id'), 'id' => '[0-9]+')
);

Теперь я могу перейти к http://server/products/37/My-Product-Title, и он доставит меня в нужное место.

Но Как мне получить обратную маршрутизациюавтоматически создать правильный URL в $HtmlHelper->link?

Когда я использую:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37)
);

По-прежнему выводится стандартный products/view/37 url.

Ответы [ 4 ]

5 голосов
/ 25 февраля 2011

Я не верю, что это можно сделать автоматически. Помощник - это просто «помощник», который строит ссылку по заданным параметрам.

Таким образом, самый простой способ - добавить еще один параметр в ссылку:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, $slug)
);

где $ slug - это данные из поля slug.

Вероятно, это может быть сделано по вашей идее, но вам нужно очень сильно нарушить схему MVC:)

Edit:

Прочитав ваш вопрос еще раз, я хорошо поняла. Посмотрите, как это должно быть сделано:

в вашем router.php добавьте следующее правило:

Router::connect(
    '/product/*',
    array('controller' => 'products', 'action' => 'view')
);

Обратите внимание, что это / product / *, а не / products / *

Ваша ссылка должна быть сделана так:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37, 'my-product-title')
);

и ссылка будет выглядеть так:

http://yourdomain.com/product/37/my-product-title

Для меня твое предложение - плохая практика. Также я не думаю, что это хорошо с точки зрения SEO, перенаправляя всегда пользователя.

3 голосов
/ 14 декабря 2011

Для маршрутизации:

Router::connect(
    '/products/:id/:slug',
    array('controller' => 'products', 'action' => 'view'),
    array('pass' => array('id'), 'id' => '[0-9]+')
);

Ваши ссылки должны выглядеть следующим образом:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 'id' => 37, 'slug' => 'my-product-title')
);

Вы должны добавить дополнительные (key => value) в ваш массив для каждого параметра: param в вашей маршрутизации. Тогда магия сработает

0 голосов
/ 25 февраля 2011

Я не уверен, насколько это плохо, но со следующим кодом в ProductsController:

function view($id)
{
    if( isset($_SERVER) && stristr($_SERVER["REQUEST_URI"],'view/') )
    {
        $this->Product->id = $id;
        $slug = $this->Product->field('slug');
        $this->redirect($id.'/'.$slug);
    }
    $data = $this->Product->find('first', array('conditions' => array('Product.id' => $id)));
    $this->set("data", $data);
}

Если доступ к странице осуществляется через /view/id, она автоматически перенаправляет их на текущую страницу, используя /id/slug

Теперь я могу просто использовать схему ссылок по умолчанию:

echo $html->link(
    'Product 37', 
    array('controller'=>'products', 'action' => 'view', 37)
);

, и они будут перенаправлены на правильный URL.

Единственная проблема в том, что я не являюсьВы уверены, насколько это плохо, когда перенаправление происходит каждый раз, когда пользователь заходит на страницу продукта?

0 голосов
/ 25 февраля 2011

Вы должны взглянуть на следующий пост о пользовательских классах маршрутов.

Данные слизняков вообще не должны быть связаны с базой данных - это поле является поддельным, используемым для упрощения логики и поиска.Это решение позволяет изменять маршрутные слагы, не требуя поля слагов в таблице моделей.

http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls

...