Site icon Blog ARC Optimizer

Restrictions de page dans un module d'initialisation


La gestion de vos AllowedTypes (options d'insertion) dans Episerver peut devenir accablante, selon la stratégie que vous adoptez.

Vous pouvez lire les différentes options ici:

mais il y a une stratégie que vous pouvez adopter pour un très développeur- approche amicale.

Comme souligné sur le fil de discussion du forum Epi World ( Dylan McCurry et moi avons travaillé ensemble sur le projet où nous l'implémentons et nous l'utilisons sur tous les projets depuis) , vous pouvez en fait manipuler IAvailableSettingsRepository lors de l'initialisation pour définir toutes vos restrictions en un seul endroit.

La solution

Créez un module d'initialisation Episerver standard et implémentez la fonction Initialize ().

[InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
 classe publique PageRestrictionInitialization: IInitializableModule
{
    private IContentTypeRepository _contentTypeRepository;
    private IAvailableSettingsRepository _availableSettingsRepository;
    private ILogger _log;
    
    public void Initialize (contexte InitializationEngine)
    {
    }

    public void Uninitialize (contexte InitializationEngine)
    {
    }
} 

Nous utilisons deux fonctions d'aide qui rendent le code plus propre et plus facile à lire et à maintenir.

 private void DisallowAll  ()
{
    var page = _contentTypeRepository.Load (typeof (T));

    var setting = nouveau AvailableSetting
    {
         Disponibilité = Disponibilité.Aucune
    };

    _availableSettingsRepository.RegisterSetting (page, paramètre);
} 

La fonction DisallowAll () est utilisée pour définir que le type de page passé n'est pas autorisé à être inséré sous une autre page. Nous utilisons cette fonction pour définir d'abord la disponibilité sur aucune, puis définir la disponibilité comme nous le souhaitons.

 private void SetPageRestriction  (IEnumerable  pageTypes)
{
     var page = _contentTypeRepository.Load (typeof (T));

     var setting = nouveau AvailableSetting
     {
            Disponibilité = Disponibilité.Spécifique
     };

     foreach (var pageType dans pageTypes)
     {
            var contentType = _contentTypeRepository.Load (pageType);
            setting.AllowedContentTypeNames.Add (contentType.Name);
     }

     _availableSettingsRepository.RegisterSetting (page, paramètre);

     _log.Log (Level.Debug, restriction $ "{page.Name} ajoutée.");
} 

La fonction SetPageRestriction () est l'endroit où toutes les restrictions sont effectuées. Vous pouvez transmettre la liste des types de page comme argument de fonction et que ces types de page seront définis comme types de page autorisés pour le type de type de page passant .

Nous pouvons maintenant implémenter le Fonction Initialize ().

 public void Initialize (contexte InitializationEngine)
{
    _contentTypeRepository = ServiceLocator.Current.GetInstance  ();
    _availableSettingsRepository = ServiceLocator.Current.GetInstance  ();
    _log = LogManager.GetLogger ();

    var sysRoot = _contentTypeRepository.Load ("SysRoot") en tant que PageType;
    var setting = nouveau AvailableSetting
    {
        Disponibilité = Disponibilité Spécifique,
        AllowedContentTypeNames =
        {
            nameof (StartPage), // impossible d'utiliser des interfaces personnalisées avec IContentTypeRepository
        }
    };
    _availableSettingsRepository.RegisterSetting (sysRoot, paramètre);

    // Interdire l'insertion pour toutes les pages relatives aux produits et aux articles
    DisallowAll  ();
    DisallowAll  ();
    DisallowAll  ();
    DisallowAll  ();

    // Page d'accueil
    SetPageRestriction  (nouvelle liste 
    {
        typeof (ContainerPage),
        typeof (StandardPage),
        typeof (LandingPage),
        typeof (FindSearchPage),
        typeof (ProductPage)
    });

    // Page de destination
    SetPageRestriction  (nouvelle liste 
    {
        typeof (ArticlePage),
        typeof (NewsPage)
    });

    // Page Conteneur
    SetPageRestriction  (nouvelle liste 
    {
        typeof (ContactPage)
    });

    // Page produit
    SetPageRestriction  (nouvelle liste 
    {
        typeof (ContainerPage),
        typeof (StandardPage)
    });
} 

J'utilise le site Web de démonstration d'Episerver Alloy pour cet exemple et tous les types de page sont du projet Alloy.

Nous obtenons d'abord le nœud SysRoot comme type de page et l'utilisons comme première page / nœud. Ensuite, nous n'autorisons que la StartPage à être insérée sous la page racine et enregistrons les paramètres.

Ensuite, nous interdisons l'insertion de toute page sous ProductPage, ArticlePage, LandingPage et FindSearchPage. Nous devons maintenant autoriser l'insertion pour chaque type de page comme nous le voulons. Pour cet exemple, je l'ai fait pour StartPage, LandingPage, ContainerPage et ProductPage.

Et c'est tout.

De cette façon, vous disposez d'un modèle propre pour tous les types de pages et tout au même endroit et il est facile à maintenir et à étendre ultérieurement. Et ce concept se consolide aux premiers principes SOLID – Responsabilité unique.

À propos de l'auteur

Nenad est un développeur de logiciel CMS EPiServer certifié, actuellement axé sur les technologies .NET CMS, principalement ASP .NET et MVC, JavaScript et jQuery, WCF et applications de bureau avec WPF. Il travaille également avec MS SQL et MySql. Nenad n'est pas étranger à WordPress et Drupal 7/8. Pendant son temps libre, il adore jouer au basket, à la guitare et se moquer de lui pour amuser sa fille!

Plus de cet auteur






Source link
Quitter la version mobile