3

使用 Adob​​e Experience Manager 5.6.1 (AEM)(以前的 CQ5)我正在尝试创建一个类似于页面属性中的图像选项卡的新选项卡。它将被命名为“标志”。

我基本上只是复制了图像选项卡以创建徽标选项卡并重命名路径以反映徽标用途。例如,我将fileReferenceParamaterto./logo/fileReferencerequestSuffixto设置为/logo.img.png

当我编辑属性时,我可以像使用“图像”选项卡一样将图像拖到选项卡中,但是,图像永远不会出现在那里。我猜这是因为默认图像处理程序没有接收请求。错误是:

无法在 org.apache.sling.servlets.get.DefaultGetServlet 中向 /content/my-site/home-page/en_us/jcr:content/logo.img.png 提供请求

当我查看内容节点时,没有sling:resourceType. 当我添加资源类型时,foundation/components/adaptiveimage它起作用了。但是,我注意到“图像”节点没有sling:resourceType. 我猜img.png.java基础页面中的 servlet 正在处理该请求。

我尝试在我的页面组件中创建一个logo.img.png.jsp文件来处理请求,但这似乎不起作用。

如何让 AEM 添加sling:resourceType或处理请求?

4

3 回答 3

5

我遇到了类似的问题,我找到了一种更简单的解决方法。您需要做的就是在您的图像hidden下添加一个 xtype ,如下所示:logo

<yourlogo
    jcr:primaryType="cq:Widget"
    <-- other properties -->
    xtype="html5smartimage">

    <items jcr:primaryType="cq:WidgetCollection">
        <resType
            jcr:primaryType="cq:Widget"
            ignoreData="{Boolean}true"
            name="./logo/sling:resourceType"
            value="foundation/components/image"
            xtype="hidden"/>
    </items>

</yourlogo>
于 2013-09-21T21:10:05.100 回答
1

好吧,经过一段时间的试验,这就是我最终要让它发挥作用的方法。如果有更简单的方法,我会很高兴知道。

首先,我复制了/libs/foundation/components/page/img.png.java文件并将其添加到我的编译包中,并进行了一些修改。

@SlingServlet(
        resourceTypes = "sling/servlet/default",
        selectors = "imgnode",
        extensions = {"png","jpg","jpeg","gif"},
        methods = "GET"
)
public class SimpleImageServlet extends AbstractImageServlet {

哪里img.png.java有以下行:

Image image = new Image(c.resource, "image");

我将其更改为:

Image image = new Image(c.resource);

这依赖于 SCR 注释来生成 OSGi 配置,以便该 servlet 将处理具有imgnode选择器的图像请求。image它只是期望当前资源是图像,而不是寻找子节点。

其次,我在页面组件的 body.jsp 叠加层中添加了一个组件,如下所示。

<cq:include path="logo" resourceType="/apps/my-site/components/logo" />

这会将徽标路径映射到要渲染的组件。

第三,在组件的 logo.jsp 中,我将选择器设置为imgnode而不是img

Image img = new Image(resourcePage, "logo");
img.setSelector("imgnode");

我相信如果覆盖了自适应图像,这一步会是相似的。您只需要呈现包含imgnode选择器的 URL。

第四,我在页面属性中设置徽标图像对话框选项卡以使用预期requestSuffix并将其他属性设置为指向徽标子节点。

例子:

requestSuffix = "/logo.imgnode.png"
fileReferenceParameter = "./logo/fileReference"

第五,我确保/apps/my-site/components/logo组件的图像对话框选项卡指向自身。

例子:

requestSuffix = ".imgnode.png"
fileReferenceParameter = "./fileReference"

现在无论是在页面属性、组件编辑还是最终渲染中,图像都得到了适当的处理。

于 2013-09-11T19:30:33.600 回答
0

使用图像小部件控件有点麻烦——只有图像组件可以很好地处理数据,而处理“.img”的 servlet 与图像组件资源类型相关联。

最简单的方法是只使用 fileReference 属性的值,而不是将图像作为页面的一部分引用。由于您使用的是 DAM 中的资产,因此这是一种合理的方法。

这并不能解决用户直接上传图像的问题。我想建议有一个像“./logo/sling:resourceType”这样的隐藏字段,但是在尝试保存对话框时在本地进行测试会导致错误。

另一种方法如下:

<sling:include resourceType="foundation/components/adaptiveimage" resource="${resource.path}/logo" />

(假设resource是 jcr:content)。这实际上与添加 sling:resourceType 相同,但至少有两个缺点:

  1. 图像在此时变为可创作的,而不是在对话框中
  2. 此方法仅适用于呈现普通标签。它不适用于任何类型的背景图像
于 2013-09-10T18:26:59.753 回答