А что насчет нормального ЧПУ? (есть проблемы)

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

А что насчет нормального ЧПУ? (есть проблемы)

Сообщение Tommi »

Интересно учтено во фрейме возможность создания реально правильного ЧПУ?
Т.е. такие адреса чтобы были:
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: А что насчет нормального ЧПУ?

Сообщение samdark »

Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi »

Так что по текущей реализации все синонимы надо сразу подгружать в правила массива rules ?
А если статей тысячи?
И для создания из внутреннего пути одного чистого урла будет гонять в цикле по тысяче url объектов(которые хоть и из кеша но в памяти все будут висеть) на поиск соответствия?
Да и по текущей реализации пока не получается сделать.
1. В htaccess установил как по доке
2.

Код: Выделить всё

       
 'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                'content/_some_url' => 'ссс1/aaa1?arg=9',  // не работает
                'content/_some_url1' => 'ссс1/aaa1',       // работает
            ],
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' - тоже не работает
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: А что насчет нормального ЧПУ?

Сообщение vova07 »

Код: Выделить всё

 'content/_some_url/<arg:\d+>' => 'ссс1/aaa1' 
Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi »

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 я напишу

Код: Выделить всё

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: А что насчет нормального ЧПУ?

Сообщение samdark »

Надо хранить slug (article-about-yii) в базе. Можно сделать двумя способами.

1. При формировании URL использовать slug, а не ID. Тогда получается как показал vova07. Просто и производительно.
2. Сделать своё правило, отнаследованное от UrlRule, которое будет транслировать ID в slug и обратно. По идее, скорость измениться не должна и можно будет в коде использовать ID.
Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi »

Про этот slug смотрю что то пишут, но что вообще это означает понять не получается.
Где в фреймворке этот slug и что это вообще такое...

1. Так это urlmanager::createUrl методы надо переопределять чтобы в них делать запрос к базе на соответствие controller/action/параметры ====> slug. Откуда в этом общем методе знать какой параметр для какого действия является id-шкой страницы.

Странно, эти моменты вообще как то не освещены ни в документации ни в комментариях к коду.
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: А что насчет нормального ЧПУ?

Сообщение vova07 »

"slug" - в данной ситуации должно представлять из себя отдельное поля в таблице постов, которое и будет содержать то значение (alias) поста по которому можно будет этот пост найти. Из вашего примера это "article_about_yii".
А ответ на ваш последний вопрос вы найдете тут! Для общего понимания сути, прочтите лучше всю статью. Много вопросов отпадут.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: А что насчет нормального ЧПУ?

Сообщение samdark »

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]);
}
egorpromo
Сообщения: 113
Зарегистрирован: 2012.11.25, 12:24

Re: А что насчет нормального ЧПУ?

Сообщение egorpromo »

Sam Dark писал(а): 2. Сделать своё правило, отнаследованное от UrlRule, которое будет транслировать ID в slug и обратно. По идее, скорость измениться не должна и можно будет в коде использовать ID.
Пример в студию и в доки, пожалуйста, так как вопрос очень важный.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: А что насчет нормального ЧПУ?

Сообщение S c »

не пойму как тема вообще к yii2 относиться?
Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi »

S c писал(а):не пойму как тема вообще к yii2 относиться?
Я спрашивал насчет этих возможностей в Yii2, чтобы самому глубоко не копая код, понять как дела обстоят с чпу в yii2, т.к. еще не поздно пожелания к фреймворку оставлять.
Доков по этому моменту еще нет, так что доки дали на версию yii1, может не изменилась логика эта, не знаю.

Из того что понял, тот вариант со slug, что Александр показал, для меня отметается сразу. Это больше как подделка, может на каком то простом сайте и можно применить, но в общем случае не подойдет.
Насчет создания того правила, уже ближе.
Мне как бы нужно одно правило общее для всех действий сайта, а не как в примере класса правила, там где внутрь захардкодена проверка на роут. Это о чем я изначально интересовался.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: А что насчет нормального ЧПУ?

Сообщение samdark »

Не понимаю, почему вариант со slug не подходит:

Код: Выделить всё

$this->createUrl('site/page', ['id' => $page->id]);
//vs
$this->createUrl('site/page', ['slug' => $page->slug]);
Это единственное отличие. Да, конечно, на 4 символа длиннее, но зато внутри гораздо проще.

По правилам и классам для них, действительно, с 1.1 мало что изменилось.
Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi »

$page - это у вас некая модель из базы? AR объект.
У этого варианта следующие недостатки:
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
Поэтому и задачи 2:
1) При запросе на страницу по алиасу идет поиск в табл, если есть соответствие, то достает роутер и нужные гет переменные и вперед.
2) При любом createUrl('site/page', ['notid' => 8, 'id' => $page->id]); должно проверить на наличие синонима.
Но искать в таблице Алиасов совпадение - по каким гет переменным для данного роутера искать - вот в чем вопрос.

Записал себе на потом смотреть полностью реализацию urlmanagement, может там есть простой выход, который я пока не вижу.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: А что насчет нормального ЧПУ?

Сообщение S c »

1) нет нечего страшного, чтоб хранить slug в таблице. если это мультиязычный сайт - slug меняться не должен. обычно добавляют что то типа site.com/de/slug_testoviy/

2) да, так же можно отдельно в map таблице хранить slug-и для всех страниц. и так же доставать. Зато в админке всем этим очень легко будет управлять.

вот первый вариант к примеру реализован тут http://www.free-lancing.ru/project/2294 ... angliyskiy
Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi »

Что делать и как быть с реальной бедностью роутера в Yii?
Изучил внутренности urlManager и его правил и понял что решения так и нет.
Вся проблема в том что приходиться писать так:

Код: Выделить всё

$this->createUrl('site/page', ['id' => $page->id, 'notimportant'=>9]); 
вместо:

Код: Выделить всё

$this->createUrl('site/page/' . $page->id, ['notimportant'=>9]); 
Т.е. если я даже своим URL правилом буду создавать выходящие урлы как синонимы из базы, я не имею информации об роуте страницы. А имею информацию только об роуте контроллера+действия.
Я не смогу сделать запрос вида

Код: Выделить всё

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( указав тут естественно внутренний путь) синонимичный путь на другой контроллер? Откуда этот контроллер может знать какой для этого нового действия дополнительный гет параметр? :cry:
В drupal , там нет такой проблемы, и вся возня с синонимами сконцентрирована в паре десятков строчек кода на верхнем уровне.
Не спец по Kohana, но глянул и вижу что и там нет данной проблемы.

Как вообще можно было так это спроектировать?
Такую суперскую вещь для удобного менеджмента ЧПУ (ЦЕНТРАЛИЗОВАННО) получается не учли.
Зато целое иероглифическое письмо для правил класса UrlRule изобрели. (от которых в общем случае мало толку, это статика)
Tommi
Сообщения: 90
Зарегистрирован: 2013.08.01, 13:44

Re: А что насчет нормального ЧПУ?

Сообщение Tommi »

Спасибо за ответ. Но вы не поняли сути вопроса.
Я вроде подробно же описал.
Синонимы и их соответствия хранятся в ОДНОЙ ТАБЛИЦЕ.

Ваши советы касаются:
1) для каждого пути свое правило. Ну ладно тут можно еще как то динамически накатить правила. Но это 100% неэффективно. Т.к. правила исполняются одно за другим и пока нужное найдется 10 запросов к разным таблицам произойдет

2) хардкодить в ручную для каждого соответствия внутри одного правила. Вариант нерабочий для сайтов , которые без постоянной поддержки программиста. Да и вообще это дополнительный неудобный труд.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: А что насчет нормального ЧПУ?

Сообщение yan »

выше уже дали ссылку http://www.yiiframework.com/doc/guide/1 ... .url#sec-9 - делаем свое правило и как угодно разруливаем
Ответить