私はAdobe cq5を初めて使用します。多くのオンライン ブログやチュートリアルを調べましたが、多くは得られませんでした。JCRでデータを保存および取得できるAdobe cq5アプリケーションの例と詳細な説明を提供できますか?
前もって感謝します。
CQ JRC からのデータを保存およびクエリできる CQ アプリケーションの作成方法については、次の記事を参照してください。
http://scottsdigitalcommunity.blogspot.ca/2013/02/querying-adobe-experience-manager-data.html
これはステップバイステップのガイドを提供し、Maven を使用した OSGi バンドルの構築を含むプロセス全体を順を追って説明します。
上記のコメントから - BND ファイルへの参照が表示されます。OSGi を作成して Maven を使用するには、CRXDE を使用しないでください。
以下は、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()
。2 つの方法は、大まかな補完にすぎません。セッターは文字列を受け取りますが、ゲッターはさまざまな情報を含む NodeType を返します。
このコードの元のバージョンでは、静的文字列 "Lorem ipsum..." を使用するだけでなく、挿入するテキストをファイルから読み取ります。
この例に取り組んだら、Abobe のドキュメントを使用して、CRX からデータを読み取るコードを記述できるはずです。