聚合第三方数据到栏目中

    我们可以设置一个虚拟的栏目,此栏目中并不实际发布内容,它的内容是从第三方数据库中取得的。这就面临几个问题:如何构建内容列表,如果显示内容列表。如何打开指定的某个内容。如果对内容进行过滤检索。如何显示单项内容。下面一一详述。

如何构建内容列表

    从第三方获取数据,系统支持两种方式:

  • 从数据库中取数据,显然首先必须指明数据库在哪里,其次需要一个取数据的语句(当前仅支持Select语句和返回结果集的存储过程)。

    注意,定义的语句中最好是只返回列表中所需要数据,出于性能的考虑,不需要在列表中显示的数据好不要取出来 。同时主键数据必须取出来。 ,如下图1示例 :

                        


  • 从URL中获得数据(仅支持返回XML格式的数据)
  •  

    如何显示内容列表

        第三方数据内容是不确定的,那么要显示这个列表,就需要结合栏目的列表样式中的FreeMaker模板来定义显示样式,这样就能灵活地显示任意的数据。如下图示例:

    示例: 模板代码:
    <#setting number_format="#">
    <table border=0 width="100%" cellspacing=0 cellpadding=2>
    <#list newslist as news>
    <tr>
        <td style='border-bottom:1px dotted #00a0f0; ' nowrap>
            ${news_index+1+ (page-1)*countperpage }</td>
        <td style='border-bottom:1px dotted #00a0f0; '>
        <a href="viewnews.jsp?subjectid=${subjectid}&id=${news.primarykey.id}"     target="_blank">
        ${news.showname}&nbsp;&nbsp;${news.name}</a>
        </td>
    </tr>
    </#list>
    </table>

     

     

    如何打开指定的某个内容

        点击内容列表中的某项时,如果为它指定了一个超链接,那么该超链接负责对应内容的显示。本系统使用 viewnews.jsp来显示新闻内容,同时它也能用来显示指定的内容。整个过程是这样的:

    1 定义单项数据取数的SQL(如下图,注意红色显示的提示信息):

     

    2 在栏目的列表样式中使用FreeMaker 模板来定义内容列表,如上图2, 指定超链接到 viewnews.jsp中,特别注意参数部分(图2中绿色荧光部分):

    viewnews.jsp?subjectid=${subjectid}&id=${news.primarykey.id}

    其中${subjectid}是指代栏目的ID, id=${news.primarykey.id} 表示的是主键字段名为id 它的值是 news.primarykey.id 假如某个数据源定义中主键是两个字段的组合键(假设为 id,name ) ,那么其中链接地址就应该类似于:viewnews.jsp?subjectid=${subjectid}&id=${news.primarykey.id}&name=${news.primarykey.name}

    使用FreeMaker模板一文中我们知道,可以使用 news.字段名 来访问其中字段的数据,为什么这里要用 news.primarykey.id这样的格式访问id字段呢。这是因为当字段为字符型或日期型时,把这们的数据拼接到URL地址上,可能会丢失数据或数据失真。因此需要将数据进行编码后再使用。因此 news.字段名可以访问字段的数据, 而news.primarykey.字段名访问的则是进行编码后的数据。但是news.primarykey.字段名仅能访问定义为主键的字段的数据。

     

    3 在新闻显示设置页中定义新闻内容使用指定的FreeMaker模板来排版

     

     

    使用二次开发来指定单项数据的来源:

     

    上面是最简单的情况,即列表由一个Select语句返回,具体的内容也是使用相同的Select并通过定义的主键进行检索返回。对于单项数据的来源,我们还可以使用二次开发脚本来获取,如下图:

    其中完整的脚本如下:

     

    function getNewsDetailData(param)
    {
    	var ret={};
    	var ds=newDataStore('', "select * from news_user where id="+param.id);
    	ds.retrieve();
    	ret.id=ds.getInt(0,"id");
    	ret.name=ds.getString(0,"name");
    	ret.showname=ds.getString(0,"showname");
    	ret.mobile=ds.getString(0,"mobile");
    	ret.officetel=ds.getString(0,"officetel");
     	return ret;
     
    }
      

    其中注意如下几点:

    1. 函数名称必须是 getNewsDetailData ,且有一个参数,名为param 。 param 是一个对象,它会把主键数据传过来。比如当定义主键是id,name时,那么可以使用param.id取得传入的id值,用param.name取得传入的name值
    2. 脚本中可以使用系统提供的全部函数(除去含有界面操作的函数,比如alert 等)
    3. 函数的返回值是一个对象,把需要的数据放在这个对象中返回 。比如: ret.name='张三'; ret.age=30; 那么在Freemaker模板中就可以使用 news.name 及news.age 来访问对应的数据。