Задать вопрос
humiliation
@humiliation
Чем больше знаю - тем больше дурак

Как правильно сделать seo модуль для Yii2?

Приветствую!

Сейчас у меня есть небольшой сайт, на котором за разные зоны урлов отвечают разные контроллеры.
Проблема вот в чем: до этого я писал информационник, там все подкатегории и категории были реализованы в одном месте - один контроллер, один метод - внедрить возможность изменения title и description на уровне базы страниц было не сложно.

Тут же ситуация посложней - контроллеров штук 6, 3 раздела уникальны, в каждом контроллере по 7-15 экшенов. Соответвественно, придется вставлять везде одинаковые проверки и дублировать код - ну нафиг. Всех возможностей Yii2 не знаю, в голове крутится вариант выноса этого в главный layout, т.к. он один на весь фронт, но этот вариант рассматриваю только как крайне запасной.

Подскажите, куда двигаться и как реализовать подобное.
  • Вопрос задан
  • 1125 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Надо конечно смотреть на структуру, но:
Можно написать хелпер и дергать его метод, что бы не дублировать код.
Можно написать поведение и подключать в контроллере.
Можно написать компонент и прицепить в конфиге. Там же зацепиться за событие, например beforeAction и выполнить его метод.
Ответ написан
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
... в главный layout, т.к. он один на весь фронт, но этот вариант рассматриваю только как крайне запасной.

Почему? Разве это проблема подключить компонент в единой нужной точке?
5ac3653b689f4292163369.png

Дополняю:
/**
 * Зарегистрировать все тэги метаданных для страницы с правила
 */
public function applySeoRule ()
{
    # Не применяем правила если отключен
    if ( ! $this->isEnabled() ) {
        return;
    }
    # Только если есть правило для SEO
    if ( $this->hasSeoRule() ) {
        $view = Yii::$app->controller ?
            Yii::$app->controller->getView() :
            Yii::$app->getView();
        $seoRule = $this->getSeoRule();
        # Параметры индексации
        if ( $seoRule->is_no_index ) {
            $view->registerMetaTag( [
                'name' => 'robots',
                'content' => 'noindex',
            ], 'robots' );
        }
        # Основные метаданные
        if ( $seoRule->title !== '' ) {
            $view->title = $seoRule->title;
        }
        if ( $seoRule->description !== '' ) {
            $view->registerMetaTag( [
                'name' => 'description',
                'content' => $seoRule->description,
            ], 'description' );
        }
        if ( $seoRule->keywords !== '' ) {
            $view->registerMetaTag( [
                'name' => 'keywords',
                'content' => $seoRule->keywords,
            ], 'keywords' );
        }
        # Метаданные OpenGraph
        $opengraphTags = [
            'opengraph_title' => 'og:title',
            'opengraph_site_name' => 'og:site_name',
            'opengraph_url' => 'og:url',
            'opengraph_description' => 'og:description',
        ];
        $registerOpengraph = false;
        foreach ( $opengraphTags as $attribute => $tagName ) {
            if ( isset( $seoRule->$attribute ) && $seoRule->$attribute !== '' ) {
                $view->registerMetaTag( [
                    'name' => $tagName,
                    'content' => $seoRule->$attribute,
                ], $tagName );
                $registerOpengraph = true;
            }
        }
        if ( $seoRule->opengraphImage ) {
            $view->registerMetaTag( [
                'name' => 'og:image',
                'content' => $seoRule->opengraphImage->getFileUrlWithDomain(),
            ], 'og:image' );
            $registerOpengraph = true;
        }
        if ( $registerOpengraph ) {
            $view->registerMetaTag( [
                'name' => 'og:locale',
                'content' => str_replace( '-', '_', Yii::$app->language ),
            ], 'og:locale' );
            $view->registerMetaTag( [
                'name' => 'og:type',
                'content' => 'website',
            ], 'og:type' );
        }
        # Twitter OpenGraph
        $twitterTags = [
            'twitter_url' => 'twitter:url',
            'twitter_title' => 'twitter:title',
            'twitter_description' => 'twitter:description',
            'twitter_site' => 'twitter:site',
            'twitter_creator' => 'twitter:creator',
        ];
        $registerTwitter = false;
        foreach ( $twitterTags as $attribute => $tagName ) {
            if ( isset( $seoRule->$attribute ) && $seoRule->$attribute !== '' ) {
                $view->registerMetaTag( [
                    'name' => $tagName,
                    'content' => $seoRule->$attribute,
                ], $tagName );
                $registerTwitter = true;
            }
        }
        if ( $seoRule->twitterImage ) {
            $view->registerMetaTag( [
                'name' => 'twitter:image',
                'content' => $seoRule->twitterImage->getFileUrlWithDomain(),
            ], 'twitter:image' );
            $registerTwitter = true;
        }
        if ( $registerTwitter ) {
            $view->registerMetaTag( [
                'name' => 'twitter:card',
                'content' => 'summary',
            ], 'twitter:card' );
        }
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы