Pages de Redirection

Prérequis : Fondations Communes

Objectif

Créer le CmsController avec les actions de redirection pour gérer le Node racine (détection de langue) et les Nodes containers (redirection vers le premier article).

Créer CmsController.php

Rôle : Controller principal gérant toutes les pages du site CMS.

Fichier : webapp/controllers/CmsController.php

    <?php

namespace webapp\controllers;

use blackcube\core\web\controllers\BlackcubeController;
use webapp\behaviors\HrefLangBehavior;
use Exception;
use Yii;
use yii\web\NotFoundHttpException;

class CmsController extends BlackcubeController
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['lang'] = [
            'class' => HrefLangBehavior::class
        ];
        return $behaviors;
    }
    
    // Actions définies ci-dessous
}
    

Action actionRedirectLanguage()

Usage : Node racine (niveau 1) pour détection de langue

  1. Récupère la langue préférée du navigateur parmi FR/EN
  2. Recherche l'enfant direct correspondant à cette langue
  3. Redirige vers cet enfant
  4. Lève une 404 si aucun enfant ne correspond
Fonctionnement :

    public function actionRedirectLanguage()
{
    try {
        Yii::debug('Trace :'.__METHOD__, __METHOD__);
        $node = $this->element;
        $lang = Yii::$app->request->getPreferredLanguage(['fr','en']);
        $targetNode = $node->getChildren()
            ->andWhere(['languageId' => $lang])
            ->active()
            ->one();
        if ($targetNode !== null) {
            return $this->redirect([$targetNode->getRoute()]);
        } else {
            throw new NotFoundHttpException('No home node found');
        }
    } catch (Exception $e) {
        Yii::error($e->getMessage(), __METHOD__);
        throw $e;
    }
}
    

Exemple :

    / (Node racine, Type: Redirect Language)
├── /fr (Node FR)
└── /en (Node EN)

Visiteur avec navigateur FR → Redirige vers /fr
Visiteur avec navigateur EN → Redirige vers /en
    

Action actionRedirectFirstComposite()

Usage : Nodes (Rubriques sans contenu propre)

  1. Récupère le premier Composite actif du Node
  2. Redirige vers ce Composite
  3. Lève une 404 si aucun Composite actif
Fonctionnement :

    public function actionRedirectFirstComposite()
{
    try {
        Yii::debug('Trace :'.__METHOD__, __METHOD__);
        $node = $this->element;
        $targetComposite = $node->getComposites()
            ->active()
            ->one();
        if ($targetComposite !== null) {
            return $this->redirect([$targetComposite->getRoute()]);
        } else {
            throw new NotFoundHttpException('No content found');
        }
    } catch (Exception $e) {
        Yii::error($e->getMessage(), __METHOD__);
        throw $e;
    }
}
    

Exemple :

    /fr/guide (Node Guide, Type: Redirect First Composite)
├── /fr/guide/installation (Composite)
├── /fr/guide/configuration (Composite)
└── /fr/guide/utilisation (Composite)

Visite de /fr/guide → Redirige vers /fr/guide/installation
    

Configuration des Types

Ces actions seront associées aux Types dans le back-office :

  1. Route : cms/redirect-language
  2. Usage : Node racine uniquement
Type "Redirect Language" :

  1. Route : cms/redirect-first-composite
  2. Usage : Nodes (Guide, À propos, About)
Type "Redirect First Composite" :

Validation

Avant de continuer :

  1. CmsController.php créé avec HrefLangBehavior
  2. actionRedirectLanguage() implémentée (détection langue)
  3. actionRedirectFirstComposite() implémentée (premier article)