我需要创建一个自定义小部件,该小部件将具有下拉菜单和少量文本字段。.下拉列表应该由从外部数据库检索到的数据填充。
我已经用谷歌搜索了它,但如果有人做过这样的事情,没有找到解决方案,请告诉我。
我认为你的小部件应该是compositeField
. 您可以在示例 1:自定义多字段小部件中的http://dev.day.com/docs/en/cq/current/developing/widgets.html找到一些有用的东西
我看到它非常适合您的需求。
您似乎要求动态填充下拉列表。这需要 2 个部分。
来自http://dev.day.com/docs/en/cq/current/developing/widgets.html#Dynamic+Dialogs
下拉对话框中的选择小部件。同一个节点需要一个“选项”属性,即服务的 url。
该服务应提供 JSON 数据用于显示与价值。
<items jcr:primaryType="cq:WidgetCollection">
<myDropDown
jcr:primaryType="cq:Widget"
name="./myDropDown"
fieldLabel="Dyanmic values from DB:"
type="select"
xtype="selection"
options="${serviceURL}.json"
/>
</items>
响应 ${serviceURL} 的 servlet 需要返回一个 JSON 文本数组,值对(显然是根据您的数据库查询构建的)。例如:
[
{value: "first val", text: "Display in Dialog"},
...
{value: "last val", text: "Display Text"}
]
有几种方法可以解决这个问题。首先要考虑的是您的数据从数据库中更改的频率,以及数据库和 cq5 服务器之间的延迟。
如果数据不经常变化,只需要手动或定期更新,可以考虑从数据库中提取信息,然后将其转换为 JCR 中的结构。从那里,您可以在 Sling 中使用开箱即用的 json 转换器,方法是点击带有 .json 扩展名的节点 url。即与您将内容节点视为 json localhost:4502/content/geometrixx/en.infinity.json 的方式相同
假设这是一个作者实例,您应该考虑将下拉结构放在 /apps 目录中,如果您想在它被激活时将其隐藏起来,以防它被激活。
如果您要公开显示下拉列表,则可以将其放置在结构中的 /content 目录中,或者如果您认为它更符合应用程序代码的内容,则放置在 /etc 目录中的适当位置这是公开的。
第二个选项,如果您希望每次都调用数据库以获取下拉信息,是创建一个自定义 sling servlet,(参见http://www.therealcq.blogspot.com.au/2013/01/how-to -write-custom-slingservlet.html以获得基本的了解)。
在那里,建立与数据库的连接,进行相关的 SQL 调用,将其转换为 JSON 并将其作为端点返回。如果您强制它具有 .json 扩展名,请确保您的调度程序没有不恰当地缓存答案,就像您选择了此选项一样,下拉列表中的数据将是上下文相关的或快速移动的。
如果您需要详细说明这些解决方案,请告诉我。