Thanks for the feedback. 

Maybe _I_ am missing something obvious, but I'm not dealing with a regular cms 
template, but rather a TemplatedMVCHandler template which will be used in the 
AdminCentral (called something like /.magnolia/pages/myAdminPage). Or does what 
you describe also apply to "pages" when configured correctly?

And... no, I don't need the current user. The goal would be to get a custom 
user management page.

-will

On 03.12.2009, at 19:24, Jan Haderka wrote:

> 
> Maybe I'm missing something obvious, but why don't you simply define a
> modelClass for your template (by defining "modelClass" node data in your
> template and setting it's value to point to your model). And make use of
> the fact that Magnolia will instantiate model class and make it
> available for you?
> 
> In the template you then simply call (assuming you make that method
> public)
> ${model.magnoliaUserForUsernameAndManagerName("userName", "admin")}
> 
> and you don't have to do anything with the context, no overriding
> anything, no nothing.
> 
> If your template is of type stk rather then freemarker you might need to
> have your model extend different class. See for example 
> info.magnolia.module.templatingkit.paragraphs.ContentTypeSyndicateModel
> 
> When it comes to getting user object, the ${ctx.user} would be enough if
> what you want is current user.
> 
> HTH,
> Jan
> 
> 
> 
> On Thu, 2009-12-03 at 18:30 +0100, Will Scheidegger wrote:
>> Answering my own question... and boy does this seem complicated to me!
>> So if there is an easier way then described below _please_ let me
>> know.
>> 
>> 
>> The "method class" I came up with to solve the problem:
>> 
>> 
>> public class UserForUsernameMethod implements TemplateMethodModel {
>> 
>> 
>> import freemarker.ext.beans.BeanModel;
>> import freemarker.template.DefaultObjectWrapper;
>> import freemarker.template.TemplateMethodModel;
>> import freemarker.template.TemplateModel;
>> import freemarker.template.TemplateModelException;
>> import info.magnolia.cms.security.SecuritySupport;
>> import info.magnolia.cms.security.User;
>> import info.magnolia.cms.security.UserManager;
>> import java.util.List;
>> 
>> 
>> public class UserForUsernameMethod implements TemplateMethodModel {
>> 
>> 
>>    public TemplateModel exec(List args) throws TemplateModelException
>> {
>>        if (args.size() < 1) {
>>            throw new TemplateModelException("Wrong arguments");
>>        } else {
>>            String userManagerName = "admin";
>>            String userName = (String) args.get(0);
>>            if (args.size() > 1) {
>>                userManagerName = (String) args.get(1);
>>            }
>>            User user =
>> magnoliaUserForUsernameAndManagerName(userName, userManagerName);
>>            if (user != null) {
>>                return new BeanModel(user,
>> DefaultObjectWrapper.getDefaultInstance());
>>            } else {
>>                return TemplateModel.NOTHING;
>>            }
>>        }
>>    }
>> 
>> 
>>    private User magnoliaUserForUsernameAndManagerName(String
>> userName, String userManagerName) {
>>        UserManager userManager =
>> SecuritySupport.Factory.getInstance().getUserManager(userManagerName);
>>        return userManager.getUser(userName);
>>    }
>> }
>> 
>> 
>> And to add the method to the model in the template class
>> extending TemplatedMVCHandler I had to overwrite the renderHtml()
>> method and add the method there:
>> 
>> 
>>    @Override
>>        public void renderHtml(String view) throws IOException {
>>        // no rendering if view is null
>>        if(StringUtils.isEmpty(view)){
>>            return;
>>        }
>> 
>> 
>>        String template = this.getTemplateName(view);
>>        if (template != null) {
>> 
>> 
>>            Map data = new HashMap();
>>            data.put("this", this);
>>            data.put("view", view);
>>            data.put("userForUsername", new UserForUsernameMethod());
>> 
>> 
>>            PrintWriter writer;
>> 
>> 
>>            try {
>>                writer = getResponse().getWriter();
>>            }
>>            catch (IllegalStateException e) {
>>                // getResponse().getOutputStream() has already been
>> called
>>                writer = new
>> PrintWriter(getResponse().getOutputStream());
>>            }
>>            FreemarkerUtil.process(template, data, writer);
>>        }
>>    }
>> 
>> 
>> Afterwards, I was able to access the user data in my template:
>> test: ${userForUsername("test").password}
>> 
>> 
>> Quite a bit of work! At the moment, even custom JSP tags seem easier
>> to me. But maybe after getting used to this...
>> 
>> 
>> -will
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> 
>> On 03.12.2009, at 17:45, Will Scheidegger wrote:
>> 
>>> Dear Magnolians
>>> 
>>> Can someone give me a quick primer on how to call java methods from
>>> a Freemarker template? From looking at the documentation one does
>>> not seem to be able to simply call a method in an object. It looks
>>> like the methods need to be implemented as subclass of
>>> "TemplateMethodModel" (see [1]). This seems quite complicated, but I
>>> guess I could do that. But then, where is this method added to the
>>> data model (i.e. "root.put("methodName", new MethodClass())?
>>> 
>>> To be more specific: I would like to access the user info in a
>>> Freemarker template, where I only have the username. So I would need
>>> a method which would return the user (object? "data-model"? hash?)
>>> when passing in the username. I am using the TemplatedMVCHandler
>>> class to display the template. The template displays fine. But now
>>> I'm a bit stuck with adding the method...
>>> 
>>> Thanks for the insight!
>>> -will
>>> 
>>> 
>>> [1] http://freemarker.sourceforge.net/docs/pgui_datamodel_method.html
>>> 
>>> 
>>> ____________________________________________________________________
>>> ----------------------------------------------------------------
>>> For list details see
>>> http://www.magnolia-cms.com/home/community/mailing-lists.html
>>> To unsubscribe, E-mail to: <[email protected]>
>>> ----------------------------------------------------------------
>>> 
>> 
>> 
>> 
>> 
>> 
>> ______________________________________________________________________
>> ----------------------------------------------------------------
>> For list details see
>> http://www.magnolia-cms.com/home/community/mailing-lists.html
>> To unsubscribe, E-mail to: <[email protected]>
>> ----------------------------------------------------------------
> 
> 
> ----------------------------------------------------------------
> For list details see
> http://www.magnolia-cms.com/home/community/mailing-lists.html
> To unsubscribe, E-mail to: <[email protected]>
> ----------------------------------------------------------------
> 


----------------------------------------------------------------
For list details see
http://www.magnolia-cms.com/home/community/mailing-lists.html
To unsubscribe, E-mail to: <[email protected]>
----------------------------------------------------------------

Reply via email to