【问题标题】:In Adobe AEM, how does the parsys component inject styles into the design css file?在 Adob​​e AEM 中,parsys 组件如何将样式注入到设计 css 文件中?
【发布时间】:2013-03-21 19:20:13
【问题描述】:

在 Adob​​e AEM(以前的 CQ5)中,基础组件 parsys 的 design_dialog 允许用户设置“单元格填充”。在文本字段中输入的任何值都会显示在设计 css 中。

例如:

鉴于当前页面正在使用 /etc/designs/my-design,页面输出将包含对 /etc/designs/my-design.css 样式表虚拟路径的引用。

如果用户将 parsys 单元格内边距配置为 30px,则 my-design.css 文件将包含以下内容:

.page_full .par div.section {
  padding: 30px;
}

字符串“30px”存储在名为 div.padding 的 jcr:content/page/par/section 属性中,但是,我无法弄清楚 parsys.jsp 是如何将它注入 my-design.css 的。

编辑: 需要明确的是,基础页面 headlibs.jsp 中的 currentDesign.writeCssIncludes(pageContext); 调用是设置设计 css 的代码,包括如下:

<link href="/etc/designs/my-design/static.css" rel="stylesheet" type="text/css"/>
<link href="/etc/designs/my-design.css" rel="stylesheet" type="text/css"/>

但是,目前尚不清楚如何将您自己的 CSS 包含在 /etc/designs/my-design.css 请求的响应正文中。

【问题讨论】:

  • 注入是什么意思?你想完成什么,或者这仅仅是为了知识?
  • 填充是根据用户设置动态添加的。我想对我的组件做类似的事情,但我不知道这个设置是如何进入主 design.css 文件的。

标签: aem


【解决方案1】:

parsys 并没有真正注入样式,但是当您更改 parsys 组件的设计参数时,它们会存储在设计页面中,并且当设计类将其呈现为 css 时,输出包含这些更新。

设计 CSS 是如何呈现的

如您所见,设计信息存储在/etc/designs/my-design 中。此页面的此组件支持包含的信息的 css 再现。

您可以使用产品中包含的 CQ 开发工具跟踪再现的来源...

如果您在 crx/de 或 crx/explorer 中查看您的设计页面,您会注意到它的 sling:resourceType 为 wcm/core/components/designer

这将由以下 java 类 /libs/wcm/core/components/designer/designer.css.java 呈现。您也可以在 crx/de 中查看此文件。我不确定该文件中的许可证是否允许我在此处发布 sn-p,但您应该可以自己轻松找到它。

该类获取页面资源并将对象调整为com.day.cq.wcm.api.designer.Design 实例。

查看 web 控制台中的依赖查找器,Design 类由 cq-wcm-api 包提供。

<dependency>
  <groupId>com.day.cq.wcm</groupId>
  <artifactId>cq-wcm-api</artifactId>
  <version>5.5.0</version>
  <scope>provided</scope>
</dependency>

这是由 jar 提供的:/libs/wcm/core/install/cq-wcm-api-5.5.0.jar,它与 CQ 捆绑在一起。

自定义设计 CSS

看看你想要达到的目标...... 您可以自定义设计页面的内容(这通常是通过向您正在使用的组件添加设计对话框)添加与该组件关联的任何属性/css 属性。

有关此示例,请查看 geometrixx 设计中的徽标组件 (/etc/designs/geometrixx/jcr:content/contentpage/logo)。这已经有一个 div img.margin 属性,可以转换为

.contentpage div.logo img {
  margin: 1px;
}

在输出 css (/etc/designs/geometrixx.css?cacheKiller=xyz) 中。

向该节点添加一个名为div img.border 且值为5px solid red 的属性将输出css 为:

.contentpage div.logo img {
  margin: 1px;
  border: 5px solid red;
}

考虑到您的示例,/etc/designs/my-design 处的设计内容节点应如下所示:

+jcr:content
  + page_full
    + par
      + section
        - div .margin = 30px

或者在存储库 XML 格式中,像这样:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
    jcr:primaryType="cq:Page">
    <jcr:content
        cq:lastModified="{Date}2013-01-13T17:22:51.339+01:00"
        cq:lastModifiedBy="admin"
        cq:template="/libs/wcm/core/templates/designpage"
        jcr:primaryType="cq:PageContent"
        jcr:title="design"
        sling:resourceType="wcm/core/components/designer">
        <page_full jcr:primaryType="nt:unstructured">
            <par jcr:primaryType="nt:unstructured">
                <section
                    jcr:primaryType="nt:unstructured"
                    div_x0020_.margin="30px"/>
            </par>
        </page_full>
    </jcr:content>
</jcr:root>

设计对话框(应该用于自定义设计内容)在Developing Components 页面上有所描述。您可以在/libs/foundation/components/logo/design_dialog.html找到上述徽标组件的设计对话框(例如)

【讨论】:

  • 终于有机会验证这一点。它是正确的。我在解决方案周围盘旋,但没有连接点。谢谢。
  • 我使用 CRX 包管理器下载了 cq-content-5.5.0.20120220.zip 并反编译了 /jcr_root/libs/wcm/core/install/cq-wcm-core-5.5.6.jar。将节点转换为 CSS 样式的是 CSSWriter.class。请参阅:dev.day.com/content/docs/v5_1/cq-wcm-javadoc/com/day/cq/wcm/… 不幸的是,它不会(或无法)检测到类名何时被组件的 cq:htmlTag 覆盖。
【解决方案2】:

CSS 中的这种更改是在 parsys 中使用类 IncludeOptions 完成的。如果您查看基础组件中的 parsys.jsp,您会遇到此类的用法。 IncludeOptions 类的 getCssClassNames() 方法返回一组可修改的 css 类名称,以添加到 div 标记中。 因此,每当为 parsys 编写 section 字段时,它都会包含在动态添加到组件的 CSS 中,然后资源会包含在页面中。

【讨论】:

  • 这里可能有一些东西,但是,我相信,正如您所阐述的那样,此代码仅修改呈现的 div 标签。这类似于 cq:htmlTag 节点的使用。因此,这不是将用户配置的填充值注入“my-design.css”文件的代码。我在问题中添加了更多描述,这可能有助于澄清我在寻找什么。谢谢!
  • 谁能帮我解决以下问题,看来问题是相关的[链接]stackoverflow.com/questions/25755523/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2020-12-17
相关资源
最近更新 更多