- Support
- Usage
- Створюємо таблицю (застосовуємо міграцію)
- Створюємо свій екземпляр моделі UrlRoute
- налаштовуємо UrlManager
- Налаштовуємо AR модель
- підключаємо ActualityUrlBehavior
- Створюємо CRUD для управління Рауса
- Installation
Допомагає реалізувати управління урламі сторінок системи як в CMS WordPress, з управлінням з адмінпанелі таблицею маршрутизації і редирект.
Support
GutHub issues .
Usage
Створити таблицю для зберігання роутінга (застосувати міграцію)
Створити свій екземпляр моделі UrlRoute
налаштувати UrlManager
- Підключити клас UrlManager з пакета
- Підключити класи правил роутінга
- ClearUrlRule для очищення урлов від сміття (подвійні Слеш, слеш в закінченні ...)
- UrlRule відповідає безпосередньо за роутинг
В потрібної AR моделі
- Реалізувати інтерфейс SeoModelInterface
- Підключити поведінку CreateUrlBehavior
підключити ActualityUrlBehavior
Створюємо CRUD для управління Рауса
Створюємо таблицю (застосовуємо міграцію)
Успадкує створений клас міграції від \ voskobovich \ seo \ migrations \ create_table__url_route.
наприклад:
застосовуємо міграцію
php yii migrateСтворюємо свій екземпляр моделі UrlRoute
Yii2 SEO toolkit не знає з якими моделями і Рауса йому доведеться працювати.
class UrlRoute extends \ voskobovich \ seo \ models \ UrlRoute {const OBJECT_CATEGORY = 'category'; const OBJECT_POST = 'post'; const OBJECT_TAG = 'tag'; const OBJECT_USER = 'user'; / ** * List objects * @return array; * / Public static function objectItems () {return [static :: OBJECT_CATEGORY => 'Category', static :: OBJECT_POST => 'Post', static :: OBJECT_TAG => 'Tag', static :: OBJECT_USER => 'User' ,]; } / ** * Route map for objects * @return array; * / Public static function routeMap () {return [static :: OBJECT_CATEGORY => [static :: ACTION_INDEX => 'category / index', static :: ACTION_VIEW => 'category / view',], static :: OBJECT_POST => [static :: ACTION_INDEX => 'post / index', static :: ACTION_VIEW => 'post / view',], static :: OBJECT_TAG => [static :: ACTION_INDEX => 'tag / index', static :: ACTION_VIEW => 'tag / view',], static :: OBJECT_USER => [static :: ACTION_INDEX => 'user / index', static :: ACTION_VIEW => 'user / view',],]; }}
Щоб це виправити, потрібно успадкувати від моделі UrlRoute з пакета і реалізувати 2 методу з UrlRouteInterface.
Ось приклад з мого проекту.З прикладу видно, що роутинг буде працювати з 4-я об'єктами.
Для кожного об'єкта налаштований список стандартних дій "показати все" (index) і "показати один" (view).
Дії потрібні для того, щоб розрізняти логіку обробки роута. Наприклад, ми можемо зробити ось так:Роут / foo це дію index для об'єкта post. У підсумку, перейшовши по / foo ми отримаємо список усіх посад (в yii роутинг це дорівнює переходу на post / index).
Роут / bar це дія view для об'єкта post c id = 3. У підсумку, перейшовши по / bar ми побачимо запис з id = 5 (в yii роутинг це дорівнює переходу на post / view).
Список дій можна розширити, доповнивши список в методі getActionItems.налаштовуємо UrlManager
У стандартному класі UrlManager реалізовано кешування Рауса яке допомагає прискорити процес генерації посилань в стандартному роутинг Yii2. Суть кешування в тому, щоб запам'ятовувати для яких Рауса немає правил в конфіги і більше не намагатися побудувати посилання для цього роута. Тобто, якщо для роута post / view немає правила, то більше для цього роута правил шукатися не буде, що і логічно. Але для нас це біда, і ось чому. Для роута post / view id = 4 може бути правило в таблиці маршрутизації, а для post / view id = 5 може не бути. Якщо не відключити кешування, то при генерації посилань на пости якщо першою буде згенеровано посилання для post / view id = 5 то UrlManager запам'ятає, що правила для цього роута немає і більше не буде його обробляти. В результаті ми не отримаємо наших красивих посилань для інших постів. Отже, підключаємо клас UrlManager з пакета.
'UrlManager' => [ 'class' => 'voskobovich \ seo \ web \ UrlManager', 'cacheable' => false, 'rules' => [ '' => 'post / index', [ 'class' => '\ voskobovich \ seo \ web \ ClearUrlRule'], [ 'class' => '\ voskobovich \ seo \ web \ UrlRule', 'modelClass' => 'app \ models \ UrlRoute'], // Default '<controller: \ w +> / <id: \ d +> '=>' <controller> / view ',' <controller: \ w +> / <action: [a-zA-Z -] *> / <id: \ d +> ' => '<controller> / <action>', '<controller: \ w +> / <action: [a-zA-Z -] *>' => '<controller> / <action>',]],Правило ClearUrlRule вміє:
Замінити безліч Слеш на один
Видалити слеш в кінці посилання
Букви верхнього регістру перевести в нижній
Увага! З метою оптимізації рекомендую налаштувати ці правила на рівні вашого веб-сервера.
Правило UrlRule відповідає за наш чарівний роутинг.
В атрибут modelClass передається модель UrlRoute яка була створена на минулому кроці.
Налаштовуємо AR модель
Щоб для нових моделей посилання автоматом потрапляючи в таблицю роутінга, потрібно підключити CreateUrlBehavior і реалізувати інтерфейс SeoModelInterface.
class Post extends BaseActiveRecord implements SeoModelInterface {// ... / ** * @return array * / public function behaviors () {return [ 'createUrlBehavior' => [ 'class' => CreateUrlBehavior :: className (), 'modelClass' => UrlRoute :: className (), 'objectKey' => UrlRoute :: OBJECT_POST], 'actualityUrlBehavior' => [ 'class' => ActualityUrlBehavior :: className (), 'modelClass' => UrlRoute :: className (), 'objectKey' => UrlRoute :: OBJECT_POST]]; } / ** * Build Seo Path * @return null | string * / public function getSeoPath () {/ ** @var Category | TreeInterface $ mainCategory * / $ mainCategory = $ this-> mainCategory; if ($ mainCategory) {return $ mainCategory-> path. '/'. $ This-> slug; } Return null; } // ...}
Наводжу приклад моделі Post з мого проекту.Метод getSeoPath () повинен повертати шлях, по якому буде доступна запис поста.
У мене цей роут складається з шляху до головної категорії поста і короткого імені самого поста (/ cat / subcat / post-slug).
Поведінки потрібно передати нашу модель UrlRoute і повідомити яким об'єктом є наша AR модель використовуючи раніше створені константи в моделі UrlRoute.
підключаємо ActualityUrlBehavior
Після настройки всього користувач все ще може перейти за старою посиланню і побачити сторінку. Наприклад, ми для / post / view? Id = 6 створили красивий урл / best-post. Але користувач все ще може перейти за старою посиланню і отримати сторінку, хоча в ідеалі його потрібно відправити на новий урл з 301-м перенаправленням.
class PostController extends Controller {// ... public function actionView ($ id) {/ ** @var Post $ model * / $ model = Post :: find () -> andWhere ([ 'id' => $ id] ) -> one (); $ Model-> trigger (ActualityUrlBehavior :: EVENT_CHECK_URL); return $ this-> render ( 'view', [ 'model' => $ model]); } // ...}
Ось приклад обробника запиту з мого проекту.Кажу відразу, підключати поведінку на весь контролер не потрібно. Це поведінка потрібно тільки для view екшену.
Цьому поведінки так само потрібно передати клас нашої створеної моделі UrlRoute і назва об'єкта з константи.Створюємо CRUD для управління Рауса
У вьюха є невелика логіка, так що привожу приклади основних шматків коду зі свого проекту.
файл create.php
<? Php $ form = ActiveForm :: begin ()?> <? = $ Form-> field ($ model, 'path')?> <? = $ Form-> field ($ model, 'action_key') -> dropDownList ($ model :: getActionItems ())?> <button type = "submit"> Save </ button> <? php ActiveForm :: end ()?>файл update.php
<? Php $ form = ActiveForm :: begin ()?> <? = $ Form-> field ($ model, 'path')?> <? Php if ($ model-> checkAction ($ model :: ACTION_INDEX)) :?> <? = $ form-> field ($ model, 'object_key') -> dropDownList ($ model :: getObjectItems ())?> <? php elseif ($ model-> checkAction ($ model :: ACTION_VIEW) ):?> <? = $ form-> field ($ model, 'object_key') -> dropDownList ($ model :: getObjectItems ())?> <? = $ form-> field ($ model, 'object_id') ?> <? php elseif ($ model-> checkAction ($ model :: ACTION_REDIRECT)):?> <? = $ form-> field ($ model, 'url_to')?> <? php endif; ?> <? = $ Form-> field ($ model, 'http_code')?> <Button type = "submit" </ button> <? Php ActiveForm :: end ()?>файл index.php
<? = GridView :: widget ([ 'dataProvider' => $ dataProvider, 'filterModel' => $ model, 'columns' => [[ 'attribute' => 'path', 'format' => 'raw', 'value' => function ($ model) {/ ** @var UrlRoute $ model * / return Html :: a ($ model-> path, [ 'update', 'id' => $ model-> id], [ 'data-pjax' => 0]);}], [ 'attribute' => 'object_key', 'filter' => $ model :: getObjectItems (), 'value' => function ($ model) {/ ** @var UrlRoute $ model * / return $ model-> getObject ();}, 'visible' => array_search ($ action, [UrlRoute :: ACTION_INDEX, UrlRoute :: ACTION_VIEW])! == false], [ ' attribute '=>' object_id ',' visible '=> array_search ($ action, [UrlRoute :: ACTION_INDEX, UrlRoute :: ACTION_VIEW])! == false], [' attribute '=>' url_to ',' visible '= > $ action == UrlRoute :: ACTION_REDIRECT], [ 'attribute' => 'http_code', 'visible' => $ action == UrlRoute :: ACTION_REDIRECT], [ 'class' => 'voskobovich \ grid \ advanced \ columns \ ActionColumn ',' template '=>' {view} {update} {delete} ',' options '=> [' width '=>' 160px '],' buttons '=> [' view '=> f unction ($ url, $ model, $ key) {$ options = [ 'title' => Yii :: t ( 'yii', 'View'), 'aria-label' => Yii :: t ( 'yii' , 'View'), 'data-pjax' => '0', 'class' => 'btn btn-default btn-xs', 'target' => '_blank',]; / ** @var UrlRoute $ model * / $ url = $ model-> viewUrl (); return Html :: a (Yii :: t ( 'yii', 'View'), $ url, $ options); }]],],])?>Installation
The preferred way to install this extension is through composer .
Either run
php composer.phar require --prefer-dist voskobovich / yii2-seo-toolkit "^ 1.0"or add
"Voskobovich / yii2-seo-toolkit": "^ 1.0"to the require section of your composer.json file.
Php $ form = ActiveForm :: begin ()?Gt; <?
Form-> field ($ model, 'path')?
Gt; <?
Form-> field ($ model, 'action_key') -> dropDownList ($ model :: getActionItems ())?
Php ActiveForm :: end ()?
Php $ form = ActiveForm :: begin ()?
Gt; <?
Form-> field ($ model, 'path')?
Gt; <?