Share : Redirection après login

cancel
Showing results for 
Search instead for 
Did you mean: 
zomurn
Member II

Share : Redirection après login

Bonjour,

Je souhaiterais savoir comment faire une chose "simple" … a priori…car je galère beaucoup à le faire avec Share.
Je voudrais que quand un user se log, selon son groupe d'appartenance, je le redirige vers l'espace "documentlibrary" du site auquel il est rattaché.
J'ai déjà mis une plombe à trouver que la page d'accueil visuelle (le dashboard) est stocké en dur dans le AVM/sitestore (j'essayais d'overrider le code tant que je pouvais, et rien ne changeait).
Les pages d'affichage stockées en dur dans le repository, ça change de mes JSP  :shock: .
Bref, je suis arrivé à affiché le contenu de ma page .ftl (un template instance) en affichant une chaine de caractère par ex.
Le problème est que je veux faire plus. Je souhaite appelé un webscript a partir de "template instance" (page .ftl) que j'ai moi même développé (j'ai fait les .get.js, .get.html.ftl, , .desc.xml, etc.)
Je pense que le webscript (simple) que j'ai codé marche (c'est du code isolé). Je cherche donc à appeler ce webscript à partir de ma page .ftl.
Ce webscript fait une redirection dynamique de l'utilisateur après son login dans l'espace "documentlibrary" du siteA s'il appartient au siteA (je le lis dans les groupes d'appartenance de ce user).
Tout ceci dans le but toujours "idiot proof" car 90% des utilisateurs utilisant Alfresco ne sont pas informaticiens. Mon objectif est donc le minimum d'information dans l'interface, le minimum de clique pour atteindre l'information qu'ils consultent 99% du temps (l'espace documentlibrary).

Merci beaucoup pour vos conseil , je galère pas mal dessus  :cry:
8 Replies
bertrandf
Active Member

Re: Share : Redirection après login

Bonjour,

A première vue, je dirais qu'il faudrait que vous redirigiez votre utilisateur après connexion sur une page que vous allez créer, cette page aura pour but de vérifier l'appartenance de votre utilisateur à tel ou tel groupe puis de rediriger ce dernier vers l'adresse souhaitée.

Je pense qu'il faut que vous créiez une page (d'un point de vue Share), vous "reliez" cette page à un template (toujours d'un point de vu Share), ce dernier étant associé à un script JS (qui fera appel à vos webscripts situés coté entrepôt pour connaitre l'appartenance à un site de l'utilisateur).

En gros, quand on arrive dans share, c'est la page index.jsp qui est appelée, cette page n'a que pour but que de rediriger l'utilisateur vers la page page/site-index (qui est reliée au fichier site-index.jsp).
La page site-index se charge de "générer" le tableau de bord utilisateur du user.
Je pense donc qu'il faudrait que vous fassiez votre redirection vers votre page perso à cet endroit, à la place de :
response.sendRedirect(request.getContextPath() + "/page/user/" + URLEncoder.encode(userid) + "/dashboard");
en gros vous auriez :
response.sendRedirect(request.getContextPath() + "/page/mapage");

Ensuite pour créer une page reliée à un template dans Share, c'est plutôt simple.
1. Créez un fichier XML (une page Share) dans le répertoire : /tomcat/webapps/share/WEB-INF/classes/alfresco/site-data/pages/
Appelez la par exemple : mapage.xml
<?xml version='1.0' encoding='UTF-8'?>
<page>
   <title>mapage</title>
   <title-id>page.mapage.title</title-id>
   <description>mapage</description>
   <description-id>page.mapage.description</description-id>
   <template-instance>mapage</template-instance>
   <authentication>user</authentication>
</page>


2. Créez un fichier XML dans le répertoire : /tomcat/webapps/share/WEB-INF/classes/alfresco/site-data/template-instances/
Appelez le par exemple : mapage.xml (en concordance avec le champ template-instance de la page)
<?xml version='1.0' encoding='UTF-8'?>
<template-instance>
   <template-type>org/alfresco/montemplate</template-type>
</template-instance>

3. Créez un template dans le répertoire : /tomcat/webapps/share/WEB-INF/classes/alfresco/templates/org/alfresco/
Appelez le par exemple (en concordance avec le nom mis dans le "template-instance") : montemplate.ftl

Créez également un fichier javascript du même nom : montemplate.js


Dans ce fichier JavaScript, utilisez l'objet "remote" pour accéder à vos webscripts stockés coté entrepôt.
Exemple :
var connector = remote.connect("alfresco");
result = connector.get("/test/test/" + user.name);

if (result.status == 200) {
  var data = eval('(' + result + ')');
  model.site = data ;
}

Ensuite vous pouvez récupérer le "model" dans le template (fichier ftl) et faire votre redirection qui va bien (en html avec balise meta ou en JS).

C'est une technique, je ne sais pas si c'est la meilleure.


PS: pour que votre page soit fonctionnelle, il faudra redémarrer la webapp. (il en sera de même à chaque fois que vous voudrez modifier votre template … il n'y a pas de mécanisme de rafraichissement des templates, seulement des webscripts).
zomurn
Member II

Re: Share : Redirection après login

Bonjour,

Tout d'abord merci beaucoup pour cette réponse détaillée. Je m'y penche dessus depuis hier pour essayer de parvenir à mon but. Et bien sûr j'ai quelques petits soucis qui restent.
Alors j'ai fait les choses comme vous dîtes à ceci près que le webscript est dans l'application share et pas dans le repository…je ne pense pas que ça change grand chose. D'autant plus que mon webscript est correctement reconnu à l'adresse http://localhost:8080/share/service/index (il est bien listé). Je l'ai mis dans le dossier alfresco/site-webscripts/org/alfresco/components/customlogin
A l'interieur de ce dossier on retrouve donc tous les fichiers "webscript" .desc.xml, .get.js, .get.html.ftl, etc.
Ensuite dans alfresco/templates/xxx j'ai mis mon fichier custom-login.ftl (votre fichier montemplate.ftl) et custom-login.js (votre fichier montemplate.js).
Dans le fichier custom-login.js il y a :

<script language="javascript" type="text/javascript">
<!–
window.location.replace(${url.context}/page/site/${sitered.shortName}/documentlibrary);
–>
</script>


<p>
Le site de redirection est  ${url.context}/page/site/${sitered.shortName}/documentlibrary
</p>

La ligne paragraphe sert juste de debuggage … même si tout marcherait bien, elle ne devrait même pas s'afficher à cause de la redirection faite en JS. Mais cette dernière ne marche pas, et même ce .ftl ne marche pas. J'ai l'erreur très claire :

Caused by: org.springframework.extensions.webscripts.WebScriptException: 07310000 Failed to process template fr/intuitiv/module/fds/custom-login.ftl
   at org.springframework.extensions.webscripts.processor.FTLTemplateProcessor.process(FTLTemplateProcessor.java:160)
   at org.springframework.extensions.webscripts.WebTemplateProcessor.executeBody(WebTemplateProcessor.java:328)
   … 36 more
Caused by: freemarker.core.InvalidReferenceException: Expression sitered.shortName is undefined on line 6, column 52 in fr/intuitiv/module/fds/custom-login.ftl.
   at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
   at freemarker.core.Expression.getStringValue(Expression.java:118)
   at freemarker.core.Expression.getStringValue(Expression.java:93)
   at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
   at freemarker.core.Environment.visit(Environment.java:208)
   at freemarker.core.MixedContent.accept(MixedContent.java:92)
   at freemarker.core.Environment.visit(Environment.java:208)
   at freemarker.core.Environment.process(Environment.java:188)
   at freemarker.template.Template.process(Template.java:237)
   at org.springframework.extensions.webscripts.processor.FTLTemplateProcessor.process(FTLTemplateProcessor.java:156)
   … 37 more

Or dans custom-login.js j'ai bien ajouté la variable sitered à mon model :

var result = remote.call("org/alfresco/components/customlogin/custom-login");

  //var data = eval('(' + result + ')');
  model.sitered = result ;

Et pour aller plus loin, je vous montre le contenu de mon webscript (que j'appelle ci-dessus) custom-login.js situé dans org/alfresco/component/customlogin (custom-login.get.js):


function redirectToSite()
{
   var s = new XML(config.script);
   model = null;
   model.maxItems = parseInt(s.maxitems, 10);

   var result, preferences = {};
  
   // Request the current user's preferences
   var result = remote.call("/api/people/" + stringUtils.urlEncode(user.name) + "/sites?size=100");
   model.sites = [];
   if (result.status == 200)
   {
      // Create javascript objects from the server response
      model.sites = eval('(' + result + ')');
   }
   model.numSites = model.sites.length;
   model.sitered = sites[0];
   //status.redirect = true;
   //status.code = 301;
   //status.location = url.context + "/page/user/" + encodeURI(userid) + "/profile";

}

redirectToSite();


On lit bien ci-dessus que model.sitered est de type SiteInfo (à la lecture de ce que retourne la methode listSites du webscript sites.get.js dans SiteServiceImpl.java)
Mon expression ${sitered.shortName} est donc correcte mais sitered n'est pas reconnu , qu'y a -t-il qui manque ? où est mon erreur ?

Merci d'avance.
bertrandf
Active Member

Re: Share : Redirection après login

Bonjour,

Quel type de template utilisez-vous pour mettre en forme votre webscript custom-login.get ? Du JSON je suppose.
Serait-il possible de voir le contenu du fichier custom-login.get.json.ftl ? Car c'est lui qui va déterminer si le sitered.shortName a un sens dans votre template (custom-login.ftl).


Mais je ne comprends pas pourquoi vous voulez utiliser un webscript ? Il y a une raison particulière ?
Vous pourriez faire ce que vous faites dans custom-login.get.js directement dans le script JavaScript relié à votre template non (custom-login.js) ?

Dans votre fichier custom-login.js :
var result = remote.call("/api/people/" + stringUtils.urlEncode(user.name) + "/sites?size=100");
model.sites = [];

if (result.status == 200) {
  model.sites = eval('(' + result + ')');
  model.numSites = model.sites.length;
  model.sitered = model.sites[0];
}

Dans votre template custom-login.ftl :
<script language="javascript" type="text/javascript">
<!–
window.location.replace(${url.context}/page/site/${sitered.shortName}/documentlibrary);
–>
</script>

PS:
- Faites attention à votre code, vous récupérez le premier élément d'un tableau en javascript sans vérifier au préalable la taille du tableau (cas ou un utilisateur n'appartient à aucun site …)
- De même dans votre template, je serai vous je vérifierai l'existence des variables avant de les utiliser, rajouter des tests du type <#if maVariable??> ou <#if maVariable?exists> : car dans le cas ou vous n'arrivez pas à récupérer le site de l'utilisateur, vous pourrez le rediriger ailleurs (sur son dashboard par exemple).
zomurn
Member II

Re: Share : Redirection après login

Bonjour,

Bien je continue sur vos conseils mais maintenant j'ai une autre erreur : stringUtils n'existe pas. Je crains que cette méthode n'est accessible que dans un webscript. Or le template custom-login.ftl avec son javascript custom-login.js ne sont pas des webscripts.
En fait, je cherchais à faire un webscript pour isolé la logique applicative (celle qui à partir de l'utilisateur connecté, renvoi un site ou 0 qui sera celui auquel il devra être redirigé).
Le template custom-login.ftl se contente que d'une redirection.
Le fichier custom-login.js se contenterai d'appeler le webscript et d'ajouter au model le site retourne (Objet SiteInfo).
Sinon  à part , il n'y a pas necessité absolue que je fasse un webscript, ce n'est que pour isolé mon traitement d'une part puis permettre la ré-utilisabilité…

Donc pour l'instant, soit j'arrive à appeler mon webscript (appel, qui, je pense pose problème) via custom-login.js :

j'ai essaié :
remote.call("org/alfresco/components/customlogin/custom-login");
mais j'ai pas l'impression que ça marche, et puis pourquoi faire un "remote call" alors que le webscript est local à l'application (dans le share.war et pas alfresco.war)…
Suis-je obligé de placer le webscript dans le repository (alfresco.war) ? Comment sont invoqués les webscripts côté share ? (par ex. le tag freemarker <region id="">… appel bien un webscript côté share.

Soit je mets tout dans custom-login.js mais dans ce cas j'ai un problème d'API (stringUtils non trouvé).
bertrandf
Active Member

Re: Share : Redirection après login

Bonjour,

Je vous conseillerai de stocker votre webscript coté entrepôt, ca va dans la logique de Share.
Quasiment tout ce qui est traitement se fait coté repository et les webscripts Share se contentent de mettre en forme des résultats.

Il est sûr que vous ne pourrez pas appeler un webscript qui est stocké dans Share avec l'Objet "remote".

Pour créer votre webscript coté entrepôt, je vous conseille d'utiliser les JavaScript Services API qui vont bien  : http://wiki.alfresco.com/wiki/3.3_JavaScript_Services_API, notamment le siteService.

Inspirez-vous également du webscript que vous appeliez (person.sites.get) :
function main()
{
    // Get the user name of the person to get
    var userName = url.templateArgs.userid;
   
    // Get the person who has that user name
    var person = people.getPerson(userName);
   
    if (person === null) 
    {
        // Return 404 - Not Found     
        status.setCode(status.STATUS_NOT_FOUND, "Person " + userName + " does not exist");
        return;
    }
   
    // Get the list of sites
    var sites = siteService.listUserSites(userName);
   
    var sizeString = args["size"];
    if (sizeString != null)
    {
        var size = parseInt(sizeString);
       
        if (size < sites.length)
        {
            // Only return the first n sites based on the passed page size
            var pagedSites = new Array(size);
            for (var index = 0; index < size; index++)
            {
                pagedSites[index] = sites[index];  
            }
           
            sites = pagedSites;
        }
    }
   
    model.sites = sites;
}

main();
zomurn
Member II

Re: Share : Redirection après login

Bon du nouveau, je pense que j'arrive à bout de ce "cas d'école". Alors j'ai mis mon webscript dans le alfresco.war (dans classes/alfresco/extension/template/…../tous les fichiers du webscript.
Côté serveur, ça marche, avec le webscript debugger, j'arrive bien à lire mes variables. Voici le contenu du webscript custom-login.get.js :

function redirectToSite() {
   var result = null;
   var sites = [];
   var site = null;
   var userName = args["username"];

   // Get the person who has that user name
   var person = people.getPerson(userName);
   result = siteService.listUserSites(userName);
   model.sitered = null;
   if (result.length > 0)
      model.sitered = result[0];
}

redirectToSite();

Et le javascript client côté alfresco share (custom-login.js) :

var connector = remote.connect("alfresco");
var result = connector.get("/fr/intuitiv/module/fds/customlogin/custom-login?username=" + user.name);
  var data = eval('(' + result + ')');
  model.sitered = data ;

Alors dans custom-login.get.js côté serveur donc, au debuggeur, la variable result[0] est bien renseigné car lorsque je fais un "watch" de result[0].shortName , ça affiche bien le nom de mon (unique) site. Donc pas de problème sur mon webscript. Pour le custom-login.get.json.ftl il y a :

<#import "/org/alfresco/repository/site/site.lib.ftl" as siteLib/>

[
      <@siteLib.siteJSON site=sitered/>
]

Je me suis inspire de person.sites.get.json.ftl bien sûr. La convention webscript (mini 3 fichiers : .desc.xml (descripteur REST), .get.js (controleur) si du get et le .ftl (vue)) permet donc de formatter la réponse en JSON (javascript objet) côté serveur. Le javascript côté client reçoit bien ce flux javascript et fait un eval dessus. Puis custom-login.js est sensé mettre le site (data) dans le model avec la variable sitered….tout comme dashboard.js qui se contente de surcharger le model. (fichier que je cherche à substituer par le mien).
Cependant dans le ftl, custom-login.ftl, j'ai une erreur… il contient :




<script language="javascript" type="text/javascript">
<!–
window.location.replace(${url.context}/page/site/${sitered.shortName}/documentlibrary);
–>
</script>


<p>
Le site de redirection est  ${url.context}/page/site/${sitered.shortName}/documentlibrary
</p>

Et ça plante sur l'évaluation de ${sitered.shortName}, pourquoi ?

L'erreur est :

18:43:18,113  ERROR [freemarker.runtime]

Expected hash. sitered evaluated instead to freemarker.template.SimpleSequence on line 6, column 52 in org/alfresco/custom-login.ftl.
The problematic instruction:
———-
==> ${sitered.shortName} [on line 6, column 50 in org/alfresco/custom-login.ftl]
———-

Java backtrace for programmers:
———-
freemarker.template.TemplateException: Expected hash. sitered evaluated instead to freemarker.template.SimpleSequence on line 6, column 52 in org/alfresco/custom-login.ftl.
   at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:135)
   at freemarker.core.Dot._getAsTemplateModel(Dot.java:78)
   at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
   at freemarker.core.Expression.getStringValue(Expression.java:93)
   at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
   at freemarker.core.Environment.visit(Environment.java:208)
   at freemarker.core.MixedContent.accept(MixedContent.java:92)
   at freemarker.core.Environment.visit(Environment.java:208)
   at freemarker.core.Environment.process(Environment.java:188)
   at freemarker.template.Template.process(Template.java:237)
   at org.springframework.extensions.webscripts.processor.FTLTemplateProcessor.process(FTLTemplateProcessor.java:156)
   at org.springframework.extensions.webscripts.WebTemplateProcessor.executeBody(WebTemplateProcessor.java:328)
   at org.springframework.extensions.surf.render.AbstractProcessor.execute(AbstractProcessor.java:79)
   at org.springframework.extensions.surf.render.RenderService.processTemplate(RenderService.java:582)
   at org.springframework.extensions.surf.render.bean.TemplateInstanceRenderer.calculateComponentDependencies(TemplateInstanceRenderer.java:68)
   at org.springframework.extensions.surf.render.bean.TemplateInstanceRenderer.body(TemplateInstanceRenderer.java:116)
   at org.springframework.extensions.surf.render.AbstractRenderer.render(AbstractRenderer.java:131)
   at org.springframework.extensions.surf.render.bean.PageRenderer.body(PageRenderer.java:70)
   at org.springframework.extensions.surf.render.AbstractRenderer.render(AbstractRenderer.java:131)
   at org.springframework.extensions.surf.render.RenderService.startPageRenderer(RenderService.java:664)
   at org.springframework.extensions.surf.render.RenderService.renderPage(RenderService.java:641)
   at org.springframework.extensions.surf.render.PresentationUtil.renderPage(PresentationUtil.java:95)
   at org.springframework.extensions.surf.mvc.PageView.dispatchPage(PageView.java:349)
   at org.springframework.extensions.surf.mvc.PageView.renderView(PageView.java:290)
   at org.springframework.extensions.surf.mvc.AbstractWebFrameworkView.renderMergedOutputModel(AbstractWebFrameworkView.java:136)
   at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
   at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
   at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.alfresco.web.site.servlet.MTAuthenticationFilter.doFilter(MTAuthenticationFilter.java:67)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
   at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
   at java.lang.Thread.run(Thread.java:619)
18:43:18,114  ERROR [surf.render.RenderService] Unable to process template: custom-login
18:43:18,114  ERROR [extensions.surf.FrameworkUtil] An exception occurred while rendering a page: user/newuser/dashboard
18:43:18,115  ERROR [extensions.surf.FrameworkUtil] org.springframework.extensions.surf.exception.RendererExecutionException: WebTemplateProcessor failed to process template uri: org/alfresco/custom-login
   at org.springframework.extensions.webscripts.WebTemplateProcessor.executeBody(WebTemplateProcessor.java:360)
   at org.springframework.extensions.surf.render.AbstractProcessor.execute(AbstractProcessor.java:79)
   at org.springframework.extensions.surf.render.RenderService.processTemplate(RenderService.java:582)
   at org.springframework.extensions.surf.render.bean.TemplateInstanceRenderer.calculateComponentDependencies(TemplateInstanceRenderer.java:68)
   at org.springframework.extensions.surf.render.bean.TemplateInstanceRenderer.body(TemplateInstanceRenderer.java:116)
   at org.springframework.extensions.surf.render.AbstractRenderer.render(AbstractRenderer.java:131)
   at org.springframework.extensions.surf.render.bean.PageRenderer.body(PageRenderer.java:70)
   at org.springframework.extensions.surf.render.AbstractRenderer.render(AbstractRenderer.java:131)
   at org.springframework.extensions.surf.render.RenderService.startPageRenderer(RenderService.java:664)
   at org.springframework.extensions.surf.render.RenderService.renderPage(RenderService.java:641)
   at org.springframework.extensions.surf.render.PresentationUtil.renderPage(PresentationUtil.java:95)
   at org.springframework.extensions.surf.mvc.PageView.dispatchPage(PageView.java:349)
   at org.springframework.extensions.surf.mvc.PageView.renderView(PageView.java:290)
   at org.springframework.extensions.surf.mvc.AbstractWebFrameworkView.renderMergedOutputModel(AbstractWebFrameworkView.java:136)
   at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
   at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
   at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.alfresco.web.site.servlet.MTAuthenticationFilter.doFilter(MTAuthenticationFilter.java:67)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
   at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
   at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
   at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
   at java.lang.Thread.run(Thread.java:619)
Caused by: org.springframework.extensions.webscripts.WebScriptException: 07310001 Failed to process template org/alfresco/custom-login.ftl
   at org.springframework.extensions.webscripts.processor.FTLTemplateProcessor.process(FTLTemplateProcessor.java:160)
   at org.springframework.extensions.webscripts.WebTemplateProcessor.executeBody(WebTemplateProcessor.java:328)
   … 36 more
Caused by: freemarker.template.TemplateException: Expected hash. sitered evaluated instead to freemarker.template.SimpleSequence on line 6, column 52 in org/alfresco/custom-login.ftl.
   at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:135)
   at freemarker.core.Dot._getAsTemplateModel(Dot.java:78)
   at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
   at freemarker.core.Expression.getStringValue(Expression.java:93)
   at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
   at freemarker.core.Environment.visit(Environment.java:208)
   at freemarker.core.MixedContent.accept(MixedContent.java:92)
   at freemarker.core.Environment.visit(Environment.java:208)
   at freemarker.core.Environment.process(Environment.java:188)
   at freemarker.template.Template.process(Template.java:237)
   at org.springframework.extensions.webscripts.processor.FTLTemplateProcessor.process(FTLTemplateProcessor.java:156)
   … 37 more


Tout ceci est du chinois….je pense qu'en clair qu'il veut dire "Je ne comprend pas ton charabia ${sitered.shortName}…???

Merci pour votre aide.
bertrandf
Active Member

Re: Share : Redirection après login

Bonjour,

En fait, l'eval que vous faites dans votre fichier JavaScript coté Share se fait sur le JSON renvoyé par votre webscript situé coté entrepôt, on est d'accord ?

En regardant de plus prés la mise en forme du fichier Freemarker de votre webscript, on se rend compte que le JSON renvoyé sera en fait un tableau de un seul objet.
Au lieu de seulement retourner les informations sur le site, vous retournez un tableau de un élément.

En gros, vous avez deux solutions :
1. soit vous enlevez les crochets dans le template de votre webscript, ils sont inutiles car vous allez renvoyer des informations sur un seul site.
<#import "/org/alfresco/repository/site/site.lib.ftl" as siteLib/>

<@siteLib.siteJSON site=sitered/>
2. soit vous laissez les crochets (si éventuellement vous voulez retourner plusieurs sites) mais il faut alors modifier votre fichier JavaScript relié à votre template coté Share pour qu'il récupère le premier élément du tableau :
var data = eval('(' + result + ')');
model.sitered = data[0];

A noter également qu'il me semble que vous avez oublié des guillemets dans votre template coté Share pour la chaine de redirection :
window.location.replace("${url.context}/page/site/${sitered.shortName}/documentlibrary");

Cordialement.
zomurn
Member II

Re: Share : Redirection après login

Bingo !

Bien vu le coup du tableau, le pire c'est que je le savais mais ce message d'erreur ne m'y a pas du tout fait penser…
Bon maintenant ça marche nickel avec la redirection !

Votre soutien vaut très facilement 1 point supplémentaire !  Smiley Very Happy

Merci beaucoup !