2016-02-29 3 views
0

Используйте случай: У меня есть маршрут обработки всех запросов на хост: порт/р маршрут выглядит следующим образом:Play Framework/Twirl Динамически включают шаблоны

GET  /p/*path controllers.Application.p(path: String) 

Метод p получает некоторые данные и передает это право до представления p:

return ok(p.render(currentSession)); 

в представлении я хочу импортировать шаблон, если существует один, который соответствует строке в моих передаваемых данных. В этом случае String представляет собой имя объекта модели, например «Пользователь», и если есть соответствующий шаблон, он будет views/custompages/User.scala.html. Если нет соответствующего шаблона, я бы хотел использовать общий, например views/generic.scala.html.

У меня есть 2 части на вопрос:

Часть 1: Я вижу, что я могу проверить для существования шаблона просто выполнив следующие действия:

@if(custompages.User != null) { 
    <p>it exists!</p> 
} 

но если я изменить его custompages.Usera (не существующий шаблон) Я получаю ошибку компиляции (object Usera is not a member of package). Как это сделать?

Часть 2: Как я могу выполнить проверку, используя строку, которую я представляю для класса модели? конкатенировать его в месте жестко закодированного «Пользователь» в ответе на часть 1?

Я иду об этом неправильно? Является ли то, что я делаю, должно быть обработано в контроллере, используя отражение, чтобы найти соответствующий шаблон, а затем отобразить соответствующий?

+1

Я всегда стоять контроллер путь, причина проста: виды (как шаблоны дизайна) являются своим родом работы графических дизайнеров (в основном) и должны быть минимальная логика включена в него, особенно то, что может привести к сбою стр. – biesior

ответ

1

Я решил решить проблему с контроллера вместо представления. Это код, который я использовал для этого, в случае, если кто-то еще окажется здесь, ища аналогичный ответ.

нота: associatedEntity является, как я определить, какой шаблон для визуализации Я вызывающий класса визуализации и передавая свой собственный объект сессии в качестве параметра я использовал следующее, чтобы помочь создать ответ: Play framework 2.1.3 function that will render scala template with given parameters

благодарственных вы @biesior за предложение!

public Result p(String uri) { 

    Session currentSession = getSession(); 

    final Class<?> clazz; 
    try { 
     clazz = Class.forName("com.domain.views.html." + currentSession.currentPage.associatedEntity.getSimpleName()); 

     //assumed you have a String parameter for your template 
     java.lang.reflect.Method render = null; 
     try { 
      render = clazz.getDeclaredMethod("render", Session.class); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } 
     play.twirl.api.Html html = null; 
     try { 
      html = (play.twirl.api.Html) render.invoke(null, currentSession); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } 
     return ok(html); 
    } catch (ClassNotFoundException e) { 
     return ok(p.render(currentSession)); 
    } 

}