Liferay 模板文件的解析

大家都知道Liferay的内核框架由一组Velocity模板文件组成的,它们位于$LIFERAY_HOME\liferay-portal-6.1.0-ce-ga1\tomcat-7.0.23\webapps\ROOT\html\themes\classic\templates目录下,今天有同事问我,这些模板中的变量在哪里定义的。

为了解决这个问题,我们找到了portal-impl.jar中的VelocityVariableImpl 类文件,于是一目了然。因为 portal-normal.vm中的第一行会解析其他文件,被解析的文件在变量init中,如下:

<!DOCTYPE html> 

#parse ($init) 

<html class="#language("lang.dir")" dir="#language("lang.dir")" lang="$w3c_language_id"> 

<head>
    <title>$the_title - $company_name</title> 

    $theme.include($top_head_include)
</head>
...

见03行,而被解析的这个文件,就定义了绝大多数模板中用到的变量,那么这个文件在哪里呢?我们可以参见VelocityVariableImpl中的定义:

velocityContext.put(
    "init",
    themeDisplay.getPathContext() +
    "_SERVLET_CONTEXT_" +
    "/html/themes/_unstyled/templates/init.vm"); 

  velocityContext.put(
    "portletGroupId", new Long(themeDisplay.getScopeGroupId()));
} 

Theme theme = (Theme)request.getAttribute("THEME");

所以,被parse的init变量 代表的文件是在 ROOT 应用下的/html/themes/_unstyled/templates/init.vm,我们打开看下,果然这里面都是变量定义:

因为这个文件很长,所以这里略去

## ---------- Common variables ---------- ## 

#set ($theme_display = $themeDisplay)
#set ($portlet_display = $portletDisplay) 

#set ($theme_timestamp = $themeDisplay.getTheme().getTimestamp())
#set ($theme_settings = $themeDisplay.getThemeSettings()) 

...

结论:

在Liferay框架中的模板文件中的变量,大多数是在init.vm中定义的,少量是直接定义在VelocityVariableImpl类中的

实战:

比如,同事问我,在portal-normal.vm的第47-53行中的 $content_include变量定义在哪里:

#if ($selectable)
    $theme.include($content_include)
#else
    $portletDisplay.recycle() 

    $portletDisplay.setTitle($the_title) 

    $theme.wrapPortlet("portlet.vm", $content_include)
#end

我们在init.vm中进行查找,不难发现这个变量定义为:

#set ($bottom_include = "$dir_include/common/themes/bottom.jsp")
#set ($bottom_ext_include = $bottom_include)
#set ($content_include = "$dir_include$tilesContent")
#set ($top_head_include = "$dir_include/common/themes/top_head.jsp")
#set ($top_messages_include = "$dir_include/common/themes/top_messages.jsp")

是 $dir_include$tilesContent,所以我们还需要递归的继续解析下去:

我们在init.vm中继续查找,不难找到$dir_include的变量定义:

#if ($is_portlet_page && $theme_display.isWapTheme())
                #set ($dir_include = "/wap")
#else
                #set ($dir_include = "/html")
#end

所以,因为我们的官方默认例子不是被wap的,所以$dir_include为/html

接下来我们找$tilesContent的定义。很可惜,它没有被定义在init.vm中,所以我们回到VelocityVariableImpl类中,再这里,我们找到了定义:

String tilesContent = (String)componentContext.getAttribute("content"); 

themeDisplay.setTilesContent(tilesContent); 

velocityContext.put("tilesContent", tilesContent);

所以,$tilesContent 是一个程序运行期间动态传递过来的变量:

综上所述:同事问我的portal-normal.vm文件中$content_include的变量的值,是在程序运行中动态解析的,默认情况下,它是 “/html” 与程序运行时候动态获取content属性值,然后这2个值拼接起来得到的值。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 变量
, include
, init
, set
themes
liferay修改现有模板、liferay 模板、liferay 解析excel、liferay 文件下载、liferay 文件上传,以便于您获取更多的相关知识。

时间: 2024-11-02 23:43:29

Liferay 模板文件的解析的相关文章

dedecms 模板文件不存在,无法解析文档!

dedecms 模板文件不存在,无法解析文档! 今天在用dede v5.6是出现问题,在生成软件详情页面时出现了模板文件不存在,无法解析文档的问题,但我的模板文件确实是存在的,下面我们来看我的解决方法. 找到 include/arc.archives.class.php教程文件,开打,找到520行,代码如下 $tempfile = $this->gettempletfile();    if(!file_exists($tempfile) || !is_file($tempfile))    {

dedecms 模板文件不存在,无法解析文档 解决方法

一.首先打开:/incluede/arc.archives.class.php 查找 "模板文件不存在,无法解析文档" 这行字,然后把整行修改为 echo "模板文件不存在,无法解析文档!" .$this->ArcID; 保存,然后依次生成html,如果系统还是提示 "模板文件不存在,无法解析文档",后面还会有出错的文章ID,只要找到相应的文章删除就可以啦 第二.如果上面方法还是不行,提示 "模板文件不存在,无法解析文档"

DEDECMS织梦系统生成静态页面提示“模板文件不存在,无法解析文档”

我自己的解决办法很简单,是因为我模板文件搞错了,所以就生成不了了. 网上收集的解决办法 如果是生成文档页面出现这个错误提示,打开arc.archives.class.php这个文件,找到第484行. 修改一下报错的代码: echo "模板文件不存在,无法解析文档!"; 修改成: echo "模板文件不存在,无法解析文档!" .$this->ArcID; 这样可以返回第一个错误的文章的ID,于是,再生成时我得到了这个文章ID,打开这个文章编辑,发现这篇文章居然没

DEDE 提示:模板文件不存在,无法解析文档解决方法

增加专题是提示模板不存在 DEDE所有的栏目使用".HTM"格式的模板,但有些栏目好像都可以 (一)对于"封面页"和"列表页"使用".HTML"格式的模板是可以的; (二)对于"文档页"使用".HTML"格式是不行的,需要使用".HTM"或者其他格式(其他格式在下还没有测试过). 认真思考了下: 1.模板文件是肯定存在的; 2.路径是对的; 3.其他的"列表

PHP Smarty无法解析模板文件

/****************************************************************************** * PHP Smarty无法解析模板文件 * 说明: * 修改为使用Smarty来做模板解析遇到无法解析文件的问题,通过查看Apache服务器 * 日志的方式解决. * * 2017-3-12 深圳 南山平山村 曾剑锋 ************************************************************

PHPLIB模板入门教程-解析文件实例

嵌套的模板 parse()函数的一个灵巧的特性是它创建的MyOutput句柄是一个真正的模板变量,就象some_color 是一 个模板变量.所以如果你有另一个模板,它有一个{MyOutput}标签,当你分析第二个模板时,所有的 {MyOutput}标记将被替换为MyOutput中的分析后的文本.这个特性允许你将一个模板文件嵌入到另一个模板 中.所以,我们可能有另一个名为wholePage.ihtml的模板,内容如下:   对不起,你没赢.但是如果你赢了,我们将对你说: {MyOutput} 并

dedecms主要模板文件与功能说明

DedeCMS系统的模板是非固定的,用户可以在新建栏目时可以自行选择栏目模板,官方仅提供最基本的默认模板,即是内置系统模型的各个模板,由于DedeCMS支持自定义频道模型,用户自定义新频道模型后,还需要按该模型的字段设计一套新的模板,此外,DedeCMS也支持使用风格的形式使用模板,默认风格是 default,它表示系统默认使用 {cmspath}/templets/default 这个文件夹的模板,如果你下载了一套新的模板,你可以不必要删除 default 原有的文件,把下载的模板文件夹命名你

Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(一)

原文 http://www.cnblogs.com/mayswind/archive/2013/03/17/2962205.html   [题外话] 这是2010年参加比赛时候做的研究,当时为了实现对Word.Excel.PowerPoint文件文字内容的抽取研究了很久,由于Java有 POI库,可以轻松的抽取各种Office文档,而.NET虽然有移植的NPOI,但是只实现了最核心的Excel文件的读写,所以之后查了很多资料才实 现了Word和PowerPoint文件文字的抽取.之后忙于各种事情

tipask问答系统模板文件对照

tipask问答系统模板文件对照 模板目录:tipask\view\default ask.html :提问页面 category.html:分类浏览页面 footer.html :页面底部 getpass.html :找回密码页面 govote.html :进入投票中转页面 header.html :页面头部 help.html :帮助页面,一般不改动 index.html :网站首页 list.html:问题类别页面,从首页点击更多的时候到这个页面 login.html :登录页面 myan