在 Magnolia 中使用模型

Posted

技术标签:

【中文标题】在 Magnolia 中使用模型【英文标题】:Using models in magnolia 【发布时间】:2016-07-14 12:59:35 【问题描述】:

假设我有如下控制器:

@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));
    

我希望能够将 MetaModel 与 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 bean,在 @Configuration 类中的某处:

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

只需在您的 Spring 控制器中自动装配 bean 并将新的构造函数添加到 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));
    

【讨论】:

以上是关于在 Magnolia 中使用模型的主要内容,如果未能解决你的问题,请参考以下文章

使用 Magnolia CMS 创建自定义类型的内容?

如何在 Magnolia 应用程序中使用 FreeMarker 模板?

在 Magnolia 中使用 MultiValueFieldDefinition 时限制子项的数量

版本控制文件错误,在 java 中使用 Magnolia 与 apache 化学和标准 CMIS

在 Magnolia 4.5.3 中使用 cusom ftl 文件继承阶段

Magnolia 版本中的隐藏操作是 5.7