Expand my Community achievements bar.

July 31st AEM Gems Webinar: Elevate your AEM development to master the integration of private GitHub repositories within AEM Cloud Manager.
SOLVED

Show a tab in page properties only if page is under /content/A and /content/B in the content tree

Avatar

Level 7

I have a tab in the page template. It shows in page properties for all pages. 

I would like to restrict it only for pages under /content/A and /content/B in the content tree.

I tried solving this using <granite:rendercondition condition="${condition}"> but it didn't work. How can I use granite:condition to show a Tab only for specific PATHS?

Any suggestions how to approach this task?

1 Accepted Solution

Avatar

Correct answer by
Level 3

Hi @anasustic !

Can you please confirm while opening page properties of a page, you are getting encoded URL (http://localhost:4506/mnt/overlay/wcm/core/content/sites/properties.html?item=%2Fcontent%2Fzkb%2Fde%... as when I am trying to open page properties of any page it is coming like https://localhost:4502/mnt/overlay/wcm/core/content/sites/properties.html?item=/content/we-retail/us....

Also, I am able to hide a tab using below render condition properties,

imshailesh_0-1688639049211.png

param.item will get you /content/we-retail/us/en/experience/arctic-surfing-in-lofoten.

For debugging, you can use

 

<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>

 

 

and logging statement as 

 

 

Log logger = LogFactory.getLog( this.getClass(  ) );
String suffix = slingRequest.getParameter("item");
logger.info( "This is a suffix" + suffix);

 

 You can see the logs in error.log of aem instance. 

Below is my /libs/granite/ui/components/coral/foundation/renderconditions/simple/simple.jsp

 

<%@ include file="/libs/granite/ui/global.jsp" %><%
%><%@ page session="false"
          import="com.adobe.granite.ui.components.Config,
                  com.adobe.granite.ui.components.rendercondition.RenderCondition,
                  com.adobe.granite.ui.components.rendercondition.SimpleRenderCondition" %>
<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>
                      <%--###
Simple
======

.. granite:servercomponent:: /libs/granite/ui/components/coral/foundation/renderconditions/simple
   :rendercondition:

   A condition that takes a simple boolean for the decision.

   It has the following content structure:

   .. gnd:gnd::

      [granite:RenderConditionsSimple]

      /**
       * The expression to evaluate.
       */
      - expression (BooleanEL) = true
###--%><%
Log logger = LogFactory.getLog( this.getClass(  ) );
Config cfg = cmp.getConfig();
String suffix = slingRequest.getParameter("item");
logger.info( "This is a suffix" + suffix);
boolean vote = cmp.getExpressionHelper().getBoolean(cfg.get("expression", "true"));
request.setAttribute(RenderCondition.class.getName(), new SimpleRenderCondition(vote));
%>

 


Note : This functionality will not work for tab when we are trying to create a page due to issue I mentioned in last reply.

View solution in original post

8 Replies

Avatar

Community Advisor

Here you have a list of possible examples ootb, https://gist.github.com/nateyolles/eec2f56acc7153fe9fb7dd6637e8f7ad you can check if this works:

 <granite:rendercondition
      jcr:primaryType="nt:unstructured"            
      sling:resourceType="granite/ui/components/coral/foundation/renderconditions/simple"
      expression="${granite:containsIgnoreCase(requestPathInfo.suffix, '/foo/bar')}"/>

If none of the above works, you can simple add a custom one which will check the tree path, refer to this if you don't know how to add a custom one:
https://jpsoares.medium.com/aem-granite-render-conditions-438c804b1e5a 



Esteban Bustamante

Avatar

Level 3

Hello everyone !

 

There is some catch when we are trying to use Simple Render Condition while hiding/showing any tab during page creation. Below are my findings:

${granite:containsIgnoreCase(requestPathInfo.suffix, '/content/we-retail')} is giving false for the below url
http://localhost:5502/mnt/overlay/wcm/core/content/sites/createpagewizard.html/content/we-retail/us/en/experience

 

When I debugged more, what value is being returned for slingRequest.getRequestPathInfo().getSuffix() in /libs/granite/ui/components/coral/foundation/renderconditions/simple/simple.jsp, I could see it is returning /conf/we-retail/settings/wcm/templates/content-page. I am still trying to figure out why it is returning template path instead of page path where we are trying to create page. 

Any leads for this will be useful.

Regards,
Shailesh 

Avatar

Level 7

Hi @imshailesh 
That is super interesting. Thanks for sharing.
How were you able to debug /libs/granite/ui/components/coral/foundation/renderconditions/simple/simple.jsp?

This is my URL http://localhost:4506/mnt/overlay/wcm/core/content/sites/properties.html?item=%2Fcontent%2Fxxx%2Fen%...
and in my case the following rendercondition also does not return true therefore hiding the tab for pages under /content/xxx


<granite:rendercondition
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/renderconditions/simple"
expression="${granite:containsIgnoreCase(requestPathInfo.suffix, '/content/xxx')}"/>

 

Avatar

Correct answer by
Level 3

Hi @anasustic !

Can you please confirm while opening page properties of a page, you are getting encoded URL (http://localhost:4506/mnt/overlay/wcm/core/content/sites/properties.html?item=%2Fcontent%2Fzkb%2Fde%... as when I am trying to open page properties of any page it is coming like https://localhost:4502/mnt/overlay/wcm/core/content/sites/properties.html?item=/content/we-retail/us....

Also, I am able to hide a tab using below render condition properties,

imshailesh_0-1688639049211.png

param.item will get you /content/we-retail/us/en/experience/arctic-surfing-in-lofoten.

For debugging, you can use

 

<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>

 

 

and logging statement as 

 

 

Log logger = LogFactory.getLog( this.getClass(  ) );
String suffix = slingRequest.getParameter("item");
logger.info( "This is a suffix" + suffix);

 

 You can see the logs in error.log of aem instance. 

Below is my /libs/granite/ui/components/coral/foundation/renderconditions/simple/simple.jsp

 

<%@ include file="/libs/granite/ui/global.jsp" %><%
%><%@ page session="false"
          import="com.adobe.granite.ui.components.Config,
                  com.adobe.granite.ui.components.rendercondition.RenderCondition,
                  com.adobe.granite.ui.components.rendercondition.SimpleRenderCondition" %>
<%@ page import="org.apache.commons.logging.Log" %>
<%@ page import="org.apache.commons.logging.LogFactory" %>
                      <%--###
Simple
======

.. granite:servercomponent:: /libs/granite/ui/components/coral/foundation/renderconditions/simple
   :rendercondition:

   A condition that takes a simple boolean for the decision.

   It has the following content structure:

   .. gnd:gnd::

      [granite:RenderConditionsSimple]

      /**
       * The expression to evaluate.
       */
      - expression (BooleanEL) = true
###--%><%
Log logger = LogFactory.getLog( this.getClass(  ) );
Config cfg = cmp.getConfig();
String suffix = slingRequest.getParameter("item");
logger.info( "This is a suffix" + suffix);
boolean vote = cmp.getExpressionHelper().getBoolean(cfg.get("expression", "true"));
request.setAttribute(RenderCondition.class.getName(), new SimpleRenderCondition(vote));
%>

 


Note : This functionality will not work for tab when we are trying to create a page due to issue I mentioned in last reply.

Avatar

Level 7

Thank you very much @imshailesh for taking the time to answer my question.

Yes, it works nicely like described in your post and I was able to log it in error.log by altering simple.jsp. 

<granite:rendercondition
jcr:primaryType="nt:unstructured"
sling:resourceType="granite/ui/components/coral/foundation/renderconditions/simple"
expression="${!granite:containsIgnoreCase(param.item, '/content/xxx')}"/>



I was able to reproduce your issue by creating the new page.

 

While creating the page the suffix appears to be null:
07.07.2023 14:15:31.977 *INFO* [[0:0:0:0:0:0:0:1] [1688732131969] GET /mnt/overlay/wcm/core/content/sites/createpagewizard/properties.html/conf/xxx/settings/wcm/templates/landingpage HTTP/1.1] org.apache.jsp.libs.granite.ui.components.coral.foundation.renderconditions.simple.simple_jsp This is a suffix null