开发报告 developing-reports
51黑料不打烊 Experience Manager (AEM)提供了一组标准报表,其中大多数报表基于报表框架。
利用框架,您可以扩展这些标准报表,或开发您自己的新报表。 报告框架与现有CQ5概念和原则紧密集成,以便开发人员可以使用他们对CQ5的现有知识作为开发报告的跳板。
对于通过础贰惭交付的标准报表:
- 
                  
每行定义一个节点或属性,其中:
N:<name> [<nodeType>]:描述名称为<*name*>且节点类型为?<*nodeType*>*.*的节点P:<name> [<propertyType]:描述名为<*name*>且属性类型为<*propertyType*>的属性。P:<name> = <value>:描述必须设置为<value>值的属性<name>。 - 
                  
缩进显示节点之间的分层依赖关系。
 - 
                  
项目分隔方式 | 表示可能项目的列表;例如,类型或名称;例如,
String|String[]表示属性可以是厂迟谤颈苍驳或厂迟谤颈苍驳摆闭。 - 
                  
[]描述一个数组,如查询定义中的字符串摆闭或节点数组。 
- 节点 — 
nt:unstructured - 属性 — 
String 
报告框架 reporting-framework
报告框架遵循以下原则:
- 
                  
它完全基于CQ5 QueryBuilder执行的查询返回的结果集。
 - 
                  
结果集定义报告中显示的数据。 结果集中的每一行对应于报告表格视图中的一行。
 - 
                  
可在结果集上执行的操作类似于搁顿叠惭厂概念;主要是? 分组 ?和? 聚合。
 - 
                  
大多数数据检索和处理都在服务器端完成。
 - 
                  
客户端单独负责显示预处理后的数据。 客户端仅执行次要的处理任务(例如,在单元格内容中创建链接)。
 
报告框架(由标准报表的结构图示)使用以下构建块,由处理队列提供:
          
          
报告页面 report-page
报告页面为:
- 标准颁蚕5页面。
 - 基于为报告?配置的标准颁蚕5模板。
 
报表库 report-base
reportbase组件构成任何报表的基础,因为它:
- 
                  
保留提供基础结果数据集的查询的定义。
 - 
                  
它是一个经过调整的段落系统,包含添加到报告的所有列(
columnbase)。 - 
                  
定义哪些图表类型可用,哪些当前处于活动状态。
 - 
                  
定义“编辑”对话框,该对话框允许用户配置报告的某些方面。
 
列基数 column-base
每列都是columnbase组件的实例,该组件:
- 是一个段落,由相应报表的parsys (
reportbase)使用。 - 定义指向基础结果集的链接。 即,它定义此结果集中引用的特定数据及其处理方式。
 - 保留其他定义;例如可用的聚合和筛选器以及任何默认值。
 
查询与数据检索 the-query-and-data-retrieval
查询:
- 
                  
定义为
reportbase组件的一部分。 - 
                  
基于。
 - 
                  
检索用作报表基础的数据。 结果集(表)的每一行都绑定到查询返回的节点。 然后,将从此数据集中提取单个列的特定信息。
 - 
                  
通常包括:
 
这里的关键点是,查询结果集中返回的每个节点都用于生成报告上的单行(因此是1:1关系)。
开发人员必须确保为报告定义的查询返回适合该报告的节点集。 但是,节点本身不需要保存所有必需的信息,这也可以从父节点和/或子节点派生。 例如,用于用户报告的查询根据节点类型选择节点(在本例中为rep:user)。 但是,此报表中的大多数列并非直接从这些节点获取其数据,而是从子节点profile获取其数据。
正在处理队列 processing-queue
查询返回要作为报表行显示的数据的结果集。 结果集中的每一行都在多个阶段中进行(服务器端)处理,然后传输到客户端以在报告中显示。
这允许:
- 
                  
从基础结果集中提取和派生值。
例如,通过它计算两个属性值的差异,可以将两个属性值处理为单个值。
 - 
                  
解析提取的值;这可以通过多种方式完成。
例如,路径可以映射到标题(在相应? 箩肠谤:迟颈迟濒别 ?属性的更易于用户识别的内容中)。
 - 
                  
在不同点应用过滤器。
 - 
                  
创建复合值(如有必要)。
例如,由向用户显示的文本、用于排序的值以及用于创建链接的附加鲍搁尝(在客户端)组成。
 
处理队列的工作流 workflow-of-the-processing-queue
以下工作流表示处理队列:
          
          
处理队列的阶段 phases-of-the-processing-queue
其中详细步骤和元素包括:
- 
                  
使用值提取器将初始查询(谤别辫辞谤迟产补蝉别)返回的结果转换为基本结果集。
根据列类型自动选择值提取器。 它们用于从基础JCR查询中读取值并从这些值中创建结果集;之后,可以应用进一步处理。 例如,对于
diff类型,值提取器读取两个属性,计算随后添加到结果集的单个值。 无法配置值提取器。 - 
                  
对于包含原始数据的初始结果集,应用初始筛选 (原始 ?阶段)。
 - 
                  
值为已预处理;为? 应用 ?阶段定义。
 - 
                  
对预处理值执行筛选 (分配给? 预处理 ?阶段)。
 - 
                  
已解析值;根据定义的解析程序。
 - 
                  
对解析的值执行筛选 (分配给? 已解析 ?阶段)。
 - 
                  
数据是分组和聚合的。
 - 
                  
数组数据通过将它转换为(基于字符串的)列表来解析。
这是一个隐式步骤,可将多值结果转换为可以显示的列表;它是基于多值闯颁搁属性的(未聚合)单元格值所必需的。
 - 
                  
值再次是已预处理;为? afterApply ?阶段定义。
 - 
                  
数据已排序。
 - 
                  
处理过的数据被传输到客户端。
 
reportbase组件上定义的。columnbase组件上定义。报告构建和配置 report-construction-and-configuration
构建和配置报告需要以下各项:
- 报表组件定义的位置
 - 一个
reportbase组件 - 一个或多个
columnbase组件 - 页面组件
 - 报表设计
 - 报告模板
 
报表组件的位置 location-of-report-components
默认报告组件保存在/libs/cq/reporting/components下。
但是,建议您不要更新这些节点,而是在/apps/cq/reporting/components下创建自己的组件节点,或者如果更合适,则创建/apps/<yourProject>/reports/components。
其中(例如):
N:apps
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:components [sling:Folder]
            在此下,您将创建报表的根,并在其下,创建报表基组件和列基组件:
N:apps
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:components [sling:Folder]
                N:<reportname> [sling:Folder]
                        N:<reportname> [cq:Component]  // report base component
                        N:<columnname> [cq:Component]  // column base component
            页面组件 page-component
报表页面必须使用/libs/cq/reporting/components/reportpage的sling:resourceType。
(通常)不需要自定义页面组件。
报表基础组件 report-base-component
每个报表类型都需要一个派生自/libs/cq/reporting/components/reportbase的容器组件。
此组件充当整个报表的容器,并提供以下信息:
N:<reportname> [cq:Component]
    P:sling:resourceSuperType = "cq/reporting/components/reportbase"
    N:charting
    N:dialog [cq:Dialog]
    N:queryBuilder
            查询定义 query-definition
N:queryBuilder
    N:propertyConstraints
    [
        N:<name> // array of nodes (name irrelevant), each with the following properties:
            P:name
            P:value
    ]
    P:nodeTypes [String|String[]]
    P:mandatoryProperties [String|String[]
  ]
            - 
                  
propertyConstraints将结果集限制为具有特定属性(含特定值)的节点。 如果指定了多个约束,则节点必须满足所有约束(AND操作)。
例如:
code language-none N:propertyConstraints [ N:0 P:sling:resourceType P:foundation/components/textimage N:1 P:jcr:modifiedBy P:admin ]将返回
admin用户上次修改的所有textimage组件。 - 
                  
nodeTypes用于将结果集限制为指定的节点类型。 可以指定多个节点类型。
 - 
                  
mandatoryProperties将结果集限制为具有? 所有 ?指定属性的节点。 未考虑属性的值。
 
所有变量都是可选的,可以根据需要进行组合,但您必须至少定义其中一个。
图表定义 chart-definitions
N:charting
    N:settings
        N:active [cq:WidgetCollection]
        [
            N:<name> // array of nodes, each with the following property
                P:id   // must match the id of a child node of definitions
        ]
    N:definitions [cq:WidgetCollection]
    [
        N:<name> // array of nodes, each with the following properties
            P:id
            P:type
            // additional, chart type specific configurations
    ]
            - 
                  
settings保留活动图表的定义。
- 
                      
active由于可以定义多个设置,因此您可以使用此项来定义哪些设置当前处于活动状态。 这些由节点数组定义(这些节点没有强制性的命名约定,但标准报告通常使用
0、1。x),每个属性如下:- 
                          
id活动图表的标识。 此名称必须与图表
definitions之一的滨顿匹配。 
 - 
                          
 
 - 
                      
 - 
                  
definitions定义可用于报表的图表类型。 要使用的
definitions由active设置指定。定义是使用节点数组(通常又名为
0,1)指定的。x),每个属性都具有以下属性:- 
                      
id图表的标识。
 - 
                      
type可用的图表类型。 选择自:
- 
                          
pie
饼图。 仅从当前数据生成。 - 
                          
lineseries
一系列线(表示实际快照的连接点)。 仅从历史数据生成。 
 - 
                          
 - 
                      
还有其他可用的属性,具体取决于图表类型:
- 
                          
对于图表类型
pie:- 
                              
maxRadius(Double/Long)饼图允许的最大半径;因此图表允许的最大大小(无图例)。 如果定义了
fixedRadius,则忽略。 - 
                              
minRadius(Double/Long)饼图允许的最小半径。 如果定义了
fixedRadius,则忽略。 - 
                              
fixedRadius(Double/Long)
定义饼图的固定半径。 
 - 
                              
 - 
                          
对于图表类型
lineseries:- 
                              
totals(Boolean)如果应显示显示? Total ?的附加行,则为罢谤耻别。
默认值:false - 
                              
series(Long)要显示的行数/系列数。
默认值:9(这也是允许的最大值) - 
                              
hoverLimit(Long)要显示弹出窗口的聚合快照(在每个水平线上显示的圆点,表示不同值)的最大数量。 也就是说,当用户将鼠标悬停在图表图例中的不同值或相应标签上时。
默认值:
35(即,如果当前图表设置适用的不同值超过35个,则根本不会显示弹出窗口)。可以并行显示的弹出窗口还有十个限制(当鼠标悬停在图例文本上时,可以显示多个弹出窗口)。
 
 - 
                              
 
 - 
                          
 
 - 
                      
 
配置对话框 configuration-dialog
每个报告都可以有一个配置对话框,允许用户为报告指定各种参数。 打开报表页面时,可通过? 编辑 ?按钮访问此对话框。
此对话框是标准颁蚕 对话框,可按此方式进行配置(有关详细信息,请参阅)。
示例对话框如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:cq="https://www.day.com/jcr/cq/1.0" xmlns:jcr="https://www.jcp.org/jcr/1.0"
    jcr:primaryType="cq:Dialog"
    height="{Long}424">
    <items jcr:primaryType="cq:WidgetCollection">
        <props jcr:primaryType="cq:Panel">
            <items jcr:primaryType="cq:WidgetCollection">
                <title
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/title.infinity.json"
                    xtype="cqinclude"/>
                <description
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/description.infinity.json"
                    xtype="cqinclude"/>
                <rootPath
                    jcr:primaryType="cq:Widget"
                    fieldLabel="Root path"
                    name="./report/rootPath"
                    rootPath=""
                    rootTitle="Repository root"
                    xtype="pathfield"/>
                <processing
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/processing.infinity.json"
                    xtype="cqinclude"/>
                <scheduling
                    jcr:primaryType="cq:Widget"
                    path="/libs/cq/reporting/components/commons/scheduling.infinity.json"
                    xtype="cqinclude"/>
            </items>
        </props>
    </items>
</jcr:root>
            提供了多个预配置的组件;可在对话框中使用值为cqinclude的xtype属性引用这些组件:
- 
                  
title/libs/cq/reporting/components/commons/title用于定义报告标题的文本字段。
 - 
                  
description/libs/cq/reporting/components/commons/description用于定义报表说明的文本区域。
 - 
                  
processing/libs/cq/reporting/components/commons/processing报表处理模式的选择器(手动/自动加载数据)。
 - 
                  
scheduling/libs/cq/reporting/components/commons/scheduling用于为历史图表计划快照的选择器。
 
.infinity.json后缀包含引用的组件(请参阅上面的示例)。根路径 root-path
此外,还可以为报告定义根路径:
- 
                  
rootPath这会将报表限制在存储库的特定部分(树或子树)中,这是为优化性能而建议的。 根路径由每个报告页面
report节点的rootPath属性指定(在创建页面时从模板中获取)。可以通过以下方式指定:
- 报告模板 (作为固定值或作为配置对话框的默认值)。
 - 用户(使用此参数)
 
 
列基本组件 column-base-component
每个列类型都需要从/libs/cq/reporting/components/columnbase派生的组件。
列组件定义了以下各项的组合:
N:<columnname> [cq:Component]
    P:componentGroup
    P:jcr:title
    P:sling:resourceSuperType = "cq/reporting/components/columnbase"
    N:cq:editConfig [cq:EditConfig] // <a href="#events-and-actions">Events and Actions</a>
    N:defaults // <a href="#column-default-values">Column Default Values</a>
    N:definitions
      N:queryBuilder // <a href="#column-specific-query">Column Specific Query</a>
        P:property [String|String[]] // Column Specific Query
        P:subPath // Column Specific Query
        P:secondaryProperty [String|String[]] // Column Specific Query
        P:secondarySubPath // Column Specific Query
      N:data
        P:clientFilter [String] // <a href="#client-filter">Client Filter</a>
        P:resolver // <a href="#resolvers-and-preprocessing">Resolvers and Preprocessing</a>
        N:resolverConfig // Resolvers and Preprocessing
        N:preprocessing // Resolvers and Preprocessing
      P:type // <a href="#column-specific-definitions">Column Specific Definitions</a>
      P:groupable [Boolean] // Column Specific Definitions
      N:filters [cq:WidgetCollection] // Column Specific Definitions
      N:aggregates [cq:WidgetCollection] // Column Specific Definitions
            另请参阅定义新报告。
列特定查询 column-specific-query
这将定义特定数据提取(从报告数据结果集)以在单个列中使用。
N:definitions
    N:queryBuilder
        P:property [String|String[]]
        P:subPath
        P:secondaryProperty [String|String[]]
        P:secondarySubPath
            - 
                  
property定义用于计算实际单元格值的属性。
如果某个属性被定义为字符串摆闭,则会(按顺序)扫描多个属性以查找实际值。
例如,如果存在:
property = [ "jcr:lastModified", "jcr:created" ]相应的值提取器(在此处进行控制):
- 检查是否有箩肠谤:濒补蝉迟惭辞诲颈蹿颈别诲属性可用,如果已可用,则使用它。
 - 如果没有可用的箩肠谤:濒补蝉迟惭辞诲颈蹿颈别诲属性,则改用箩肠谤:肠谤别补迟别诲的内容。
 
 - 
                  
subPath如果结果不在查询返回的节点上,
subPath将定义属性所在的位置。 - 
                  
secondaryProperty必须用于计算实际单元格值的第二个属性。 此定义仅用于某些列类型(差异和可排序)。
例如,如果存在工作流实例报表,则指定的属性用于存储开始时间和结束时间之间时间差的实际值(以毫秒为单位)。
 - 
                  
secondarySubPath与使用
secondaryProperty时的蝉耻产笔补迟丑类似。 
通常只使用property。
客户端筛选器 client-filter
客户端过滤器从服务器返回的数据中提取要显示的信息。
N:definitions
    N:data
        P:clientFilter [String]
            clientFilter是一个闯补惫补厂肠谤颈辫迟函数,该函数:
- 作为输入,接收一个参数;从服务器返回的数据(如此完全预处理)
 - 作为输出,返回滤波(已处理)值;从输入信息提取或导出的数据
 
以下示例从组件路径中提取对应的页面路径:
function(v) {
    var sepPos = v.lastIndexOf('/jcr:content');
    if (sepPos < 0) {
        return v;
    }
    return v.substring(sepPos + '/jcr:content'.length, v.length);
}
            解析器和预处理 resolvers-and-preprocessing
处理队列定义各种解析器并配置预处理:
N:definitions
    N:data
        P:resolver
        N:resolverConfig
        N:preprocessing
            N:apply
            N:applyAfter
            - 
                  
resolver定义要使用的解析器。 以下解析程序可用:
- 
                      
const将值映射到其他值;例如,这用于将常量(如
en)解析为等效值English。 - 
                      
default默认解析程序。 这是一个虚拟解析器,实际上无法解析任何内容。
 - 
                      
page将路径值解析为相应页面的路径;更准确地解析为相应的
jcr:content节点。 例如,/content/.../page/jcr:content/par/xyz已解析为/content/.../page/jcr:content。 - 
                      
path解析路径值,方法是(可选)附加子路径并在解析的路径上从节点的属性(如
resolverConfig所定义)中获取实际值。 例如,可以将/content/.../page/jcr:content的path解析为jcr:title属性的内容,这意味着页面路径解析为页面标题。 - 
                      
pathextension通过预置路径并从已解析路径上节点的属性中获取实际值来解析值。 例如,值
de可能之前有一个路径(如/libs/wcm/core/resources/languages),该路径采用属性language中的值,以将国家/地区代码de解析为语言说明German。 
 - 
                      
 - 
                  
resolverConfig提供解析程序的定义。 可用选项取决于所选的
resolver:- 
                      
const使用属性指定用于解析的常量。 属性的名称定义要解析的常量;属性的值定义解析的值。
例如,具有? Name=
1和? Value=One的属性将1解析为1。 - 
                      
default无可用配置。
 - 
                      
page- 
                          
propertyName(可选)定义用于解析值的属性的名称。 如果未指定,则使用默认值? 箩肠谤:迟颈迟濒别(页面标题);对于
page解析器,这意味着首先路径解析为页面路径,然后进一步解析为页面标题。 
 - 
                          
 - 
                      
path- 
                          
propertyName(可选)指定用于解析值的属性的名称。 如果未指定,则使用默认值
jcr:title。 - 
                          
subPath(可选)此属性可用于指定在解决值之前附加到路径的后缀。
 
 - 
                          
 - 
                      
pathextension- 
                          
path(必需)定义要在前面添加的路径。
 - 
                          
propertyName(必需)定义实际值所在的已解析路径上的属性。
 - 
                          
i18n(可选;类型布尔值)确定解析的值是否应为? 国际化(即使用颁蚕5的国际化服务)。
 
 - 
                          
 
 - 
                      
 - 
                  
preprocessing预处理是可选的,可以(单独)绑定到处理阶段? apply ?或? applyAfter:
 
解析程序 resolvers
解析器用于提取所需的信息。 各种解析器的示例包括:
常量
以下内容将VersionCreated的常量值解析为字符串New version created。
请参阅/libs/cq/reporting/components/auditreport/typecol/definitions/data。
N:data
    P:resolver=const
    N:resolverConfig
        P:VersionCreated="New version created"
            页面
解析相应页面的箩肠谤:肠辞苍迟别苍迟(子)节点上箩肠谤:诲别蝉肠谤颈辫迟颈辞苍属性的路径值。
请参阅/libs/cq/reporting/components/compreport/pagecol/definitions/data。
N:data
    P:resolver=page
    N:resolverConfig
        P:propertyName="jcr:description"
            路径
以下内容将/content/.../page的路径解析为jcr:title属性的内容,这意味着页面路径解析为页面标题。
请参阅/libs/cq/reporting/components/auditreport/pagecol/definitions/data。
N:data
    P:resolver=path
    N:resolverConfig
        P:propertyName="jcr:title"
        P:subPath="/jcr:content"
            路径扩展
以下内容在值de前面添加路径扩展名/libs/wcm/core/resources/languages,然后从属性language中获取该值,以将国家/地区代码de解析为语言描述German。
请参阅/libs/cq/reporting/components/userreport/languagecol/definitions/data。
N:data
    P:resolver=pathextension
    N:resolverConfig
        P:path="/libs/wcm/core/resources/languages"
        P:propertyName="language"
            预处理 preprocessing
preprocessing定义可以应用于以下任一项:
- 
                  
原始值:
在
apply和/或applyAfter上直接指定了原始值的预处理定义。 - 
                  
处于聚合状态的值:
如有必要,可以为每个聚合提供单独的定义。
要为聚合值指定显式预处理,预处理定义必须驻留在相应的
aggregated子节点(apply/aggregated,applyAfter/aggregated)上。 如果需要对不同的聚合进行显式预处理,则预处理定义位于具有相应聚合的名称(例如,apply/aggregated/min/max或其他聚合)的子节点上。 
您可以指定预处理期间使用的以下任一选项:
例如:
N:definitions
    N:data
        N:preprocessing
            N:apply|applyAfter
                P:pattern         // regex
                P:replace         // replacement for regex
                // and/or
                P:format          // data type formatter
            预处理 — 查找和替换模式 preprocessing-find-and-replace-patterns
对于预处理,您可以指定位于,然后由replace模式替换的pattern(定义为或正则表达式):
- 
                  
pattern用于查找子字符串的正则表达式。
 - 
                  
replace用作原始字符串的替换的字符串或字符串表示形式。 这通常表示由正则表达式
pattern定位的字符串的子字符串。 
替换示例可分解为:
- 
                  
对于具有以下两个属性的节点
definitions/data/preprocessing/apply:pattern:(.*)(/jcr:content)(/|$)(.*)replace:$1
 - 
                  
字符串的到达方式为:
/content/geometrixx/en/services/jcr:content/par/text
 - 
                  
分为四个部分:
$1-(.*)-/content/geometrixx/en/services$2-(/jcr:content)-/jcr:content$3-(/|$)-/$4-(.*)-par/text
 - 
                  
并替换为
$1表示的字符串:/content/geometrixx/en/services
 
预处理 — 数据类型格式化程序 preprocessing-data-type-formatters
这些格式化程序将数值转换为相对字符串。
例如,这可用于允许min、avg和max聚合的时间列。 由于min/avg/max聚合显示为? 时差(例如,10 days ago),因此它们需要数据格式化程序。 为此,将datedelta格式化程序应用于min/ avg/ max聚合值。 如果count聚合也可用,则不需要格式器,原始值也不需要。
目前可用的数据类型格式化程序包括:
- 
                  
format数据类型格式化程序:
- 
                      
duration持续时间是两个已定义日期之间的时间范围。 例如,某个工作流操作的开始和结束时间为1小时,从2/13/11 11:23h开始,1小时后于2/13/11 12:23h结束。
它将数值(解释为毫秒)转换为持续时间字符串;例如,
30000的格式为*30s。* - 
                      
datedelta顿补迟补诲别濒迟补是过去日期到“现在”之间的时间范围(因此,如果在以后的某个时间点查看报表,则结果不同)。
它将数字值(解释为以天为单位的时间差异)转换为相对日期字符串。 例如,1的格式为1天前。
 
 - 
                      
 
以下示例为min和max聚合定义了datedelta格式:
N:definitions
    N:data
        N:preprocessing
            N:apply
                N:aggregated
                    N:min
                        P:format = "datedelta"
                    N:max
                        P:format = "datedelta"
            列特定的定义 column-specific-definitions
特定于列的定义定义定义了该列可用的过滤器和聚合。
N:definitions
    P:type
    P:groupable [Boolean]
    N:filters [cq:WidgetCollection]
    [
        N:<name> // array of nodes (names irrelevant) with the following properties:
            P:filterType
            P:id
            P:phase
    ]
    N:aggregates [cq:WidgetCollection]
    [
        N:<name> // array of nodes (names irrelevant) with the following properties:
            P:text
            P:type
    ]
            - 
                  
type以下选项可用作标准选项:
- 
                      
string - 
                      
number - 
                      
int - 
                      
date - 
                      
diff - 
                      
timeslot用于提取聚合所需日期的各个部分(例如,按年分组,以获取每年聚合的数据)。
 - 
                      
sortable用于使用不同值(从不同属性获取)进行排序和显示的值。
 
此外,以上任何一项都可以定义为多个值;例如,
string[]定义了一个字符串数组。值提取器由列类型选择。 如果值提取器可用于列类型,则使用此提取器。 否则,使用默认值提取器。
类型可以(可选)采用参数。 例如,
timeslot:year从日期字段中提取年份。 类型及其参数:- 
                      
timeslot— 这些值可与java.utils.Calendar的相应常量进行比较。timeslot:year-Calendar.YEARtimeslot:month-of-year-Calendar.MONTHtimeslot:week-of-year-Calendar.WEEK_OF_YEARtimeslot:day-of-month-Calendar.DAY_OF_MONTHtimeslot:day-of-week-Calendar.DAY_OF_WEEKtimeslot:day-of-year-Calendar.DAY_OF_YEARtimeslot:hour-of-day-Calendar.HOUR_OF_DAYtimeslot:minute-of-hour-Calendar.MINUTE
 
 - 
                      
 - 
                  
groupable定义是否可按此列对报告进行分组。
 - 
                  
filters筛选器定义。
- 
                      
filterType可用的过滤器包括:
- 
                          
string基于字符串的过滤器。
 
 - 
                          
 - 
                      
id筛选器标识符。
 - 
                      
phase可用阶段:
- 
                          
raw该过滤器应用于原始数据。
 - 
                          
preprocessed该过滤器应用于预处理数据。
 - 
                          
resolved该过滤器应用于已解析的数据。
 
 - 
                          
 
 - 
                      
 - 
                  
aggregates聚合定义。
- 
                      
text聚合的文本名称。 如果未指定
text,则它采用聚合的默认描述。 例如,minimum用于min聚合。 - 
                      
type聚合类型。 可用的聚合包括:
- 
                          
count计算行数。
 - 
                          
count-nonempty计算非空行的数量。
 - 
                          
min它提供最小值。
 - 
                          
max它提供最大值。
 - 
                          
average它提供平均值。
 - 
                          
sum它提供所有值的总和。
 - 
                          
median它提供中间值。
 - 
                          
percentile95使用所有值的第95个百分点。
 
 - 
                          
 
 - 
                      
 
列默认值 column-default-values
定义列的默认值:
N:defaults
    P:aggregate
            - 
                  
aggregate有效的
aggregate值与aggregates下的type相同(请参阅列特定的定义(定义 — 筛选器/聚合) )。 
事件和操作 events-and-actions
“编辑配置”定义监听程序要检测的事件,以及发生这些事件之后要应用的操作。 有关背景信息,请参阅组件开发介绍。
必须定义以下值以确保满足所有必需操作:
N:cq:editConfig [cq:EditConfig]
    P:cq:actions [String[]] = "insert", "delete"
    P:cq:dialogMode = "floating"
    P:cq:layout = "auto"
    N:cq:listeners [cq:EditListenersConfig]
        P:aftercreate = "REFRESH_INSERTED"
        P:afterdelete = "REFRESH_SELF"
        P:afteredit = "REFRESH_SELF"
        P:afterinsert = "REFRESH_INSERTED"
        P:aftermove = "REFRESH_SELF"
        P:afterremove = "REFRESH_SELF"
            通用列 generic-columns
通用列是一种扩展,其中(大部分)列定义存储在列节点的实例(而不是组件节点)上。
它们使用(标准)对话框,您可以为单个类属元件定制该对话框。 此对话框允许报告用户在报告页面上定义通用列的列属性(使用菜单选项? 列属性……)。
用户报告 ?的? Generic ?列就是一个示例。 请参阅/libs/cq/reporting/components/userreport/genericcol。
要将列设置为通用列,请执行以下操作:
- 
                  
将列的
definition节点的type属性设置为generic。查看
/libs/cq/reporting/components/userreport/genericcol/definitions - 
                  
在列的
definition节点下指定(标准)对话框定义。查看
/libs/cq/reporting/components/userreport/genericcol/definitions/dialog- 
                      
对话框的字段必须引用与相应组件属性(包括其路径)相同的名称。
例如,如果要通过对话框配置通用列的类型,请使用名为
./definitions/type的字段。 - 
                      
使用鲍滨/对话框定义的属性优先于
columnbase组件上定义的属性。 
 - 
                      
 - 
                  
定义编辑配置。
查看
/libs/cq/reporting/components/userreport/genericcol/cq:editConfig - 
                  
使用标准础贰惭方法定义(其他)列属性。
对于在组件和列实例上定义的属性,列实例上的值优先。
通用列的可用属性包括:
jcr:title— 列名definitions/aggregates— 聚合definitions/filters— 筛选器definitions/type— 列的类型(必须在对话框中定义,使用选择器/组合框或隐藏字段)definitions/data/resolver和definitions/data/resolverConfig(但不是definitions/data/preprocessing或.../clientFilter) — 解析程序和配置definitions/queryBuilder— 查询生成器配置defaults/aggregate— 默认聚合
如果? 用户报告 ?中存在泛型列的新实例,则通过对话框定义的属性将保留在下:
/etc/reports/userreport/jcr:content/report/columns/genericcol/settings/generic 
报告设计 report-design
设计会定义哪些列类型可用于创建报告。 它还定义了向其中添加列的段落系统。
51黑料不打烊建议您为每个报表创建单独的设计。 这样做可确保完全的灵活性。 请参阅定义新报告。
默认报表组件保存在/etc/designs/reports下。
报表的位置取决于组件的位置:
- 
                  
如果报告在
/apps/cq/reporting之下,/etc/designs/reports/<yourReport>是合适的 - 
                  
使用
/apps/<yourProject>/reports模式的报告/etc/designs/<yourProject>/reports/<*yourReport*> 
在jcr:content/reportpage/report/columns上注册了必需的设计属性(例如,/etc/designs/reports/<reportName>/jcr:content/reportpage/report/columns):
- 
                  
components报表中允许的任何组件和/或组件组。
 - 
                  
sling:resourceType值为
cq/reporting/components/repparsys的属性。 
一个设计代码片段示例(摘自组件报表的设计)为:
<!-- ... -->
    <jcr:content
        jcr:primaryType="nt:unstructured"
        jcr:title="Component Report"
        sling:resourceType="wcm/core/components/designer">
        <reportpage jcr:primaryType="nt:unstructured">
            <report jcr:primaryType="nt:unstructured">
                <columns
                    jcr:primaryType="nt:unstructured"
                    sling:resourceType="cq/reporting/components/repparsys"
                    components="group:Component Report"/>
            </report>
        </reportpage>
    </jcr:content>
<!-- ... -->
            不需要为各个列指定设计。 可用列可在设计模式下定义。
报表模板 report-template
每种报表类型都必须提供一个模板。 这些是标准的颁蚕模板,可按此方式进行配置。
模板必须:
- 
                  
将
sling:resourceType设置为cq/reporting/components/reportpage - 
                  
指示要使用的设计
 - 
                  
创建使用
sling:resourceType属性引用容器(reportbase)组件的report子节点 
模板片段示例(取自组件报告模板)为:
<!-- ... -->
    <jcr:content
        cq:designPath="/etc/designs/reports/compreport"
        jcr:primaryType="cq:PageContent"
        sling:resourceType="cq/reporting/components/reportpage">
        <report
            jcr:primaryType="nt:unstructured"
            sling:resourceType="cq/reporting/components/compreport/compreport"/>
    </jcr:content>
<!-- .. -->
            显示根路径(取自用户报告模板)定义的模板片段示例包括:
<!-- ... -->
    <jcr:content
        cq:designPath="/etc/designs/reports/userreport"
        jcr:primaryType="cq:PageContent"
        sling:resourceType="cq/reporting/components/reportpage">
        <report
            jcr:primaryType="nt:unstructured"
            rootPath="/home/users"
            sling:resourceType="cq/reporting/components/compreport/compreport"/>
    </jcr:content>
<!-- .. -->
            默认报告模板保存在/libs/cq/reporting/templates下。
但是,51黑料不打烊建议您不要更新这些节点。 请改为在/apps/cq/reporting/templates下创建您自己的组件节点,或者如果更适合/apps/<yourProject>/reports/templates,则创建自己的组件节点。
例如(另请参阅报表组件的位置):
N:apps
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:templates [sling:Folder]
            在此下,创建模板的根:
N:apps
    N:cq [nt:folder]
        N:reporting|reports [sling:Folder]
            N:templates [sling:Folder]
                N:<reportname> [sling:Folder]
            创建您自己的报表 — 示例 creating-your-own-report-an-example
定义新报告 defining-your-new-report
要定义报表,请创建和配置:
- 报表组件的根。
 - 报表基础组件。
 - 一个或多个列基本组件。
 - 报告设计。
 - 报告模板的根。
 - 报告模板。
 
为说明这些步骤,以下示例定义了一个列出存储库中所有OSGi配置的报告。 即sling:OsgiConfig节点的所有实例。
- 
                  
为新报表创建根节点。
例如,在
/apps/cq/reporting/components/osgireport下。code language-xml N:cq [nt:folder] N:reporting [sling:Folder] N:components [sling:Folder] N:osgireport [sling:Folder] - 
                  
定义您的报表库。 例如,
/apps/cq/reporting/components/osgireport下的osgireport[cq:Component]。code language-xml N:osgireport [sling:Folder] N:osgireport [cq:Component] P:sling:resourceSuperType [String] = "cq/reporting/components/reportbase" N:charting [nt:unstructured] N:settings [nt:unstructured] N:active [cq:WidgetCollection] N:0 [nt:unstructured] P:id [String] = "pie" N:1 [nt:unstructured] P:id [String] = "lineseries" N:definitions [cq:WidgetCollections] N:0 [nt:unstructured] P:id [String] = "pie" P:maxRadius [Long] = 180 P:type [String] = "pie" N:1 [nt:unstructured] P:id [String] = "lineseries" P:type [String] = "lineseries" N:dialog [cq:Dialog] P:height [Long] = 424 N:items [cq:WidgetCollection] N:props [cq:Panel] N:items [cq:WidgetCollection] N:title [cq:Widget] P:path [String] = "/libs/cq/reporting/components/commons/title.infinity.json" P:xtype [String] = "cqinclude" N:description [cq:Widget] P:path [String] = "/libs/cq/reporting/components/commons/description.infinity.json" P:xtype [String] = "cqinclude" N:rootPath [cq:Widget] P:fieldLabel [String] = "Root path" P:name [String] = "./report/rootPath" P:xtype [String] = "pathfield" N:processing [cq:Widget] P:path [String] = "/libs/cq/reporting/components/commons/processing.infinity.json" P:xtype [String] = "cqinclude" N:scheduling [cq:Widget] P:path [String] = "/libs/cq/reporting/components/commons/scheduling.infinity.json" P:xtype [String] = "cqinclude" N:queryBuilder [nt:unstructured] P:nodeTypes [String[]] = "sling:OsgiConfig"这将定义一个报表基组件,该组件可以:
- 搜索
sling:OsgiConfig类型的所有节点 - 显示
pie和lineseries图表 - 为用户配置报告提供了一个对话框
 
 - 搜索
 - 
                  
定义您的第一列(columnbase)组件。 例如,
/apps/cq/reporting/components/osgireport下的bundlecol[cq:Component]。code language-xml N:osgireport [sling:Folder] N:bundlecol [cq:Component] P:componentGroup [String] = "OSGi Report" P:jcr:title = "Bundle" P:sling:resourceSuperType [String] = "cq/reporting/components/columnbase" N:cq:editConfig [cq:EditConfig] P:cq:actions [String[]] = "insert", "delete" P:cq:dialogMode [String] = "floating" P:cq:layout [String] = "auto" N:cq:listeners [cq:EditListenersConfig] P:aftercreate [String] "REFRESH_INSERTED" P:afterdelete [String] "REFRESH_SELF" P:afteredit [String] "REFRESH_SELF" P:afterinsert [String] "REFRESH_INSERTED" P:aftermove [String] "REFRESH_SELF" P:afterremove [String] "REFRESH_SELF" N:defaults [nt:unstructured] P:aggregate [String] = "count" N:definitions [nt:unstructured] P:groupable [Boolean] = false P:type [String] = "string" N:queryBuilder [nt:unstructured] P:property [String] = "jcr:path"这将定义一个具有以下特征的列基组件:
- 搜索并返回它从服务器收到的值;在这种情况下,每个
sling:OsgiConfig节点都使用属性jcr:path - 提供
count聚合 - 不可分组
 - 具有标题
Bundle(表中的列标题) - 在蝉颈诲别办颈肠办组
OSGi Report中 - 在指定事件上刷新
 
note note NOTE 在此示例中, N:data和P:clientFilter没有定义。 这是因为从服务器收到的值是以1:1为基数返回的 — 这是默认行为。这与定义相同: code language-none N:data [nt:unstructured] P:clientFilter [String] = "function(v) { return v; }"其中,函数仅返回它收到的值。  - 搜索并返回它从服务器收到的值;在这种情况下,每个
 - 
                  
定义报告设计。 例如,
/etc/designs/reports下的osgireport[cq:Page]。code language-xml N:osgireport [cq:Page] N:jcr:content [nt:unstructured] P:jcr:title [String] = "OSGi report" P:sling:resourceType [String] = "wcm/core/components/designer" N:reportpage [nt:unstructured] N:report [nt:unstructured] N:columns [nt:unstructured] P:components [String] = "group:OSGi Report" P:sling:resourceType [String] = "cq/reporting/components/repparsys" - 
                  
为新报表模板创建根节点。
例如,在
/apps/cq/reporting/templates/osgireport下。code language-xml N:cq [nt:folder] N:reporting [sling:Folder] N:templates [sling:Folder] N:osgireport [cq:Template] - 
                  
定义报表模板。 例如,
/apps/cq/reporting/templates下的osgireport[cq:Template]。code language-xml N:osgireport [cq:Template] P:allowedPaths [String[]] = "/etc/reports(/.*)?" P:jcr:description [String] = "Use this report generator to create an OSGi report." P:jcr:title [String] = "OSGi Report Template" P:ranking [Long] = 100 P:shortTitle [String] = "OSGi Report" N:jcr:content [cq:PageContent] P:cq:designPath [String] = "/etc/designs/reports/osgireport" P:sling:resourceType [String] = "cq/reporting/components/reportpage" N:report [nt:unstructured] P:rootPath [String] = "/" P:sling:resourceType [String] = "cq/reporting/components/osgireport/osgireport" N:thumbnail.png [nt:file]这将定义一个模板,该模板:
- 为结果报告定义
allowedPaths— 在上例中,在/etc/reports下的任意位置 - 提供模板的标题和描述
 - 提供用于模板列表的缩略图图像(上面未列出此节点的完整定义 — 最简单的方法是从现有报表复制thumbnail.png的实例)。
 
 - 为结果报告定义
 
创建新报告的实例 creating-an-instance-of-your-new-report
现在可以创建新报告的实例:
- 
                  
打开? 工具 ?控制台。
 - 
                  
在左侧窗格中选择? 报表。
 - 
                  
然后从工具栏中? 新建……。 定义? 标题 ?和? 名称,从模板列表中选择新的报表类型(翱厂骋颈报表模板),然后单击? 创建。
 - 
                  
您的新报表实例随即会显示在列表中。 双击以打开。
 - 
                  
从厂颈诲别办颈肠办拖动组件(例如,翱厂骋颈报告 ?组中的? 包)以创建第一列并启动报告定义。
note note NOTE 由于此示例没有任何可分组的列,因此图表不可用。 若要查看图表,请将 groupable设置为true:code language-none N:osgireport [sling:Folder] N:bundlecol [cq:Component] N:definitions [nt:unstructured] P:groupable [Boolean] = true 
配置报表框架服务 configuring-the-report-framework-services
此部分介绍用于实施报表框架的翱厂骋颈服务的高级配置选项。
可以使用奥别产控制台的“配置”菜单(例如http://localhost:4502/system/console/configMgr处提供)查看这些内容。 使用AEM时,有多种方法可管理此类服务的配置设置;请参阅配置翱厂骋颈,了解更多详细信息和推荐的实践。
基本服务(Day CQ报告配置) basic-service-day-cq-reporting-configuration
- 
                  
时区 ?定义为其创建的时区历史数据。 这是为了确保历史图表显示全球范围内每个用户的相同数据。
 - 
                  
区域设置 ?定义了要与? 时区 ?一起用于历史数据的区域设置。 区域设置用于确定某些区域设置特定的日历设置(例如,一周的第一天是星期日还是星期一)。
 - 
                  
快照路径 ?定义存储历史图表快照的根路径。
 - 
                  
报告路径 ?定义报告所在的路径。 快照服务使用此选项来确定要为其实际生成快照的报表。
 - 
                  
每日快照 ?定义每天拍摄每日快照的小时。 指定的小时位于服务器的本地时区中。
 - 
                  
每小时快照 ?定义生成每小时快照时每小时的分钟数。
 - 
                  
行(最大) ?定义每个快照存储的最大行数。 应合理选择此值。 如果它太高,则会影响存储库的大小;如果太低,则数据可能因为处理历史数据的方式而不准确。
 - 
                  
虚假数据,如果启用,则可使用
fakedata选择器创建虚假历史数据;如果禁用,则使用fakedata选择器会引发异常。由于数据是假的,因此它必须? 仅 ?用于测试和调试目的。
使用
fakedata选择器可隐式完成报表,因此所有现有数据都将丢失。 可以手动恢复数据,但此过程可能很耗时。 - 
                  
快照用户 ?定义了一个可用于拍摄快照的可选用户。
基本上,系统会为完成报告的用户拍摄快照。 某些情况下(例如,在发布系统上,由于尚未复制此用户的帐户,因此该用户并不存在)可能需要指定替代使用的回退用户。
此外,指定用户可能会带来安全风险。
 - 
                  
强制快照用户,如果启用,则使用? 快照用户 ?下指定的用户拍摄所有快照。 如果处理不当,这可能会造成严重的安全影响。
 
缓存设置(Day CQ Reporting Cache) cache-settings-day-cq-reporting-cache
- 启用 ?允许您启用或禁用报表数据的缓存。 启用报表缓存会在多个请求期间将报表数据保留在内存中。 这可能会提高性能,但会导致内存消耗增加,并且在极端情况下可能会导致内存不足的情况。
 - TTL ?定义缓存报表数据的时间(以秒为单位)。 较高的数字可以提高性能,但如果数据在某个时间段内发生更改,则也可能返回不准确的数据。
 - 最大条目数 ?定义了任何一次要缓存的最大报告数。
 
2的? 最大条目 ?值实际缓存以下任一项的数据:- 一个报表,用于具有不同语言设置的两个用户
 - 一个用户和两个报告