Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

Selector based page content

Avatar

Community Advisor

Hi Team,

We've a base page from where header/footer components are inherited. We have a requirement where we need to render the page content based on selectors in the page url.

Eg: If the url is localhost:4502/content/poc/product.html, it loads entire content.

If url is localhost:4502/content/poc/product.headless.html --> then it should not load header/footer components.What is the best approach to get header/footer less page content? Do we have any OOTB feature in AEM 6.4?

Please provide your inputs on this.

1 Accepted Solution

Avatar

Correct answer by
Level 6

Hi sivaprasadreddys​,

As mentioned by Arun Patidar above, you can add additional scripts in your basepage component or the one that inherits it and handle the includes in those files. e.g. you can have headless.html for omitting header/footer, nostyles.html for omitting css/js and basepage.html for a generic one.

So when content/somepage.headless.html is called the script headless.html under basepage takes priority and anything written under it will override the generic basepage.html

Instead of naming the file product.headless.html inside the components just create a file headless.html in the basepage component and sling will handle the output accordingly.

View solution in original post

6 Replies

Avatar

Level 6

You can probably write a sling model to check if 'headless' exists in selector.

And based on the boolean include header/footer in the basepage.

Model Class:

@Model(adaptables = SlingHttpServletRequest.class)

public class SelectorOperations {

@Inject

SlingHttpServletRequest request;

private boolean headless = false;

@PostConstruct

public void postConstruct() {

if (request != null) {

List<String> selectors = Arrays.asList(request.getRequestPathInfo().getSelectors());

headless = selectors.contains("headless");

}

}

public boolean isHeadless() {

return headless;

}

}

HTL:

<div data-sly-use.selectorOperations="com.aem.SelectorOperations"> <div data-sly-test="!selectorOperations.headless" >Include header and footer logic here </div> </div>

Code sample found from: Get selector value from sightly html page [Bit Urgent : Any thoughts on this will be helpful]

Avatar

Community Advisor

Hi,

In your page component create a file headless.html and don't include header and footer components in it

e.g. you can put whatever you want in selector  file

page.html

<!doctype html>

<html lang="en">

    <head>

        <sly data-sly-include="partials/head.html" data-sly-unwrap/>

        <sly data-sly-include="partials/headlibs.html" data-sly-unwrap/>

    </head>

    <body class="page ${currentPage.template.name}">

        <sly data-sly-include="partials/main.html" data-sly-unwrap/>

        <sly data-sly-include="partials/footlibs.html" data-sly-unwrap/>

    </body>

</html>

headless.html

<!doctype html>

<html lang="en">

    <head>

        <sly data-sly-include="partials/headlibs.html" data-sly-unwrap/>

    </head>

    <body class="page ${currentPage.template.name}">

        <sly data-sly-include="partials/main.html" data-sly-unwrap/>

    </body>

</html>

or

    <body class="page ${currentPage.template.name}">

        <sly data-sly-include="partials/main.html" data-sly-unwrap/>

    </body>



Arun Patidar

Avatar

Community Advisor

Thanks Ram for the quick reply.

Instead of writing sling models I'm trying to create component sightly htmls like  products.html , products.headless.html, trying to see if that works but unfortunately It didn't work.

The reason why i'm checking without slingmodel is , removing header/footer is one use case. we have multiple use cases where we need to render page output based on selectors like no styles, mobilecontent, desktopcontent etc...

Eg: to remove script/css and just display content we use selector  .nostyles.html

Avatar

Former Community Member

HTL is a front end (sure you hvae basic programming commands like looping, etc), BUT you would need to use Java as part of an HTL/Sling model to complete this.

Avatar

Correct answer by
Level 6

Hi sivaprasadreddys​,

As mentioned by Arun Patidar above, you can add additional scripts in your basepage component or the one that inherits it and handle the includes in those files. e.g. you can have headless.html for omitting header/footer, nostyles.html for omitting css/js and basepage.html for a generic one.

So when content/somepage.headless.html is called the script headless.html under basepage takes priority and anything written under it will override the generic basepage.html

Instead of naming the file product.headless.html inside the components just create a file headless.html in the basepage component and sling will handle the output accordingly.

Avatar

Community Advisor

Thanks every for your inputs. I will try and keep you update on this.