Сделайте SEO чувствительный URL (избегайте идентификатора) Zend Framework - PullRequest
2 голосов
/ 27 марта 2011

У меня есть 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, как это

есть ли способ? !!

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Вам необходимо сохранить уникальное значение в вашей базе данных с именем поля, например, '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;

выведет:

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

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

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

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

1 голос
/ 28 марта 2011

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

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'.

EDIT:

А что делать с категориями и товарами, которые есть у вас в вопросе? Итак, я бы определил пользовательский маршрут, но на этот раз, используя 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...