CakePHP, используя идентификатор и заголовок в URL - PullRequest
2 голосов
/ 11 октября 2011

Я хочу создать ссылку вроде: /favours/20201/This_is_a_favour, используя как идентификатор, так и название фаворита.

Я настроил ссылку как:

<h3><?php echo $this->Html->link($favour['Favour']['title'], array('controller'=>'favours','action'=>'view',$favour['Favour']['id'], Inflector::slug($favour['Favour']['title']))); ?></h3>

и действие контроллераТАК ЧТО ТАКОЕ:

function view ( $id, $title )
{
    $favour = $this->Favour->find('first', array(
        'conditions' => array('Favour.title' => $title)
    ));

    if (empty($favour))
    {
        $this->cakeError('error404');
    }
    $this->set(compact('favour'));
}

Router::connect('/favours/:id/:favourName',array('controller'=>'favours','action'=>'view'),
        array(
            'favourName'=>'[A-Za-z0-9\._-]+',
            'pass'=>array('favourName')
        ),
        array('id' => '[0-9]+')
    );

Однако я сейчас получаю 404?

ПРИМЕЧАНИЕ: я не хочу использовать подключаемый модуль или хранить слагов в БД!

Ответы [ 4 ]

3 голосов
/ 11 октября 2011

Сначала вам нужно настроить маршрут в routes.php:

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

Router::connect('/favours/:id/:slug',
                array('controller' => 'favors', 'action' => 'view'),
                array(
                    'id'   => '[0-9]+',
                    'slug' => '[A-Za-z0-9\._-]+',
                    'pass' => array('id', 'slug')
                ));

Тогда я бы порекомендовал добавить в модель Favor метод, который обрабатывает создание параметра :slug, так как вам придется использовать его из разных мест, и вы можете захотеть изменить его работу позже:

public static function slug(array $favour) {
    // good enough for now, might want to change this later
    return Inflector::slug($favour['title']);
}

Затем, когда вы делаете ссылку, делайте это так:

array('controller' => 'favours', 'action' => 'view',
      'id' => $favour['Favour']['id'], 'slug' => Favour::slug($favour['Favour']))

Ваше действие контроллера просто выглядит так:

public function view($id, $slug) {
    $favour = $this->Favour->find('first', array('conditions' => array('Favour.id' => $id)));
    if (!$favour) {
        $this->cakeError('error404');
    }
    if (Favour::slug($favour['Favour']) != $slug) {
        $this->redirect(array('id' => $id, 'slug' => Favour::slug($favour['Favour'])));
    }

    $this->set(compact('favour'));
}
0 голосов
/ 11 октября 2011

почему так сложно? просто используйте канонический - вот для чего он нужен

/controller/action/id/some-slugged-title

является канонической ссылкой - но

/controller/action/id/

и

/controller/action/id/some-slugged-ti

и

/controller/action/id/some-slugged-title-blabla

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

SEO здесь хорошо. И никакой дополнительной переадресации не требуется (меньше потребления сервера). Кроме того, вы не получите 404 с, если слаг / название изменится. это огромный риск для многих других решений.

0 голосов
/ 11 октября 2011
    function view ( $id = null, $slug = null )
    {
        $this->Favour->id = $id;
        $this->set('favour', $this->Favour->read());
    }

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

<?php echo $this->Html->link($favour['Favour']['title'], array('controller'=>'favours','action'=>'view','id'=>$favour['Favour']['id'], 'slug'=>Inflector::slug($favour['Favour']['title']))); ?>
0 голосов
/ 11 октября 2011

Марк Стори (ведущий разработчик CakePHP) пишет, как делать то, что вы хотите - несколько незначительных изменений из его статьи должны привести вас в хорошую форму (не разочаровывайтесь названием его поста). http://mark -story.com / сообщений / просмотр / используя обычай маршрутные-классы-в-CakePHP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...