[JAVA] Je souhaite contrôler l'affichage de la barre de navigation de gestion supérieure (menu Contrôle) dans Liferay 7 / DXP

Version correspondante

Liferay DXP SP1 ou version ultérieure / Liferay 7 CE

introduction

Il existe de nombreuses exigences de projet qui souhaitent contrôler l'affichage du menu de contrôle en haut de Liferay. La méthode de traitement d'un tel cas sera décrite.

Document officiel: THEME CONTRIBUTORS Document officiel: CONTEXT CONTRIBUTORS L’explication de la façon de le gérer est décrite dans, mais la méthode réelle de création d’un portlet est expliquée ici.

Conditions préalables

On suppose que l'espace de travail Liferay a été créé et que les outils de lame et divers outils de création de thème ont été installés. Le document suivant explique la méthode de configuration.

En tant que scénario de test, le rôle standard de Liferay, la spécification selon laquelle le menu de contrôle n'est affiché qu'aux utilisateurs disposant de privilèges d'administrateur est implémentée.

Créer un contributeur de contexte de modèle

Déplacé sous $ (liferay_workspace) / modules.

Nous devons donc créer un contributeur de thème pour remplacer le bundle du menu de contrôle. Sélectionnez Fichier-> Nouveau-> Projet de module Liferay dans Liferay Developer Studio / IDE, et sélectionnez Contributeur de contexte de modèle dans Nom du modèle de projet.

Ou sur la ligne de commande

blade create -t template-context-contributor -p com.liferay.product.navigation.control.menu.theme.contributor -c SampleProductNavigationControlMenu sample-product-navigation-control-menu-theme-contributor

Créez un projet de module à l'aide de l'outil Blade dans.

Création d'un SampleProductNavigationControlMenuTemplateContextContributor

Ouvrez le fichier de base du menu de contrôle

ProductNavigationControlMenuTemplateContextContributor.java


vi /liferay-portal/modules/apps/web-experience/product-navigation/product-navigation-control-menu-theme-contributor/src/main/java/com/liferay/product/navigation/control/menu/theme/contributor/internal/ProductNavigationControlMenuTemplateContextContributor.java

Copiez la partie suivante dans SampleProductNavigationControlMenuTemplateContextContributor.java.

	@Override
	public void prepare(
		Map<String, Object> contextObjects, HttpServletRequest request) {

		boolean isShowControlMenu = isShowControlMenu(request);

		contextObjects.put("isShowControlMenu", String.valueOf(isShowControlMenuFlg));
	}

	protected boolean isShowControlMenu(HttpServletRequest request) {
		ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
			WebKeys.THEME_DISPLAY);

		if (themeDisplay.isImpersonated()) {
			return true;
		}

		if (!themeDisplay.isSignedIn()) {
			return false;
		}

		User user = themeDisplay.getUser();

		if (!user.isSetupComplete()) {
			return false;
		}

		return true;
	}

Ensuite, si vous affinez l'affichage uniquement si vous disposez des privilèges d'administrateur pour le rôle standard et ajoutez un processus pour définir une variable qui génère les conditions d'affichage du côté du thème, ce sera comme suit.

    @Override
    public void prepare(
        Map<String, Object> contextObjects, HttpServletRequest request) {

        //Écrivez une variable pour que Thème puisse juger si le menu est affiché ou non.
        boolean isShowControlMenu = isShowControlMenu(request);
        contextObjects.put("isShowControlMenu", String.valueOf(isShowControlMenu));
    }

    protected boolean isShowControlMenu(HttpServletRequest request) {
        ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
            WebKeys.THEME_DISPLAY);

        if(!isAdmin(request)) {
            return false;
        }

        if (themeDisplay.isImpersonated()) {
            return true;
        }

        if (!themeDisplay.isSignedIn()) {
            return false;
        }

        User user = themeDisplay.getUser();

        if (!user.isSetupComplete()) {
            return false;
        }

        return true;
    }

    /**
     * Extra check for test
     * 
     * @param request
     * @return
     */
    protected boolean isAdmin(HttpServletRequest request) {
        ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
                WebKeys.THEME_DISPLAY);
        boolean bRet = false;

        try {

            //Je souhaite l'afficher uniquement lorsque j'ai des privilèges d'administrateur.
            //Ici, pour des raisons d'explication, le rôle est acquis sous forme de chaîne de caractères, mais il peut être préférable d'utiliser l'ID de rôle dans le projet réel.
            //(Étant donné que le nom de rôle de l'administrateur peut changer dans le projet réel. Si l'ID de rôle peut changer pour chaque base de données, il peut être préférable d'utiliser une chaîne de caractères telle que Administrateur comme clé.)
            Role adminRole = RoleLocalServiceUtil.getRole(themeDisplay.getCompanyId(), "Administrator");

            List<Role> roles = themeDisplay.getUser().getRoles();

            for(Role role : roles) {
                if(role.getName().equals(adminRole.getName())) {
                    bRet = true;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bRet;
    }	

Ensuite, modifiez le fichier bnd.bnd comme suit.

bnd.bnd


Bundle-SymbolicName: sampleproductnavigationcontrolmenutemplatecontextcontributor
Bundle-Version: 2.0.6
Liferay-Releng-Module-Group-Description:
Liferay-Releng-Module-Group-Title: Product Navigation
Liferay-Theme-Contributor-Type: product-navigation-control-menu
Web-ContextPath: /product-navigation-control-menu-theme-contributor

Bundle-Version, Liferay-Theme-Contributor-Type et Web-ContextPath copient le bnd.bnd de ProductNavigationControlMenuTemplateContextContributor.java inclus dans le DXP actuel.

Maintenant que le contributeur de thème est prêt,

blade deploy

Déployez avec, puis créez un thème.

Créer un thème

Accédez au répertoire $ (liferay_workspace) / themes et créez un thème avec le thème classique Liferay CE. (Voir Comment créer un thème dans Liferay 7 / DXP)

Changer ce qui suit

init-custom.ftl


<#if isShowControlMenuFlg>
    css_class = css_class?replace("has-control-menu", "")
    css_class = css_class?replace("open", "")
</#if>

Après avoir changé la classe CSS comme

portal_normal.ftl


<@liferay.control_menu />

À

portal_normal.ftl


<#assign isShowControlMenu = htmlUtil.escape(isShowControlMenu!) />
<#if "true" == isShowControlMenu >
	<@liferay.control_menu />
</#if>

changer en,

gulp deploy

Déployez avec.

Si vous déployez le contributeur / thème ci-dessus, les utilisateurs disposant de privilèges d'administrateur devraient voir le menu de contrôle et aucun autre utilisateur ne devrait le voir.

Recommended Posts

Je souhaite contrôler l'affichage de la barre de navigation de gestion supérieure (menu Contrôle) dans Liferay 7 / DXP
Je souhaite changer la couleur du menu de contrôle en haut de Liferay 7 / DXP
Je souhaite afficher le nom de l'affiche du commentaire
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
Je veux contrôler le message d'erreur par défaut de Spring Boot
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Je veux connaître le JSP du portlet ouvert lors du développement de Liferay
[Ruby] Je souhaite afficher les éléments publiés par ordre de date la plus récente
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
Je veux var_dump le contenu de l'intention
Je veux obtenir la valeur en Ruby
Je veux intégrer n'importe quel TraceId dans le journal
Je veux connaître la réponse de l'application Janken
Je veux retourner la position de défilement de UITableView!
[Active Admin] Je souhaite spécifier l'étendue de la collection à afficher dans select_box
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
Je souhaite contrôler la taille de fichier maximale pour le téléchargement de fichiers pour chaque URL dans Spring Boot
Je souhaite passer au même écran dans l'état enregistré
Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano
[Ruby] Je souhaite inverser l'ordre de la table de hachage
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Je veux connaître la méthode du contrôleur où l'exception a été levée dans le ExceptionHandler de Spring Boot
Je veux comprendre le flux des paramètres de demande de traitement Spring
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Je veux limiter l'entrée en réduisant la plage de nombres
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
[Java] Je veux effectuer distinctement avec la clé dans l'objet
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Je souhaite importer les éléments du menu déroulant lors de la soumission d'un formulaire dans Rails en CSV et les afficher à partir des données de la base de données.
[Ruby] Je souhaite afficher uniquement le caractère impair dans la chaîne de caractères
Je veux afficher des images avec REST Controller de Java et Spring!
[Swing] Comment afficher un nom arbitraire dans la barre de menu sur Mac
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Comment changer l'affichage du menu d'en-tête pour chaque page de transition
Je veux passer l'argument d'Annotation et l'argument de la méthode d'appel à aspect
Je souhaite afficher un PDF chinois (coréen) avec des rapports fins
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
Je veux utiliser @Autowired dans Servlet
Si vous souhaitez satisfaire la couverture de test des méthodes privées dans JUnit
Je veux obtenir la valeur de Cell de manière transparente quel que soit CellType (Apache POI)
[Swift] Comment changer l'ordre des éléments de barre dans le contrôleur de barre d'onglets [Débutant]
Mémo de développement ~ Je souhaite afficher uniquement la première image publiée plusieurs fois ~
Je veux voir le contenu de Request sans dire quatre ou cinq
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe