Как сделать url slug, как Quora, используя схему Yii?

48
7

Использование Quora заставило меня задуматься, как они делают свой slug как thes: quora.com/topics-slugs, quora.com/questions-slug или quora.com/usernames-slug.


На самом деле я разрабатываю приложение с фреймворком yii, и я хочу, чтобы у него были такие пули, как quora?


Спасибо, ребята,

спросил(а) 2010-10-04T18:28:00+04:00 9 лет, 2 месяца назад
3
Решение
45

    Обращайтесь к любым специальным символам, которые вы хотите использовать (например, Umlauts)
    Удалите оставшиеся символы без альфа-цифры
    обрабатывать белые пробелы

Что-то вроде этого:


function _getSlugFromName($name){
return preg_replace('#[\s]+#','-',preg_replace('#[^\d\w -]*#','',str_replace(array('ä','ü','ö','ß'),array('ae','ue','oe','ss'),html_entity_decode(mb_strtolower(trim($name),'UTF-8'),ENT_COMPAT,'UTF-8'))));
}

ответил(а) 2010-10-04T18:35:00+04:00 9 лет, 2 месяца назад
Еще 2 ответа
53

Вы также можете сделать это с помощью правил перезаписи. Правило, подобное этому в вашем файле конфигурации:


'controller/<slug:[\w\-]+>'=>'controller/view',

примет такой URL-адрес:


controller/my-slug

и он будет перенаправлен на actionView() в вашем контроллере и передаст slug ( "my-slug" ) в виде переменной $_GET. С этим правилом перезаписи вы теперь вызываете $_GET ['slug'], и он вернет "my-slug" из URL-адреса.

У меня есть строка "slug" в качестве первичного ключа, поэтому я просто запрашиваю DB для $_GET ['slug'] в моем actionView(), и я получаю правильную запись на основе URL. Работает как шарм. Удачи!


UPDATE
Чтобы избавиться от префикса контроллера в дополнение к использованию slug, вам, вероятно, понадобится одна большая таблица для отслеживания всех URL-адресов (для предотвращения дублирования). Если у вас есть это, вы можете сделать несколько разных вещей:


1 Переопределите onBeginRequest, чтобы выполнить поиск в таблице мастер-slug, чтобы выяснить, какой контроллер вызывать.
2. Используйте мастер-переписывание для одного ActionIndex в SiteController и в этом действии найдите пул в главной таблице, чтобы выяснить, какой контроллер/действие нужно отправить пользователю. Правило rewrite будет выглядеть примерно так:


'<slug:[\w\-]+>'=>'site/index',

ответил(а) 2010-10-04T22:05:00+04:00 9 лет, 2 месяца назад
46

Это может вам помочь: dburlmanager

Предоставляет динамические правила URL на основе баз данных. Динамические правила URL на основе базы данных (довольно постоянные ссылки или дружественные URL-адреса)

Эти динамические правила похожи на Wordpress "красивые постоянные ссылки" или "дружественные URL-адреса". Вам не нужно иметь имя контроллера (или ID) в URL-адресе: это расширение может обрабатывать URI-запрос и перенаправлять его на правильный контроллер.


ответил(а) 2011-02-23T11:27:00+03:00 8 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема