我是 Adobe cq5 的新手。浏览了许多在线博客和教程,但没有得到太多。谁能提供一个 Adobe cq5 应用程序示例并详细说明可以在 JCR 中存储和检索数据。
提前致谢。
这是 CQ 5.4 的片段,可帮助您入门。它在内容层次结构中的任意位置插入内容页面和文本(作为 parsys)。该位置由工作流有效负载提供,但您可以编写从命令行运行的内容,并改用任何有效的 CRX 路径。将其作为流程步骤的好处是您可以为您建立一个会话,并且已经处理了到插入点的导航。
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import org.apache.sling.jcr.resource.JcrResourceConstants;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.day.cq.workflow.WorkflowException;
import com.day.cq.workflow.WorkflowSession;
import com.day.cq.workflow.exec.WorkItem;
import com.day.cq.workflow.exec.WorkflowData;
import com.day.cq.workflow.exec.WorkflowProcess;
import com.day.cq.workflow.metadata.MetaDataMap;
import com.day.cq.wcm.api.NameConstants;
@Component
@Service
@Properties({
@Property(name = Constants.SERVICE_DESCRIPTION,
value = "Makes a new tree of nodes, subordinate to the payload node, from the content of a file."),
@Property(name = Constants.SERVICE_VENDOR, value = "Acme Coders, LLC"),
@Property(name = "process.label", value = "Make new nodes from file")})
public class PageNodesFromFile implements WorkflowProcess {
private static final Logger log = LoggerFactory.getLogger(PageNodesFromFile.class);
private static final String TYPE_JCR_PATH = "JCR_PATH";
* * *
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap args)
throws WorkflowException {
//get the payload
WorkflowData workflowData = workItem.getWorkflowData();
if (!workflowData.getPayloadType().equals(TYPE_JCR_PATH)) {
log.warn("unusable workflow payload type: " + workflowData.getPayloadType());
workflowSession.terminateWorkflow(workItem.getWorkflow());
return;
}
String payloadString = workflowData.getPayload().toString();
//the text to be inserted
String lipsum = "Lorem ipsum...";
//set up some node info
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("d-MMM-yyyy-HH-mm-ss");
String newRootNodeName = "demo-page-" + simpleDateFormat.format(new Date());
SimpleDateFormat simpleDateFormatSpaces = new SimpleDateFormat("d MMM yyyy HH:mm:ss");
String newRootNodeTitle = "Demo page: " + simpleDateFormatSpaces.format(new Date());
//insert the nodes
try {
Node parentNode = (Node) workflowSession.getSession().getItem(payloadString);
Node pageNode = parentNode.addNode(newRootNodeName);
pageNode.setPrimaryType(NameConstants.NT_PAGE); //cq:Page
Node contentNode = pageNode.addNode(Node.JCR_CONTENT); //jcr:content
contentNode.setPrimaryType("cq:PageContent"); //or use MigrationConstants.TYPE_CQ_PAGE_CONTENT
//from com.day.cq.compat.migration
contentNode.setProperty(javax.jcr.Property.JCR_TITLE, newRootNodeTitle); //jcr:title
contentNode.setProperty(NameConstants.PN_TEMPLATE,
"/apps/geometrixx/templates/contentpage"); //cq:template
contentNode.setProperty(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY,
"geometrixx/components/contentpage"); //sling:resourceType
Node parsysNode = contentNode.addNode("par");
parsysNode.setProperty(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY,
"foundation/components/parsys");
Node textNode = parsysNode.addNode("text");
textNode.setProperty(JcrResourceConstants.SLING_RESOURCE_TYPE_PROPERTY,
"foundation/components/text");
textNode.setProperty("text", lipsum);
textNode.setProperty("textIsRich", true);
workflowSession.getSession().save();
}
catch (RepositoryException e) {
log.error(e.toString(), e);
workflowSession.terminateWorkflow(workItem.getWorkflow());
return;
}
}
}
我已经发布了进一步的细节和讨论。
其他几点:
我在要插入的内容页面的名称和标题中加入了时间戳。这样,您无需清理存储库即可运行许多代码和测试周期,并且您知道哪个测试是最近运行的。额外的好处:没有重复的文件名,没有歧义。
Adobe 和 Day 在为属性值、节点类型等提供常量方面一直不一致。我使用了我能找到的常量,并在其他地方使用了文字字符串。
我没有填写上次修改日期等属性。在生产代码中我会这样做。
我发现自己被Node.setPrimaryType()
和
弄糊涂了Node.getPrimaryNodeType()
。这两种方法只是粗略的补充;setter 接受一个字符串,但 getter 返回一个 NodeType,其中包含各种信息。
在此代码的原始版本中,我从文件中读取要插入的文本,而不是仅使用静态字符串“Lorem ipsum ...”
完成此示例后,您应该能够使用Abobe 文档编写从 CRX 读回数据的代码。
如果您想学习如何编写一个可以存储和查询 CQ JRC 数据的 CQ 应用程序,请参阅这篇文章:
http://scottsdigitalcommunity.blogspot.ca/2013/02/querying-adobe-experience-manager-data.html
这提供了一个分步指南,并引导您完成整个过程 - 包括使用 Maven 构建 OSGi 包。
从上面的评论 - 我看到对 BND 文件的引用。您应该远离 CRXDE 来创建 OSGi 并使用 Maven。