CakePHP: дружественные ссылки с использованием инфлектора и без идентификатора - PullRequest
1 голос
/ 11 августа 2011

Я создал простое портфолио, используя CakePHP, и у него есть URL-адреса, такие как: domain.com/portfolio/82/This_is_an_item

Что я хочу сделать, это удалить идентификатор из URL-адреса.Как мне это сделать?

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

function view ( $id, $slug )
{
    $post = $this->Portfolio->read(null, $id));

    $this->set(compact('post'));
}

, а вот генератор ссылок:

<?php echo $this->Html->link($post['Portfolio']['title'],
        array('admin' => false, 'controller' => 'portfolio', 'action' => 'view', $post['Portfolio']['id'], Inflector::slug($post['Portfolio']['title'])),
        array('title' => $post['Portfolio']['title'])); ?>

Я предполагаюМне нужно изменить метод контроллера, чтобы найти что-то в заголовке?

Любая помощь будет принята с благодарностью.Спасибо

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

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

Для удобства обработки вы можете использовать поведение Sluggable, см. https://gist.github.com/338096 (или просто Google).

Обновление

Если вы используете медленное поведение из https://gist.github.com/338096 (сохранить как sluggable.php в приложении / модели / поведения), вам потребуется выполнить всего несколько шагов:

В вашем классе модели профиля добавьте var $actsAs = array('Sluggable'); или

var $actsAs = array(
    'Sluggable' => array(
        'fields' => 'title',
        'scope' => false,
        'conditions' => false,
        'slugfield' => 'slug',
        'separator' => '-',
        'overwrite' => false,
        'length' => 256,
        'lower' => true
    )
);

если вы хотите изменить настройки

В базе данных добавить столбец slug в таблице профилей.

Когда вы сохраняете профиль, он автоматически добавит заполнить поле slug, вам не нужно предпринимать никаких специальных действий.

1 голос
/ 11 августа 2011

Вы можете полностью удалить идентификатор, но вам нужно убедиться, что слагы являются уникальными (укажите параметр проверки inUnique в качестве опции).При сохранении сообщения, используйте Inflector::slug() в поле 'title' (вы можете сохранить его в поле 'slug', если хотите сохранить заголовок без изменений:

$this->data['Portfolio']['slug'] = Inflector::slug($this->data['Portfolio']['title'])

function view ($slug ){
   $post = $this->Portfolio->find('first', array('conditions'=>array('Portfolio.slug'=>$slug))));
   $this->set(compact('post'));
}

и по ссылке:

<?php echo $this->Html->link($post['Portfolio']['title'],
    array('admin' => false, 'controller' => 'portfolio', 'action' => 'view', $post['Portfolio']['slug']),
    array('title' => $post['Portfolio']['title']));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...