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

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

voskobovich / yii2-seo-toolkit

  1. Wsparcie
  2. Wykorzystanie
  3. Utwórz tabelę (zastosuj migrację)
  4. Utwórz własną kopię modelu UrlRoute
  5. Dostosuj UrlManager
  6. Konfigurujemy model AR
  7. Łączymy ActualUrlBehavior
  8. Utwórz CRUD, aby zarządzać trasami.
  9. Instalacja

Pomaga zaimplementować zarządzanie adresami URL stron systemu, jak w CMS WordPress, z zarządzaniem tabelą routingu i przekierowaniami z panelu administracyjnego.

Wsparcie

Problemy z GutHub .

Wykorzystanie

  1. Utwórz tabelę do przechowywania routingu (zastosuj migrację)

  2. Utwórz własną kopię modelu UrlRoute

  3. Skonfiguruj UrlManager

    1. Włącz klasę UrlManager z pakietu
    2. Włącz klasy reguł routingu
    3. ClearUrlRule do czyszczenia adresów URL ze śmieci (podwójne ukośniki, ukośnik na końcu ...)
    4. UrlRule jest bezpośrednio odpowiedzialny za routing
  4. W żądanym modelu AR

    1. Zaimplementuj interfejs SeoModelInterface
    2. Połącz zachowanie CreateUrlBehavior
  5. Connect ActualityUrlBehavior

  6. Utwórz CRUD, aby zarządzać trasami.

  7. Utwórz tabelę (zastosuj migrację)

php yii migrate / create create_table__url_route

Dziedzicz klasę migracji, którą utworzyłeś zoskobovich seo migracje create_table__url_route .
Na przykład:

class <ClassName> extends voskobovich seo migracje create_table__url_route {}

Zastosuj migrację

php yii migrować
  1. Utwórz własną kopię modelu UrlRoute

    Zestaw narzędzi Yii2 SEO nie wie, z jakimi modelami i trasami będzie musiał pracować.
    Aby to naprawić, musisz odziedziczyć model UrlRoute z pakietu i zaimplementować 2 metody z interfejsu UrlRouteInterface.
    Oto przykład z mojego projektu.

    class UrlRoute extends voskobovich seo modele UrlRoute {const OBJECT_CATEGORY = 'category'; const OBJECT_POST = 'post'; const OBJECT_TAG = 'tag'; const OBJECT_USER = 'user'; / ** * Obiekty listy * @return array; * / public statyczna funkcja objectItems () {return [statyczny :: OBJECT_CATEGORY => 'Category', static :: OBJECT_POST => 'Post', static :: OBJECT_TAG => 'Tag', static :: OBJECT_USER => 'User' ,]; } / ** * Mapa trasy dla obiektów * @return array; * / public static function routeMap () {return [statyczny :: OBJECT_CATEGORY => [statyczny :: 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',],]; }}

    Z przykładu widać, że routing będzie działał z 4 obiektami.
    Dla każdego obiektu konfigurowana jest lista standardowych akcji „pokaż wszystko” (indeks) i „pokaż jeden” (widok).
    Potrzebne są działania w celu odróżnienia logiki przetwarzania trasy. Na przykład możemy to zrobić:

  2. Root / foo to akcja indeksu dla obiektu postu . W rezultacie, przechodząc do / foo, otrzymujemy listę wszystkich postów (w routingu yii jest to równoznaczne z przełączeniem na post / index ).

  3. Trasa / pasek to akcja widoku dla obiektu postu o identyfikatorze = 3 . W rezultacie, przechodząc do / bar zobaczymy wpis o id = 5 (w routingu yii oznacza to przełączenie na post / view ).
    Listę akcji można rozszerzyć, dodając do listy w metodzie getActionItems .

  4. Dostosuj UrlManager

    W standardowej klasie zaimplementowano buforowanie tras UrlManager, które pomaga przyspieszyć proces generowania łączy w standardowym routingu Yii2. Istotą buforowania jest zapamiętywanie, dla których tras nie ma reguł w konfiguracji i nie próbują już budować łącza dla tej trasy. Oznacza to, że jeśli nie ma reguły dla trasy post / view , to nie będzie więcej reguł dla tej trasy, co jest logiczne. Ale dla nas to katastrofa i dlatego. Dla trasy post / view id = 4 może być regułą w tabeli routingu, a dla postu / widoku id = 5 może nie być. Jeśli nie wyłączysz buforowania, to podczas generowania linków do postów, jeśli link do post / view id = 5 jest generowany jako pierwszy, UrlManager zapamięta, że ​​nie ma reguł dla tej trasy i nie będzie już jej przetwarzał. W rezultacie nie otrzymamy pięknych linków do innych postów. Więc łączymy klasę UrlManager z pakietu.

    'urlManager' => ['class' => 'voskobovich seo web UrlManager', 'cacheable' => false, 'rules' => ['' => 'post / index', ['class' => voskobovich seo web ClearUrlRule '], [' class '=>' voskobovich seo web UrlRule ',' modelClass '=>' app modele UrlRoute '], // Domyślny' <kontroler: w +> / <id: d +> '=>' <kontroler> / view ',' <kontroler: w +> / <akcja: [a-zA-Z -] *> / <id: d +> ' => '<kontroler> / <akcja>', '<kontroler: w +> / <akcja: [a-zA-Z -] *>' => '<kontroler> / <akcja>',]],

    Zasada ClearUrlRule może:

  5. Zastąp wiele ukośników jednym

  6. Usuń ukośnik na końcu linku

  7. Duże litery tłumaczą się na niższe

Uwaga! Aby zoptymalizować, polecam skonfigurować te reguły na poziomie serwera WWW.

Reguła UrlRule jest odpowiedzialna za nasz magiczny routing.
Atrybut modelClass służy do przesyłania modelu UrlRoute, który został utworzony w ostatnim kroku.

  1. Konfigurujemy model AR

    Aby nowe modele mogły automatycznie łączyć się z tabelą routingu, musisz połączyć CreateUrlBehavior i zaimplementować interfejs SeoModelInterface .
    Podaję przykład modelu Post z mojego projektu.

    klasa Post rozszerza BaseActiveRecord implementuje 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 funkcja getSeoPath () {/ ** @var Kategoria | TreeInterface $ mainCategory * / $ mainCategory = $ this-> mainCategory; if ($ mainCategory) {return $ mainCategory-> ścieżka. „/”. $ this-> slug; } return null; } // ...}

    Metoda getSeoPath () musi zwrócić ścieżkę, która będzie dostępna dla wpisu.
    W moim przypadku ta trasa składa się ze ścieżki do głównej kategorii postu i krótkiej nazwy samego posta (/ cat / subcat / post-slug).

Zachowanie musi przenieść nasz model UrlRoute i powiedzieć, jaki obiekt nasz model AR używa wcześniej utworzonych stałych w modelu UrlRoute.

  1. Łączymy ActualUrlBehavior

    Po skonfigurowaniu cały użytkownik może nadal kliknąć stary link i zobaczyć stronę. Na przykład stworzyliśmy piękny adres URL / best-post dla / post / view? Id = 6 . Ale użytkownik może nadal podążać za starym linkiem i pobrać stronę, chociaż najlepiej byłoby, gdyby został wysłany na nowy adres URL z przekierowaniem 301.
    Oto przykład obsługi żądania z mojego projektu.

    class PostController rozszerza Controller {// ... public function actionView ($ id) {/ ** @var Post $ model * / $ model = Post :: find () -> andWhere (['id' => $ id] ) -> jeden (); $ model-> wyzwalacz (ActualityUrlBehavior :: EVENT_CHECK_URL); zwraca $ this-> render ('view', ['model' => $ model]); } // ...}

    Mówię od razu, nie musisz podłączać zachowania do całego kontrolera. To zachowanie jest potrzebne tylko w widoku akcji.
    To zachowanie musi także przekazać klasę naszego nowo utworzonego modelu UrlRoute i nazwę obiektu ze stałej.

  2. Utwórz CRUD, aby zarządzać trasami.

    W widokach jest trochę logiki, więc oto przykłady głównych fragmentów kodu z twojego projektu.

Plik create.php

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

Plik Update.php

<? php $ form = ActiveForm :: begin ()?&gt; <? = $ form-> pole ($ model, 'path')?&gt; <? php if ($ model-> checkAction ($ model :: ACTION_INDEX)) :?&gt; <? = $ form-> pole ($ model, 'object_key') -> dropDownList ($ model :: getObjectItems ())?&gt; <? php elseif ($ model-> checkAction ($ model :: ACTION_VIEW) ):?&gt; <? = $ form-> pole ($ model, 'object_key') -> dropDownList ($ model :: getObjectItems ())?&gt; <? = $ form-> pole ($ model, 'object_id') ?&gt; <? php elseif ($ model-> checkAction ($ model :: ACTION_REDIRECT)):?&gt; <? = $ form-> pole ($ model, 'url_to')?&gt; <? php endif; ?&gt; <? = $ form-> pole ($ model, 'http_code')?> <button type = "submit" </ button&gt; <? php ActiveForm :: end ()?>

Plik 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 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); }]],],])?>

Instalacja

Preferowany sposób instalacji tego rozszerzenia jest zakończony kompozytor .

Albo biegnij

php composer.phar require --prefer-dist voskobovich / yii2-seo-toolkit "^ 1.0"

lub dodaj

„voskobovich / yii2-seo-toolkit”: „^ 1.0”

plik composer.json.

Php $ form = ActiveForm :: begin ()?
Gt; <?
Form-> pole ($ model, 'path')?
Gt; <?
Form-> pole ($ model, 'action_key') -> dropDownList ($ model :: getActionItems ())?
Php ActiveForm :: end ()?
Php $ form = ActiveForm :: begin ()?
Gt; <?
Form-> pole ($ model, 'path')?
Gt; <?