2017-02-01 5 views
2

J'ai un thème dans liferay où il y a quelques éléments dans le menu latéral, je veux ajouter plus d'éléments au menu dynamiquement basé sur les valeurs i obtenu dans le contrôleur du portlet.comment créer des éléments dynamiques dans le thème liferay selon les valeurs du portlet

Mon thème est comme ceci:

<div id="menu"> 
    <ul class="link" style="height: 609px;">  
     <li><a href="$themeDisplay.getPortalURL()/x" id="x" class="active">My Account<i class="pull-right" ></i></a></li> 
     <li><a href="$themeDisplay.getPortalURL()/y" id="y" class="active">Settings<i class="pull-right" ></i></a></li> 
    </ul> 
</div> 

J'ai un portlet d'où j'obtient des valeurs dans une liste

List<String> list= new ArrayList<String>(); 
list.add("test1"); 
renderRequest.setAttribute("list", list); 

La liste pourrait avoir des valeurs différentes. Ce que je veux est si j'ai un paramètre appelé test1 dans la liste, je veux ajouter un nouveau paramètre dans le thème pour être disponible pour cet utilisateur particulier.

<li><a href="$themeDisplay.getPortalURL()/z" id="z" class="active">Bonus<i class="pull-right" ></i></a></li> 

Si c'était JSP, je l'aurais utilisé la mais comment peut-il être fait dans le thème de Liferay. (J'utilise le thème de la vitesse).

+0

meilleure solution est de créer 1 portlet avec des valeurs dynamiques et l'intégration, qui dans le thème –

+0

Pourriez-vous s'il vous plaît fournir plus de détails sur la façon dont cela peut être fait. –

+1

vous créez un portlet dont la seule fonctionnalité est d'afficher les éléments dynamiques en fonction de la logique dont vous avez besoin. Et puis vous l'intégrez dans votre thème .. –

Répondre

2

Selon la réponse d'Olaf, vous devriez probablement procéder à une meilleure approche de cette conception. Vous pouvez toutefois utiliser des attributs du contexte Servlet dans le thème. Dans votre classe portlet:

HttpServletRequest request=PortalUtil.getHttpServletRequest(req); 
    ServletContext servletContext=request.getSession().getServletContext(); 
    servletContext.setAttribute("param", "Product3"); 

qui peut ensuite être récupéré dans le thème par la demande variable disponible dans le modèle de vitesse thème:

$request.getSession().getServletContext().getAttribute("param") 
+0

Merci Shivam, Oui cela fonctionne actuellement pour moi, mais l'inconvénient est que si j'ai plus d'un portlet dans la page, je dois placer ce code dans tout le portlet pour le thème pour trouver la valeur que je fixe dans le param . –

+1

Il semble que je ne suis toujours pas clair avec la conception, allez-vous obtenir des paramètres de tous/plusieurs portlets sur la page, comme la question mentionne «J'ai un portlet» –

+0

En fait votre réponse a fonctionné pour moi, je pensais juste à un cas Par exemple, si j'avais plus d'un portlet dans la page, alors la même chose n'aurait pas fonctionné. Merci beaucoup! :) –

2

Il y a déjà une discussion à ce sujet dans les commentaires à votre question. Votre thème ne peut pas accéder au "contrôleur de votre portlet", c'est une mauvaise façon de penser au problème: Si un portlet détermine ce qu'il doit afficher, vous devez intégrer le portlet dans le thème. Après tout, vous voulez probablement interagir avec, et c'est la façon la plus facile de le faire. Même si un portlet est présent sur une page, un thème ne peut pas utiliser arbitrairement les attributs de requête d'un portlet - ils sont bien protégés les uns des autres par la conception: sinon, vous avez toutes sortes de conflits entre les portlets. portlets et thèmes voyous. Et aussi longtemps que vous ne pouvez pas garantir qu'un portlet est sur la page, vous ne pouvez pas simplement appeler des méthodes arbitraires sur le portlet de toute façon. (pas que vous pourriez autrement).

Si vous souhaitez mettre en œuvre cette fonctionnalité dans un thème, dites adieu au "contrôleur de portlet". Vous devriez avoir votre code dans une classe utilitaire indépendante, car un portlet dans ce cas est juste le mauvais endroit pour l'implémentation. Je ne comprends pas complètement votre utilisation complète, donc je ne peux pas vous dire quelle implémentation a le plus de sens. Seulement que la combinaison que vous avez esquissée dans votre question me semble la moins logique.

+0

@Navankur En ajoutant à la réponse d'Olaf, cherchez-vous à modifier le thème sur la base de l'interaction de l'utilisateur? en utilisant portlet) ou quelle est exactement la signification de la même chose? –

+0

oui @ShivamAggarwal, j'ai une page où il y a un portlet et j'y ai appliqué un thème, maintenant selon l'interaction de l'utilisateur ou basé sur la valeur obtenue de la base de données pour un utilisateur particulier je veux faire quelques changements dans le Thème de cette page particulière: PS: - Le portlet et le thème sont dans une page particulière. –