2016-07-14 3 views
1

Если предположить, что у меня есть контроллер, такие как следующие:Использования моделей в магнолии

@Controller 
@Template(id= HomePageTemplate.ID, title = "Home Page") 
public class HomePageTemplate { 

    public static final String ID = "project:pages/home-page"; 

    @RequestMapping("/home-page") 
    public String render(Model model, Node node) { 

     model.addAttribute("meta", new MetaModel(node)); 
    } 
} 

И я хочу, чтобы иметь возможность использовать метамодель в сочетании с TemplatingFunctions и другими предметами Magnolia - но я не уверен, как получить доступ к карте содержимого изнутри этой модели:

public class AbstractModel { 

    protected Node node; 

    protected TemplatingFunctions tf; 

    public AbstractModel(Node node, @Inject TemplatingFunctions tf) { 
     this.node = node; 
     this.tf = tf; 
    } 

    public function getTitle() { 
     return tf.get("metaTitle"); 
    } 
} 

Любые мысли о том, как получить шаблонные функции для инъекций?

ответ

1

Вместо того чтобы делать new MetaModel(node) используйте

info.magnolia.objectfactory.Components.newInstance(MetaModel.class, node) 

для того, чтобы создать новый экземпляр модели. TemplatingFunctions будет автоматически вводиться.

Другим вариантом было бы выставить TemplatingFunctions как Spring бина, где-то в @Configuration классе:

@Bean 
public TemplatingFunctions templatingFunctions() { 
    return Components.getComponent(TemplatingFunctions.class); 
} 

и просто autowire боб в контроллерах Spring и добавить новый конструктор MetaModel класса:

@Controller 
@Template(id= HomePageTemplate.ID, title = "Home Page") 
public class HomePageTemplate { 

    @Autowired 
    private TemplatingFunctions cmsfn; 

    public String render(Model model, Node node) { 
     model.addAttribute("meta", new MetaModel(node, cmsfn)); 
    } 
}