2014-06-23 3 views
2

Я занимаюсь разработкой приложения 2.1.0 (Java), которое должно иметь две разные версии: настольное веб-приложение и мобильное веб-приложение. Я ищу способ, который не изменяет логику контроллеров, но полагается на маршрутизацию. Идеальное поведение должно быть:Play Framework 2 - Различные виды для разных устройств

  • Маршруты одинаковы для настольных и мобильных
  • Контроллеры одинаковы для настольных и мобильных
  • Просмотров различны для мобильного и рабочего стола, но совместно именовании.

Есть ли где я могу Подвод с поведением маршрутизации и, скажем, добавьте .mob к имени вида так тонированное мнение main.scala.html для рабочего стола и main.scala.mob.html для мобильных устройств? Это было бы идеально, поскольку контроллеры не нуждаются в каких-либо изменениях (или уродливых, если), и у каждого представления должна быть своя мобильная версия. Наверное, мне понадобится запрос в этот момент, чтобы выполнить обнаружение устройства. Даже более прохладный, если бы он мог отступить к просмотру рабочего стола, если мобильный просмотр не был реализован для определенного действия.

Любые идеи?

Спасибо, Гонсало

ответ

0

Я закончил тем, что составлял действия, которые нуждались в мобильной версии с другим действием. Для этого я создал аннотацию времени выполнения @Mobile, которую я использовал для аннотации этих действий с именем мобильного вида. Все аннотированные действия будут составлены с помощью следующего MobileAction, который выполняет обнаружение устройства:

public class MobileAction extends Action<Mobile> { 
    public MobileAction() { 
    } 

    public MobileAction(Mobile configuration, Action<?> delegate) { 
     this.configuration = configuration; 
     this.delegate = delegate; 
    } 

    @Override 
    public Result call(Http.Context ctx) throws Throwable { 
     final Http.Request request = ctx.request(); 
     final String userAgent = request.getHeader("User-Agent"); 

     // See https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent 
     if (userAgent.contains("Mobi")) { 
      ctx.args.put("viewName", configuration.value()); 
     } 

     return delegate.call(ctx); 
    } 
} 

Я реализовал DynamicRendered класс, который выглядит для viewName аргумента (в случае необходимости, впрыскиваемого @Mobile) и использует отражение, чтобы сделать соответствующий вид.

public class DynamicRenderer { 

    public static Html render(String viewName, Object... args) { 
     final Map<String, Object> ctxArgs = Http.Context.current().args; 
     final String view = ctxArgs.containsKey("viewName") ? ((String) ctxArgs.get("viewName")) : viewName; 

     // Get argument classes 
     final Class[] argClasses = new Class[args.length]; 
     for (int i=0; i<args.length; i++) { 
      argClasses[i] = args[i].getClass(); 
     } 

     try { 
      // Get view render method and invoke 
      final Class<?> clazz = Class.forName(view); 
      final Method render = clazz.getDeclaredMethod("render", argClasses); 
      final Html html = ((Html) render.invoke(null, args)); 

      return html; 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Затем, вместо вызова ok(viewName.render(...)) в контроллере, я называю ok(DynamicRenderer.render("viewName", ...))

0

Похоже, что вам нужно использовать CSS + библиотеки JS стайлинга, таких как Фонд 5 или Bootstrap. Это может позволить вам указать, как ваше представление должно отображаться в разных размерах экрана, используя теги css в сгенерированном html. Документы Lookup Foundation, они объясняют, как это сделать.

+0

Спасибо, но мнения будут совершенно разные. Поэтому решения CSS + JS недостаточно. – monsieurBelbo

+0

До вас ... только Фонд FYI имеет возможность динамически скрывать/отображать определенные части вашего пользовательского интерфейса на основе экранов ... если вы хотите пойти с рендерингом всего в HTML, а затем отображать только то, что нужно. Взгляните сюда, если у вас есть 5 запасных минут: http://foundation.zurb.com/docs/components/visibility.html –

+0

Я проголосовал за это. Сегодня у меня была такая же задача, чтобы мои взгляды выглядели нормально на экранах рабочего стола, планшета и мобильного телефона. Я решил проблему с помощью Bootstrap 3.3.6 и ее отзывчивых утилит. Не знаю, почему этот ответ был подавлен кем-то, но на самом деле совет был хорош в 2014 году и еще лучше в 2016 году, когда Boostrap разработал свою отзывчивую оснастку. –

Смежные вопросы