Сделать URL-адрес, чувствительный к SEO, (исключить идентификатор).

У меня есть URL-адрес:

http://quickstart.local/public/category1/product2 

и в url (category1 / product2) номера – это идентификаторы, категории и продукты, извлеченные из базы данных, обращаются к идентификатору

id уникален

Мне нужен чувствительный url, такой как zend framework url. например: http://stackoverflow.com/questions/621380/seo-url-structure

как я могу преобразовать этот url в новый url, как это

там в любом случае?!!

Вы можете использовать Zend Zend_Controller_Router_Route . Например, чтобы сделать аналогичный url для тех, которые используются SO, можно было определить собственный маршрут в application.ini следующим образом (предполагая, что у вас есть контроллер и действие, вызывающее вопросы и отображаемое соответственно):

 resources.router.routes.questions.route = '/questions/:id/:title' resources.router.routes.questions.type = "Zend_Controller_Router_Route" resources.router.routes.questions.defaults.module = default resources.router.routes.questions.defaults.controller = questions resources.router.routes.questions.defaults.action = show resources.router.routes.questions.defaults.id = resources.router.routes.questions.defaults.title = resources.router.routes.questions.reqs.id = "\d+" 

Имея такой маршрут, в ваших представлениях вы можете создать URL-адрес следующим образом:

 <?php echo $this->url(array('id'=>621380,'title' => 'seo url structure'),'questions'); // results in: /myapp/public/questions/621380/seo+url+structure //OR if you really want to have dashes in your title: <?php echo $this->url(array('id'=>621380,'title' => preg_replace('/\s+/','-','seo url structure'),'questions'); // results in: /myapp/public/questions/621380/seo-url-structure 

Обратите внимание, что /myapp/public/ находится в URL-адресе, потому что у меня нет настроек виртуальных хостов на моем локальном хосте или каких-либо модификаций .htaccess. Также обратите внимание, что вам не нужно иметь уникальный :title , потому что ваш реальный идентификатор находится в переменной :id .

В качестве побочного примечания, если вы хотите сделать его немного более удобным для пользователей, было бы лучше иметь ваш url как /question/621380/see-url-structure а не /questions/621380/see-url-structure . Это связано с тем, что под этим URL-адресом у вас будет только один вопрос, а не много вопросов. Это можно просто сделать, изменив маршрут на следующие resources.router.routes.questions.route = '/question/:id/:title' .

РЕДАКТИРОВАТЬ:

И что делать с категориями и продуктами, которые у вас есть в вашем вопросе? Итак, я бы определил пользовательский маршрут, но на этот раз с помощью Zend_Controller_Router_Route_Regex :

 resources.router.routes.questions.route = '/questions/(\d+)-(d+)/(\w*)' resources.router.routes.questions.type = "Zend_Controller_Router_Route_Regex" resources.router.routes.questions.defaults.module = default resources.router.routes.questions.defaults.controller = questions resources.router.routes.questions.defaults.action = show resources.router.routes.questions.map.1 = category resources.router.routes.questions.map.2 = product resources.router.routes.questions.map.3 = title resources.router.routes.questions.reverse = "questions/%d-%d/%s" 

Затем будет создан URL-адрес этого маршрута:

 <?php echo $this->url(array('category' => 6213,'product' => 80,'title' => preg_replace('/\s+/', '-', 'seo url structure')),'questions' ); ?> // results in: /myapp/public/questions/6213-80/seo-url-structure 

Надеюсь, это поможет или, по крайней мере, укажет вам в правильном направлении.

Вам нужно сохранить уникальное значение в своей базе данных с таким именем поля, как «url» или что-то подобное. Каждый раз, когда вы создаете новый продукт, вам придется создать этот уникальный URL-адрес и сохранить его с информацией о продукте. Обычный способ сделать это – взять название продукта и сделать его URL-адресом дружественным:

 public function generateUrl($name) { $alias = str_replace(' ', '-', strtolower(trim($name))); return preg_replace('/[^A-Za-z0-9-]/', '', $alias); } 

Вызов этого метода:

 $url = $this->generateUrl("My amazing product!"); echo $url; 

выведет:

мой-удивительный продукт

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

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

Http: //quickstart.local/public/awesome-stuff/my-amazing-product