2010-10-04 2 views
1

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

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

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

ответ

1
  1. обрабатывать любые специальные символы, которые вы хотите использовать (Умляуты, например)
  2. Удалить любые не алфавитно-цифровые символы, которые остались
  3. ручки белых пространств

Что-то вроде этого, например:

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')))); 
} 
+0

Спасибо, но, возможно, я не объяснил, что я имею в виду очень хорошо. я имею в виду, что в quora.com вы увидите, что вся страница, включая (тема, вопрос и имя пользователя), имеет slug после домена, и нет никакого параметра infront slug, чтобы вызвать контроллер и примеры действий для темы http: // www.quora.com/StackOverflow и для вопроса http: //www.quora.com/Why-doesnt-Quora-implement-a-reputation-system-a-la-StackOverflow, так как запрос продолжается? – tayler

2

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

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

будет принимать URL, как это:

controller/my-slug 

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

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

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

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

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

Спасибо за помощь, Но, возможно, я не объяснил, что я имею в виду очень хорошо. я имею в виду, что в quora.com вы увидите, что вся страница, включая (тема, вопрос и имя пользователя), имеет slug после домена, и нет никакого параметра infront slug, чтобы вызвать контроллер и примеры действий для темы http: // www.quora.com/StackOverflow и для вопроса http://www.quora.com/Why-doesnt-Quora-implement-a-reputation-system-a-la-StackOverflow, так как запрос продолжается? – tayler

+0

Я попытался добавить немного больше информации, чтобы указать вам в правильном направлении. Удачи! – thaddeusmt

1

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

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

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