Навигация по сайту

Популярные статьи

voskobovich / yii2-seo-toolkit

  1. Support
  2. Usage
  3. Створюємо таблицю (застосовуємо міграцію)
  4. Створюємо свій екземпляр моделі UrlRoute
  5. налаштовуємо UrlManager
  6. Налаштовуємо AR модель
  7. підключаємо ActualityUrlBehavior
  8. Створюємо CRUD для управління Рауса
  9. Installation

Допомагає реалізувати управління урламі сторінок системи як в CMS WordPress, з управлінням з адмінпанелі таблицею маршрутизації і редирект.

Support

GutHub issues .

Usage

  1. Створити таблицю для зберігання роутінга (застосувати міграцію)

  2. Створити свій екземпляр моделі UrlRoute

  3. налаштувати UrlManager

    1. Підключити клас UrlManager з пакета
    2. Підключити класи правил роутінга
    3. ClearUrlRule для очищення урлов від сміття (подвійні Слеш, слеш в закінченні ...)
    4. UrlRule відповідає безпосередньо за роутинг
  4. В потрібної AR моделі

    1. Реалізувати інтерфейс SeoModelInterface
    2. Підключити поведінку CreateUrlBehavior
  5. підключити ActualityUrlBehavior

  6. Створюємо CRUD для управління Рауса

  7. Створюємо таблицю (застосовуємо міграцію)

php yii migrate / create create_table__url_route

Успадкує створений клас міграції від \ voskobovich \ seo \ migrations \ create_table__url_route.
наприклад:

class <ClassName> extends \ voskobovich \ seo \ migrations \ create_table__url_route {}

застосовуємо міграцію

php yii migrate
  1. Створюємо свій екземпляр моделі UrlRoute

    Yii2 SEO toolkit не знає з якими моделями і Рауса йому доведеться працювати.
    Щоб це виправити, потрібно успадкувати від моделі UrlRoute з пакета і реалізувати 2 методу з UrlRouteInterface.
    Ось приклад з мого проекту.

    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',],]; }}

    З прикладу видно, що роутинг буде працювати з 4-я об'єктами.
    Для кожного об'єкта налаштований список стандартних дій "показати все" (index) і "показати один" (view).
    Дії потрібні для того, щоб розрізняти логіку обробки роута. Наприклад, ми можемо зробити ось так:

  2. Роут / foo це дію index для об'єкта post. У підсумку, перейшовши по / foo ми отримаємо список усіх посад (в yii роутинг це дорівнює переходу на post / index).

  3. Роут / bar це дія view для об'єкта post c id = 3. У підсумку, перейшовши по / bar ми побачимо запис з id = 5 (в yii роутинг це дорівнює переходу на post / view).
    Список дій можна розширити, доповнивши список в методі getActionItems.

  4. налаштовуємо 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 вміє:

  5. Замінити безліч Слеш на один

  6. Видалити слеш в кінці посилання

  7. Букви верхнього регістру перевести в нижній

Увага! З метою оптимізації рекомендую налаштувати ці правила на рівні вашого веб-сервера.

Правило UrlRule відповідає за наш чарівний роутинг.
В атрибут modelClass передається модель UrlRoute яка була створена на минулому кроці.

  1. Налаштовуємо AR модель

    Щоб для нових моделей посилання автоматом потрапляючи в таблицю роутінга, потрібно підключити CreateUrlBehavior і реалізувати інтерфейс SeoModelInterface.
    Наводжу приклад моделі Post з мого проекту.

    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; } // ...}

    Метод getSeoPath () повинен повертати шлях, по якому буде доступна запис поста.
    У мене цей роут складається з шляху до головної категорії поста і короткого імені самого поста (/ cat / subcat / post-slug).

Поведінки потрібно передати нашу модель UrlRoute і повідомити яким об'єктом є наша AR модель використовуючи раніше створені константи в моделі UrlRoute.

  1. підключаємо 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 і назва об'єкта з константи.

  2. Створюємо CRUD для управління Рауса

    У вьюха є невелика логіка, так що привожу приклади основних шматків коду зі свого проекту.

файл create.php

<? Php $ form = ActiveForm :: begin ()?&gt; <? = $ Form-> field ($ model, 'path')?&gt; <? = $ Form-> field ($ model, 'action_key') -> dropDownList ($ model :: getActionItems ())?> <button type = "submit"> Save </ button&gt; <? php ActiveForm :: end ()?>

файл update.php

<? Php $ form = ActiveForm :: begin ()?&gt; <? = $ Form-> field ($ model, 'path')?&gt; <? Php if ($ model-> checkAction ($ model :: ACTION_INDEX)) :?&gt; <? = $ form-> field ($ model, 'object_key') -> dropDownList ($ model :: getObjectItems ())?&gt; <? php elseif ($ model-> checkAction ($ model :: ACTION_VIEW) ):?&gt; <? = $ form-> field ($ model, 'object_key') -> dropDownList ($ model :: getObjectItems ())?&gt; <? = $ form-> field ($ model, 'object_id') ?&gt; <? php elseif ($ model-> checkAction ($ model :: ACTION_REDIRECT)):?&gt; <? = $ form-> field ($ model, 'url_to')?&gt; <? php endif; ?&gt; <? = $ Form-> field ($ model, 'http_code')?> <Button type = "submit" </ button&gt; <? 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; <?