А что насчет нормального ЧПУ? (есть проблемы)
А что насчет нормального ЧПУ? (есть проблемы)
Интересно учтено во фрейме возможность создания реально правильного ЧПУ?
Т.е. такие адреса чтобы были:
site.ru/statia_o_aliasah_yii
site.ru/content/moduli
...
Понятно что соответствие внутреннего пути (контроллер,действие, параметры) и чпу алиаса будет храниться естественно в базе данных.
Т.е. вызываю какую то из внутренних функций url() и она мне в результате сможет выдать чистый адрес.
Ну и при запросе на сайт из чистого пути должно соответственно разобрать в контроллер,действие, параметры.
Соответственно некоторые же параметры могут быть необязательными типа page
site.ru/content/moduli?page=2
Имеется возможность в ядре чтобы сделать такое как везде сейчас в блогосфере да и прочих сайтах с ЧПУ?
Т.е. такие адреса чтобы были:
site.ru/statia_o_aliasah_yii
site.ru/content/moduli
...
Понятно что соответствие внутреннего пути (контроллер,действие, параметры) и чпу алиаса будет храниться естественно в базе данных.
Т.е. вызываю какую то из внутренних функций url() и она мне в результате сможет выдать чистый адрес.
Ну и при запросе на сайт из чистого пути должно соответственно разобрать в контроллер,действие, параметры.
Соответственно некоторые же параметры могут быть необязательными типа page
site.ru/content/moduli?page=2
Имеется возможность в ядре чтобы сделать такое как везде сейчас в блогосфере да и прочих сайтах с ЧПУ?
Последний раз редактировалось Tommi 2013.12.12, 14:56, всего редактировалось 2 раза.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: А что насчет нормального ЧПУ?
Да. Вот, например: http://rmcreative.ru/blog/post/android- ... -emuljator
Нравится Yii? Давайте сделаем его лучше!.
Re: А что насчет нормального ЧПУ?
Так что по текущей реализации все синонимы надо сразу подгружать в правила массива rules ?
А если статей тысячи?
И для создания из внутреннего пути одного чистого урла будет гонять в цикле по тысяче url объектов(которые хоть и из кеша но в памяти все будут висеть) на поиск соответствия?
Да и по текущей реализации пока не получается сделать.
1. В htaccess установил как по доке
2.
3. Запрашиваю страницу
http://www.site.ru/content/_some_url1 - работает показывает страницу с дефаулт значением arg
http://www.site.ru/content/_some_url - не работает: 404 - Unable to resolve the request: ссс1/aaa1?arg=9
такое правило - 'content/_some_url' => 'ссс1/aaa1/arg/9' - тоже не работает
А если статей тысячи?
И для создания из внутреннего пути одного чистого урла будет гонять в цикле по тысяче url объектов(которые хоть и из кеша но в памяти все будут висеть) на поиск соответствия?
Да и по текущей реализации пока не получается сделать.
1. В htaccess установил как по доке
2.
Код: Выделить всё
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
'content/_some_url' => 'ссс1/aaa1?arg=9', // не работает
'content/_some_url1' => 'ссс1/aaa1', // работает
],
http://www.site.ru/content/_some_url1 - работает показывает страницу с дефаулт значением arg
http://www.site.ru/content/_some_url - не работает: 404 - Unable to resolve the request: ссс1/aaa1?arg=9
такое правило - 'content/_some_url' => 'ссс1/aaa1/arg/9' - тоже не работает
Re: А что насчет нормального ЧПУ?
Код: Выделить всё
'content/_some_url/<arg:\d+>' => 'ссс1/aaa1'
Re: А что насчет нормального ЧПУ?
vova07, и по какому пути запрашивать, а то чето не работает.
И мне кажется все таки вы меня не так поняли.
Есть у меня например статьи, лежат в базе по id-шке идентифицируются.
Вот урл просмотра статьи c id=4:
http://www.site.ru/?r=article/view&id=4
Т.е. соответствующий синоним должен быть у меня для r=article/view&id=4.
Пусть это будет article_about_yii
Когда на сайт прийдут так:
http://www.site.ru/?r=article_about_yii
это будет все равно что
http://www.site.ru/?r=article/view&id=4
Соответственно когда через createUrl я напишу
оно мне при включенном чпу должно выдать не
article/view?id=8
а
article_about_yii
Ну то есть как везде это сейчас на цмс-ках. Есть страница, ее внутренний путь и ее синоним.
Вот это вот страница:
http://www.site.ru/?r=article/view&id=4
по этому пути однозначный какой то контент. И для этой страницы нужен синоним который для посетителей и поисковиков всегда будет показываться
И мне кажется все таки вы меня не так поняли.
Есть у меня например статьи, лежат в базе по id-шке идентифицируются.
Вот урл просмотра статьи c id=4:
http://www.site.ru/?r=article/view&id=4
Т.е. соответствующий синоним должен быть у меня для r=article/view&id=4.
Пусть это будет article_about_yii
Когда на сайт прийдут так:
http://www.site.ru/?r=article_about_yii
это будет все равно что
http://www.site.ru/?r=article/view&id=4
Соответственно когда через createUrl я напишу
Код: Выделить всё
Yii::$app->getUrlManager()->createUrl('article/view', ['id' => 4])
article/view?id=8
а
article_about_yii
Ну то есть как везде это сейчас на цмс-ках. Есть страница, ее внутренний путь и ее синоним.
Вот это вот страница:
http://www.site.ru/?r=article/view&id=4
по этому пути однозначный какой то контент. И для этой страницы нужен синоним который для посетителей и поисковиков всегда будет показываться
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: А что насчет нормального ЧПУ?
Надо хранить slug (article-about-yii) в базе. Можно сделать двумя способами.
1. При формировании URL использовать slug, а не ID. Тогда получается как показал vova07. Просто и производительно.
2. Сделать своё правило, отнаследованное от UrlRule, которое будет транслировать ID в slug и обратно. По идее, скорость измениться не должна и можно будет в коде использовать ID.
1. При формировании URL использовать slug, а не ID. Тогда получается как показал vova07. Просто и производительно.
2. Сделать своё правило, отнаследованное от UrlRule, которое будет транслировать ID в slug и обратно. По идее, скорость измениться не должна и можно будет в коде использовать ID.
Нравится Yii? Давайте сделаем его лучше!.
Re: А что насчет нормального ЧПУ?
Про этот slug смотрю что то пишут, но что вообще это означает понять не получается.
Где в фреймворке этот slug и что это вообще такое...
1. Так это urlmanager::createUrl методы надо переопределять чтобы в них делать запрос к базе на соответствие controller/action/параметры ====> slug. Откуда в этом общем методе знать какой параметр для какого действия является id-шкой страницы.
Странно, эти моменты вообще как то не освещены ни в документации ни в комментариях к коду.
Где в фреймворке этот slug и что это вообще такое...
1. Так это urlmanager::createUrl методы надо переопределять чтобы в них делать запрос к базе на соответствие controller/action/параметры ====> slug. Откуда в этом общем методе знать какой параметр для какого действия является id-шкой страницы.
Странно, эти моменты вообще как то не освещены ни в документации ни в комментариях к коду.
Re: А что насчет нормального ЧПУ?
"slug" - в данной ситуации должно представлять из себя отдельное поля в таблице постов, которое и будет содержать то значение (alias) поста по которому можно будет этот пост найти. Из вашего примера это "article_about_yii".
А ответ на ваш последний вопрос вы найдете тут! Для общего понимания сути, прочтите лучше всю статью. Много вопросов отпадут.
А ответ на ваш последний вопрос вы найдете тут! Для общего понимания сути, прочтите лучше всю статью. Много вопросов отпадут.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: А что насчет нормального ЧПУ?
slug это просто часть URL. Допустим, для "post about Yii" slug — это просто "post-about-yii".
В правилах:
В контроллере:
В правилах:
Код: Выделить всё
'page/<slug>' => 'site/page'
Код: Выделить всё
public function actionPage($slug)
{
$post = Post::find(['slug' => $slug]);
if (!$post) {
throw new HttpException(404);
}
return $this->render(['post' => $post]);
}
Нравится Yii? Давайте сделаем его лучше!.
Re: А что насчет нормального ЧПУ?
Пример в студию и в доки, пожалуйста, так как вопрос очень важный.Sam Dark писал(а): 2. Сделать своё правило, отнаследованное от UrlRule, которое будет транслировать ID в slug и обратно. По идее, скорость измениться не должна и можно будет в коде использовать ID.
Re: А что насчет нормального ЧПУ?
не пойму как тема вообще к yii2 относиться?
Re: А что насчет нормального ЧПУ?
Я спрашивал насчет этих возможностей в Yii2, чтобы самому глубоко не копая код, понять как дела обстоят с чпу в yii2, т.к. еще не поздно пожелания к фреймворку оставлять.S c писал(а):не пойму как тема вообще к yii2 относиться?
Доков по этому моменту еще нет, так что доки дали на версию yii1, может не изменилась логика эта, не знаю.
Из того что понял, тот вариант со slug, что Александр показал, для меня отметается сразу. Это больше как подделка, может на каком то простом сайте и можно применить, но в общем случае не подойдет.
Насчет создания того правила, уже ближе.
Мне как бы нужно одно правило общее для всех действий сайта, а не как в примере класса правила, там где внутрь захардкодена проверка на роут. Это о чем я изначально интересовался.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: А что насчет нормального ЧПУ?
Не понимаю, почему вариант со slug не подходит:
Это единственное отличие. Да, конечно, на 4 символа длиннее, но зато внутри гораздо проще.
По правилам и классам для них, действительно, с 1.1 мало что изменилось.
Код: Выделить всё
$this->createUrl('site/page', ['id' => $page->id]);
//vs
$this->createUrl('site/page', ['slug' => $page->slug]);
По правилам и классам для них, действительно, с 1.1 мало что изменилось.
Нравится Yii? Давайте сделаем его лучше!.
Re: А что насчет нормального ЧПУ?
$page - это у вас некая модель из базы? AR объект.
У этого варианта следующие недостатки:
1) Предполагается что slug - это св-во модели $page и хранится соответственно в таблице модели.
Но так ли эта seo чепуха должна храниться в привязке к модели?
В общем то случае этот slug может отличаться в зависимости от текущего языка сайта.
Получается что для каждой модели это надо повторять.
И в контроллерах делать вручную везде проверку на существование.
Я бы не хотел постоянно в контроллерах делать эту проверку.
Я хочу в контроллере работать чтобы ему не надо было знать о каких то ЧПУ.
2) Ссылку вы создаете тоже вручную, подгрузив сначала модель.
А если ссылку нужно создавать автоматически? (Ее адрес вводится в админке а createUrl должен выдать чпу адрес)
Я нацеливаюсь на то как храняться эти алиасы в цмс с которыми я работал.
Таблица Алиасы
Поэтому и задачи 2:
1) При запросе на страницу по алиасу идет поиск в табл, если есть соответствие, то достает роутер и нужные гет переменные и вперед.
2) При любом createUrl('site/page', ['notid' => 8, 'id' => $page->id]); должно проверить на наличие синонима.
Но искать в таблице Алиасов совпадение - по каким гет переменным для данного роутера искать - вот в чем вопрос.
Записал себе на потом смотреть полностью реализацию urlmanagement, может там есть простой выход, который я пока не вижу.
У этого варианта следующие недостатки:
1) Предполагается что slug - это св-во модели $page и хранится соответственно в таблице модели.
Но так ли эта seo чепуха должна храниться в привязке к модели?
В общем то случае этот slug может отличаться в зависимости от текущего языка сайта.
Получается что для каждой модели это надо повторять.
И в контроллерах делать вручную везде проверку на существование.
Я бы не хотел постоянно в контроллерах делать эту проверку.
Я хочу в контроллере работать чтобы ему не надо было знать о каких то ЧПУ.
2) Ссылку вы создаете тоже вручную, подгрузив сначала модель.
А если ссылку нужно создавать автоматически? (Ее адрес вводится в админке а createUrl должен выдать чпу адрес)
Я нацеливаюсь на то как храняться эти алиасы в цмс с которыми я работал.
Таблица Алиасы
Код: Выделить всё
source | alias
----------------------------------------------
site/page?id=1 | stranica1
site/page?id=2 | stranica2
article/view?cat=2&model=4 | audi
article/view?cat=3&model=7 | volvo
1) При запросе на страницу по алиасу идет поиск в табл, если есть соответствие, то достает роутер и нужные гет переменные и вперед.
2) При любом createUrl('site/page', ['notid' => 8, 'id' => $page->id]); должно проверить на наличие синонима.
Но искать в таблице Алиасов совпадение - по каким гет переменным для данного роутера искать - вот в чем вопрос.
Записал себе на потом смотреть полностью реализацию urlmanagement, может там есть простой выход, который я пока не вижу.
Re: А что насчет нормального ЧПУ?
1) нет нечего страшного, чтоб хранить slug в таблице. если это мультиязычный сайт - slug меняться не должен. обычно добавляют что то типа site.com/de/slug_testoviy/
2) да, так же можно отдельно в map таблице хранить slug-и для всех страниц. и так же доставать. Зато в админке всем этим очень легко будет управлять.
вот первый вариант к примеру реализован тут http://www.free-lancing.ru/project/2294 ... angliyskiy
2) да, так же можно отдельно в map таблице хранить slug-и для всех страниц. и так же доставать. Зато в админке всем этим очень легко будет управлять.
вот первый вариант к примеру реализован тут http://www.free-lancing.ru/project/2294 ... angliyskiy
Re: А что насчет нормального ЧПУ?
Что делать и как быть с реальной бедностью роутера в Yii?
Изучил внутренности urlManager и его правил и понял что решения так и нет.
Вся проблема в том что приходиться писать так:
вместо:
Т.е. если я даже своим URL правилом буду создавать выходящие урлы как синонимы из базы, я не имею информации об роуте страницы. А имею информацию только об роуте контроллера+действия.
Я не смогу сделать запрос вида
потому что я не буду знать какие гет переменные надо добавить к контроллеру/действию чтобы получить роут текущей страницы.
Это ужасно, что yii так странно забило на понятие Страница сайта.
Страница сайта - это не Контроллер/действие.
Контроллер/действие - это глагол - что делать.
А необходимый параметр для Страницы - это над чем произвести действие.
А в yii такую важную вещь вообще не учли, и достают параметры в самом конце:
https://github.com/yiisoft/yii2/blob/ma ... er.php#L46
и получается что только внутри контроллера ты и можешь знать что же это за страница.
Как я например из одного контроллера создам через $this->createUrl( указав тут естественно внутренний путь) синонимичный путь на другой контроллер? Откуда этот контроллер может знать какой для этого нового действия дополнительный гет параметр?
В drupal , там нет такой проблемы, и вся возня с синонимами сконцентрирована в паре десятков строчек кода на верхнем уровне.
Не спец по Kohana, но глянул и вижу что и там нет данной проблемы.
Как вообще можно было так это спроектировать?
Такую суперскую вещь для удобного менеджмента ЧПУ (ЦЕНТРАЛИЗОВАННО) получается не учли.
Зато целое иероглифическое письмо для правил класса UrlRule изобрели. (от которых в общем случае мало толку, это статика)
Изучил внутренности urlManager и его правил и понял что решения так и нет.
Вся проблема в том что приходиться писать так:
Код: Выделить всё
$this->createUrl('site/page', ['id' => $page->id, 'notimportant'=>9]);
Код: Выделить всё
$this->createUrl('site/page/' . $page->id, ['notimportant'=>9]);
Я не смогу сделать запрос вида
Код: Выделить всё
SELECT alias from table_aliases where url= 'site/page?id=1'
Это ужасно, что yii так странно забило на понятие Страница сайта.
Страница сайта - это не Контроллер/действие.
Контроллер/действие - это глагол - что делать.
А необходимый параметр для Страницы - это над чем произвести действие.
А в yii такую важную вещь вообще не учли, и достают параметры в самом конце:
https://github.com/yiisoft/yii2/blob/ma ... er.php#L46
и получается что только внутри контроллера ты и можешь знать что же это за страница.
Как я например из одного контроллера создам через $this->createUrl( указав тут естественно внутренний путь) синонимичный путь на другой контроллер? Откуда этот контроллер может знать какой для этого нового действия дополнительный гет параметр?
В drupal , там нет такой проблемы, и вся возня с синонимами сконцентрирована в паре десятков строчек кода на верхнем уровне.
Не спец по Kohana, но глянул и вижу что и там нет данной проблемы.
Как вообще можно было так это спроектировать?
Такую суперскую вещь для удобного менеджмента ЧПУ (ЦЕНТРАЛИЗОВАННО) получается не учли.
Зато целое иероглифическое письмо для правил класса UrlRule изобрели. (от которых в общем случае мало толку, это статика)
Re: А что насчет нормального ЧПУ?
Ответил в комментарии http://www.elisdn.ru/blog/48/routing-in ... urlmanager
Re: А что насчет нормального ЧПУ?
Спасибо за ответ. Но вы не поняли сути вопроса.
Я вроде подробно же описал.
Синонимы и их соответствия хранятся в ОДНОЙ ТАБЛИЦЕ.
Ваши советы касаются:
1) для каждого пути свое правило. Ну ладно тут можно еще как то динамически накатить правила. Но это 100% неэффективно. Т.к. правила исполняются одно за другим и пока нужное найдется 10 запросов к разным таблицам произойдет
2) хардкодить в ручную для каждого соответствия внутри одного правила. Вариант нерабочий для сайтов , которые без постоянной поддержки программиста. Да и вообще это дополнительный неудобный труд.
Я вроде подробно же описал.
Синонимы и их соответствия хранятся в ОДНОЙ ТАБЛИЦЕ.
Ваши советы касаются:
1) для каждого пути свое правило. Ну ладно тут можно еще как то динамически накатить правила. Но это 100% неэффективно. Т.к. правила исполняются одно за другим и пока нужное найдется 10 запросов к разным таблицам произойдет
2) хардкодить в ручную для каждого соответствия внутри одного правила. Вариант нерабочий для сайтов , которые без постоянной поддержки программиста. Да и вообще это дополнительный неудобный труд.
Re: А что насчет нормального ЧПУ?
выше уже дали ссылку http://www.yiiframework.com/doc/guide/1 ... .url#sec-9 - делаем свое правило и как угодно разруливаем