У меня есть 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