2013-08-15 26 views
7

Sto tentando di mantenere determinati selettori presenti all'interno dei collegamenti quando si colpisce una pagina cq5.Come procedere sui selettori persistenti nei collegamenti in CQ5/AEM

Ad esempio, supponiamo di aver visitato /content/mysite/mypage.stickyselector.html, voglio che tutti i miei collegamenti successivi nella pagina, come le pagine aboutus.html e contact.html, mantengano l'informazione. stickyselector.html e contact.stickyselector.html link.

Ci sono alcuni motivi per cui sto provando a farlo, inclusa la prevenzione di riscritture eccessive quando i dispositivi mobili colpiscono, come mypage.smart.html, poiché possiamo lasciare che le regole di riscrittura consentano all'utente di passare attraverso senza il riconoscimento successivo di tipo di dispositivo, così come qualsiasi contenuto personalizzato ecc.

Ho provato a creare il mio Link Riscrivere Transformer, che è fantastico per riscrivere i collegamenti in cui si hanno tutte le informazioni a portata di mano, tuttavia, non mi sembra di essere in grado di ottenere i selettori utilizzati per arrivare alla pagina contenente i collegamenti a questo punto.

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

5

Ci sono un paio di approcci:

  1. riscrivere le urls sulla risposta in uscita in CQ (come suggerito da David)
  2. Riscrivi gli url sulla richiesta in entrata utilizzando mod_rewrite su dispatcher (supponendo Apache)

Come David coperto scenario 1, descriverò il secondo scenario

il valore del selettore "appiccicoso" può essere restituito in un cookie al client

Set-Cookie: selector=stickyselector; 

Ogni successiva richiesta al sito dal il client conterrà quel cookie. È quindi possibile utilizzare tale cookie per riscrivere l'URL in Apache prima che venga presentato al modulo dispatcher (ed eventualmente l'istanza pubblicare:

RewriteCond %{HTTP:Cookie} selector=([^;]+) [NC] # If we have the selector cookie 
RewriteRule ^(.*)\.html$ /$1.%1.html [PT]   # add it to the request url before extension 

Quindi una richiesta che arriva al dispatcher simile a questo:

GET /content/mysite/mypage.html HTTP/1.1 
Cookie: selector=stickyselector; 

arriverebbe ad istanza pubblicare riscritta come:

/content/mysite/mypage.stickyselector.html 

Se si utilizza questo metodo per consegne dispositivo/canale specifica, si potrebbe in alternativa utilizzare il valore di agente utente anziché un cookie per guidare l'aggiunta del selettore. Per esempio:

RewriteCond %{HTTP_USER_AGENT} "iphone|ipod|iemobile" [NC] 
RewriteRule ^(.*)\.html$ /$1.mobile.html [PT]    # add channel selector to the request url 

positivi di questo approccio sono che tutti gli utenti sono presentati con lo stesso URL (e.g./content/mysite/mypage.html) i selettori negli URL vengono presentati solo per CQ.

I negativi sono che normalmente richiederebbero i cookie e dipende dalla configurazione di apache.

+0

Neat! Darà sicuramente questo uno a go. Grazie compagno. –

+0

Soluzione eccezionale. Grazie mille. –

5

Se si ha accesso alla richiesta fionda, è possibile ottenere un string of all the selectors con:

String selectors = slingRequest.getRequestPathInfo().getSelectorString(); 
+0

e si può usare 'getSelectors()' in alternativa per ottenere un 'String []' dei selettori (si potrebbe voler solo mantenere i selettori che si aspettano piuttosto che quelli che ci sono). – anotherdave

+0

Sfortunatamente, ottenere il problema con la slingRequest sembra essere il problema. Questo è in Link Riscrivere Transformer, quindi sembra un po 'più in basso nella tana del coniglio, a meno che non mi manchi qualcosa. In un'altra nota, sembra che i selettori * debbano * essere effettivamente mantenuti automaticamente con un dispositivo mobile, tuttavia, dobbiamo avere un'impostazione configurata male o qualcosa del genere. Pubblicherò quando ne saprò di più. –

1

Sembra che tu stia utilizzando la pipeline di riscrittura. Hai preso in considerazione quanto segue:

public class YourTransformer implements Transformer { 
    protected SlingHttpServletRequest request; 
    String selectors = ""; 

    public void init(ProcessingContext context, ProcessingComponentConfiguration config) throws java.io.IOException { { 
     request = context.getRequest(); 
     String[] _selectors = request.getRequestPathInfo().getSelectors(); 
     StringBuilder buff = new StringBuilder(); 
     for (String _selector : _selectors) { 
      buff.append(".").append(_selector); 
     } 
     selectors = buff.toString(); 
    } 

    // rest of the methods go here 
} 

ora quando riscrivi i collegamenti, hai la stringa di selezione pronta per andare.

+0

Hey Kaiser, questa è un'ottima soluzione. Certamente userò questo approccio per una soluzione non cookie. La risposta precedente che suggerisce la riscrittura dell'apache è la soluzione con cui stiamo andando, ma grazie mille per aver risposto. Solo ottenere il contesto nel trasformatore risolverà un altro problema che ho avuto. –

+0

@BayaniPortier felice di poter aiutare :) una cosa triste che ho scoperto è che il servizio htmlgenerator in cq era super buggy. nei rendering a pagina intera, veniva generata solo una frazione di eventi html (ad esempio, veniva chiamato "body" con tutto il suo contenuto inviato al metodo characters()). quindi, non aspettarti eventi per ogni tag - assicurati di riscrivere tutto il contenuto in caratteri() –