完全な機能を備えた web サイトの作成(JSP) create-a-fully-featured-website-jsp
このチュートリアルでは、AEM で完全な機能を備えた web サイトを作成できます。Web サイトは汎用の web サイトに基づき、主に web 開発者をターゲットにしています。すべての開発は、1 つのオーサー環境内で行われます。
このチュートリアルでは、次の方法について説明します。
-
AEM をインストールします。
-
CRXDE Lite(開発環境)にアクセスします。
-
CRXDE Lite でプロジェクトの構造を設定します。
-
コンテンツページを作成する際の基礎として使用するテンプレート、コンポーネントおよびスクリプトを作成します。
-
Web サイトのルートページを作成し、次にコンテンツページを作成します。
-
ページで使用する以下のコンポーネントを作成します。
- 上部ナビゲーション
- リストの子
- Logo(ロゴ)
- 画像
- テキスト画像
- 検索
-
様々な基盤コンポーネントを含めます。
すべての手順を実行すると、ページは次のようになります。
最終結果をダウンロード
演習を実行する代わりにチュートリアルに従うには、website-1.0.zip をダウンロードします。このファイルは、このチュートリアルの結果を含む AEM コンテンツパッケージです。パッケージマネージャーを使用して、パッケージをオーサーインスタンスにインストールします。
メモ: このパッケージをインストールすると、このチュートリアルを使用して作成したオーサーインスタンス上のリソースがすべて上書きされます。
Web サイトコンテンツパッケージ
Adobe Experience Manager のインストール installing-adobe-experience-manager
Web サイトを開発するための AEM インスタンスをインストールするには、オーサーインスタンスとパブリッシュインスタンスを含むデプロイメント環境の設定手順に従うか、または汎用インストールを実行します。汎用インストールでは、AEM クイックスタート JAR ファイルをダウンロードし、license.properties ファイルを JAR ファイルと同じディレクトリに配置して、JAR ファイルをダブルクリックします。
AEM をインストールしたら、ようこそページで CRXDE Lite のリンクをクリックして CRXDE Lite 開発環境にアクセスします。
CRXDE Lite でプロジェクトの構造を設定します。 setting-up-the-project-structure-in-crxde-lite
CRXDE Lite を使用して、リポジトリ内に mywebsite アプリケーション構造を作成します。
-
CRXDE Liteの左側のツリーで、
/apps
フォルダーを右クリックし、作成/作成/フォルダー をクリックします。フォルダーを作成 ダイアログで、フォルダー名としてmywebsite
と入力し、「OK」をクリックします。 -
/apps/mywebsite
フォルダーを右クリックして、作成/フォルダーを作成 をクリックします。フォルダーを作成 ダイアログで、フォルダー名としてcomponents
と入力し、「OK」をクリックします。 -
/apps/mywebsite
フォルダーを右クリックして、作成/フォルダーを作成 をクリックします。フォルダーを作成 ダイアログで、フォルダー名としてtemplates
と入力し、「OK」をクリックします。ツリー内の構造は次のようになります。
-
「すべて保存」をクリックします。
デザインの設定 setting-up-the-design
この節では、Designer ツールを使用して、アプリケーションのデザインを作成します。デザインは、web サイトに CSS および画像リソースを提供します。
サンプルの static.css ファイルおよび画像
-
AEM のようこそ画面で、「ツール」をクリックします。(https://localhost:4502/libs/cq/core/content/welcome.html)
-
フォルダーツリーで、Designs フォルダーを選択して、新規/新しいページ をクリックします。タイトルとして
mywebsite
と入力し、「作成」をクリックします。 -
mywebsite という項目がテーブルに表示されない場合は、ツリーまたはテーブルを更新します。
-
https://localhost:4502 の URL への WebDAV アクセスを使用して、サンプルの
static.css
ファイルとimages
フォルダーを、ダウンロードした mywebsite.zip ファイルから/etc/designs/mywebsite
フォルダーにコピーします。
contentpage テンプレート、コンポーネントおよびスクリプトの作成 creating-the-contentpage-template-component-and-script
この節では、次を作成します。
- サンプル web サイト内のコンテンツページの作成に使用される contentpage テンプレート
- コンテンツのページをレンダリングするために使用される contentpage コンポーネント
- contentpage スクリプト
contentpage テンプレートの作成 creating-the-contentpage-template
サイトの web ページの基礎として使用するテンプレートを作成します。
テンプレートは、新しいページのデフォルトコンテンツを定義します。複雑な web サイトでは、サイト内の様々なタイプのページを作成するために、複数のテンプレートを使用する場合があります。この演習では、すべてのページを 1 つのシンプルなテンプレートに基づいて作成します。
-
CRXDE Lite のフォルダーツリーで、
/apps/mywebsite/templates
を右クリックして、作成/テンプレートを作成 をクリックします。 -
テンプレートを作成ダイアログで、次の値を入力して「次へ」をクリックします。
- ラベル:contentpage
- タイトル:マイ web サイトのコンテンツページコンポーネント
- 説明:マイ web サイトのコンテンツページコンポーネントです。
- リソースタイプ: mywebsite/components/contentpage
「ランキング」プロパティにはデフォルト値を使用します。
リソースタイプは、ページをレンダリングするコンポーネントを識別します。この場合、contentpage テンプレートを使用して作成されたページはすべて
mywebsite/components/contentpage
コンポーネントによってレンダリングされます。 -
このテンプレートを使用できるページのパスを指定するには、プラス記号のボタンをクリックして、表示されるテキストボックスに
/content(/.*)?
と入力します。次に、「次へ」をクリックします。許可されているパスプロパティの値は 正規表現です。 この正規表現に一致するパスを含むページがテンプレートを使用できます。この場合、正規表現は、/content フォルダーおよびすべてのサブページのパスと一致します。
作成者が /content の下にページを作成すると、使用可能なテンプレートのリストに contentpage テンプレートが表示されます。
-
許可された親 パネルおよび 許可されている子 パネルで「次へ」をクリックして、「OK」をクリックします。CRXDE Lite で、「すべて保存」をクリックします。
contentpage コンポーネントの作成 creating-the-contentpage-component
コンテンツを定義し、contentpage テンプレートを使用するコンポーネントを作成します 。 コンポーネントの場所は、contentpage テンプレートの「リソースタイプ」プロパティの値と一致する必要があります。
-
CRXDE Lite で、
/apps/mywebsite/components
を右クリックして、作成/コンポーネント をクリックします。 -
コンポーネントを作成 ダイアログで、以下のプロパティ値を入力します。
- ラベル:contentpage
- タイトル:マイ web サイトのコンテンツページコンポーネント
- 説明:マイ web サイトのコンテンツページコンポーネントです
新しいコンポーネントの場所は
/apps/mywebsite/components/contentpage
です。このパスは、contentpage テンプレートのリソースタイプ(パスの最初の/apps/
部分を除く)に対応します。この一致は、テンプレートをコンポーネントと結び付けるものなので、Web サイトを正常に機能させるために重要です。
-
「次へ」をクリックしてダイアログの許可されている子パネルを表示し、「OK」をクリックします。CRXDE Lite で、「すべて保存」をクリックします。
この時点で構造は次のようになります。
contentpage コンポーネントスクリプトの開発 developing-the-contentpage-component-script
contentpage.jsp スクリプトにコードを追加して、ページのコンテンツを定義します。
-
CRXDE Liteで、
/apps/mywebsite/components/contentpage
にあるファイルcontentpage.jsp
を開きます。ファイルには、デフォルトで次のコードが含まれています。code language-java <%-- My Website Content Page Component component. This is My Website Content Page Component. --%><% %><%@include file="/libs/foundation/global.jsp"%><% %><%@page session="false" %><% %><% /* TODO add you code here */ %>
-
以下のコードをコピーして、contentpage.jsp のデフォルトコードの後に貼り付けます。
code language-java <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>My title</title> </head> <body> <div>My body</div> </body> </html>
-
「すべて保存」をクリックして変更を保存します。
Web サイトページおよびコンテンツページの作成 creating-your-website-page-and-content-pages
ここでは、すべて contentpage テンプレートを使用する、My Website、English、Products、Services、Customers の各ページを作成します。
-
AEM のようこそページ(https://localhost:4502/libs/cq/core/content/welcome.html)で、「web サイト」をクリックします。
-
フォルダーツリーで、Websites フォルダーを選択して、新規/新しいページ をクリックします。
-
ページを作成 ウィンドウで、以下を入力します。
- タイトル:
My Website
- 名前:
mywebsite
My Website Content Page Template
- タイトル:
-
「作成」をクリックします。フォルダーツリーで、/Websites/My Website/ ページを選択して、新規/新しいページ をクリックします。
-
ページを作成ダイアログで、以下のプロパティ値を入力して「作成」をクリックします。
- タイトル:English
- 名前:en
- 「My Website Content Page Template」を選択します。
-
フォルダーツリーで、/Websites/My Website/English ページを選択して、新規/新しいページ をクリックします。
-
ページを作成 ダイアログで、以下のプロパティ値を入力して「作成」をクリックします。
- タイトル:Products
- 「My Website Content Page Template」を選択します。
-
フォルダーツリーで、/Websites/My Website/English ページを選択して、新規/新しいページ をクリックします。
-
ページを作成 ダイアログで、以下のプロパティ値を入力して「作成」をクリックします。
- タイトル:Services
- 「My Website Content Page Template」を選択します。
-
フォルダーツリーで、/Websites/My Website/English ページを選択して、新規/新しいページ をクリックします。
-
ページを作成 ダイアログで、以下のプロパティ値を入力して「作成」をクリックします。
- タイトル:Customers
- 「My Website Content Page Template」を選択します。
構造は次のようになります。
-
ページを mywebsite デザインにリンクさせるには、CRXDE Liteで、
/content/mywebsite/en/jcr:content
ノードを選択します。「プロパティ」タブで、新しいプロパティに次の値を入力し、「追加」をクリックします。- 名前:cq:designPath
- タイプ:String
- 値:/etc/designs/mywebsite
-
Web ブラウザーの新しいタブまたはウィンドウで、https://localhost:4502/content/mywebsite/jp/products.html を開いて Products ページを確認します。
contentpage スクリプトの拡張 enhancing-the-contentpage-script
この節では、AEM 基盤コンポーネントスクリプトを使用し、独自のスクリプトを記述することで、contentpage スクリプトを拡張する方法について説明します。
完了したら、製品 ページは次のようになります。
基盤ページスクリプトの使用 using-the-foundation-page-scripts
この演習では、スーパータイプが AEM のページコンポーネントとなるように pagecontent コンポーネントを設定します。コンポーネントはスーパータイプの機能を継承するので、pagecontent はページコンポーネントのスクリプトとプロパティを継承します。
例えば、自分のコンポーネントの JSP コード内で、スーパータイプコンポーネントによって提供されているスクリプトを、自分のコンポーネントに含まれているかのように参照できます。
-
CRXDE Lite で、
/apps/mywebsite/components/contentpage
ノードにプロパティを追加します。-
/apps/mywebsite/components/contentpage
ノードを選択します。 -
「プロパティ」タブの下部で、以下のプロパティ値を入力して「追加」をクリックします。
- 名前: sling:resourceSuperType
- タイプ: String
- 値: foundation/components/page
-
「すべて保存」をクリックします。
-
-
/apps/mywebsite/components/contentpage
の下のcontentpage.jsp
ファイルを開いて、既存のコードを以下のコードに置換します。code language-xml <%@include file="/libs/foundation/global.jsp"%><% %><%@page session="false" contentType="text/html; charset=utf-8" %><% %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "https://www.w3.org/TR/html4/strict.dtd"> <html> <cq:include script="head.jsp"/> <cq:include script="body.jsp"/> </html>
-
変更を保存します。
-
ブラウザーで製品ページをリロードします。次のようなコンソールが表示されます。
ページソースを開いて、head.jsp および body.jsp スクリプトで生成された JavaScript 要素と HTML 要素を確認します。次のスクリプトスニペットは、ページを開く際にサイドキックを開きます。
code language-java CQ.WCM.launchSidekick("/content/mywebsite/en/products", {propsDialog: "/libs/foundation/components/page/dialog", locked: false locked: false });
独自のスクリプトの使用 using-your-own-scripts
この節では、ページ本文の一部を生成する複数のスクリプトを作成します。次に、pagecontent コンポーネントに body.jsp ファイルを作成して、AEM ページコンポーネントの body.jsp を上書きします。body.jsp ファイルに、ページ本文の様々な部分を生成するスクリプトを含めます。
ヒント: コンポーネントのスーパータイプ内のファイルと同じ名前で相対的な場所も同じファイルがコンポーネントに含まれている場合、これをオーバーレイと呼びます 。
-
CRXDE Lite で、
/apps/mywebsite/components/contentpage
の下にleft.jsp
ファイルを作成します。-
/apps/mywebsite/components/contentpage
ノードを右クリックして、「作成」を選択し、「ファイルを作成」を選択します。 -
ウィンドウで「名前」に
left.jsp
と入力して、「OK」をクリックします。
-
-
left.jsp
ファイルを編集して、既存のコンテンツを削除し、以下のコードに置き換えます。code language-java <%@include file="/libs/foundation/global.jsp"%><% %><div class="left"> <div>logo</div> <div>newslist</div> <div>search</div> </div>
-
変更内容を保存します。
-
CRXDE Lite で、
/apps/mywebsite/components/contentpage
の下にcenter.jsp
ファイルを作成します。-
/apps/mywebsite/components/contentpage
ノードを右クリックして、作成/ファイルを作成 を選択します。 -
ダイアログボックスで、「
center.jsp
名前 」に と入力して、「OK」をクリックします。
-
-
center.jsp
ファイルを編集して、既存のコンテンツを削除し、以下のコードに置換します。code language-java <%@include file="/libs/foundation/global.jsp"%><% %><div class="center"> <div>trail</div> <div>title</div> <div>parsys</div> </div>
-
変更内容を保存します。
-
CRXDE Lite で、
/apps/mywebsite/components/contentpage
の下にright.jsp
ファイルを作成します。-
/apps/mywebsite/components/contentpage
ノードを右クリックして、作成/ファイルを作成 を選択します。 -
ダイアログボックスで、「
right.jsp
名前 」に と入力して、「OK」をクリックします。
-
-
right.jsp
ファイルを編集して、既存のコンテンツを削除し、以下のコードに置き換えます。code language-java <%@include file="/libs/foundation/global.jsp"%><% %><div class="right"> <div>iparsys</div> </div>
-
変更内容を保存します。
-
CRXDE Lite で、
/apps/mywebsite/components/contentpage
の下にbody.jsp
ファイルを作成します。 -
body.jsp
ファイルを編集して、既存のコンテンツを削除し、以下のコードに置き換えます。code language-java <%@include file="/libs/foundation/global.jsp"%><% %><body> <div id="CQ"> <div class="topnav">topnav</div> <div class="content"> <cq:include script="left.jsp" /> <cq:include script="center.jsp" /> <cq:include script="right.jsp" /> </div> <div class="footer"> <div class="toolbar">toolbar</div> </div> </div> </body>
-
変更を保存します。
-
ブラウザーで製品ページをリロードします。次のようなコンソールが表示されます。
上部ナビゲーションコンポーネントの作成 creating-the-top-navigation-component
この節では、ナビゲーションを容易にするために、web サイトのすべてのトップレベルページへのリンクを表示するコンポーネントを作成します。このコンポーネントのコンテンツは、contentpage テンプレートを使用して作成されるすべてのページの上部に表示されます。
上部ナビゲーションコンポーネント(topnav)の最初のバージョンでは、ナビゲーション項目はテキストリンクのみです。2 つ目のバージョンでは、画像ナビゲーションリンクを含む topnav を実装します。
完了したら、上部ナビゲーションは次のようになります。
上部ナビゲーションコンポーネントの作成 creating-the-top-navigation-component-1
-
CRXDE Lite で
/apps/mywebsite/components
を右クリックして、作成/コンポーネントを作成 をクリックします。 -
コンポーネントを作成 ウィンドウで、以下を入力します。
-
ラベル:
topnav
-
タイトル:
My Top Navigation Component
-
説明:
This is My Top Navigation Component
-
-
最後のウィンドウまで「次へ」をクリックしたら、「OK」をクリックします。変更を保存します。
テキストリンクを含む上部ナビゲーションスクリプトの作成 creating-the-top-navigation-script-with-textual-links
topnav にレンダリングスクリプトを追加して、子ページへのテキストリンクを生成します。
-
CRXDE Lite で、
/apps/mywebsite/components/topnav
の下のtopnav.jsp
ファイルを開きます。 -
次のコードをコピーと貼り付けし、そこにあるコードを置き換えます。
code language-xml <%@include file="/libs/foundation/global.jsp"%><% %><%@ page import="java.util.Iterator, com.day.text.Text, com.day.cq.wcm.api.PageFilter, com.day.cq.wcm.api.Page" %><% /* get starting point of navigation */ Page navRootPage = currentPage.getAbsoluteParent(2); if (navRootPage == null && currentPage != null) { navRootPage = currentPage; } if (navRootPage != null) { Iterator<Page> children = navRootPage.listChildren(new PageFilter(request)); while (children.hasNext()) { Page child = children.next(); %><a href="<%= child.getPath() %>.html"><%=child.getTitle() %></a><% } } %>
contentpage コンポーネントへの上部ナビゲーションの追加 including-top-navigation-in-the-contentpage-component
topnav を contentpage コンポーネントに含めるには、次の操作を行います。
-
CRXDE Lite で、
/apps/mywebsite/components/contentpage
の下のbody.jsp
ファイルを開いて、code language-xml <div class="topnav">topnav</div>
以下に置き換えます。
code language-xml <cq:include path="topnav" resourceType="mywebsite/components/topnav" />
-
変更を保存します。
-
ブラウザーで製品ページをリロードします。上部ナビゲーションは次のように表示されます。
サブタイトル付きのページの強化 enhancing-pages-with-subtitles
ページコンポーネントでは、ページのキャプションを指定できるプロパティを定義します。ページコンテンツに関する情報を提供するキャプションを追加します。
-
ブラウザーで、製品 ページを開きます。
-
サイドキックの「ページ」タブで、「ページのプロパティ」をクリックします。
-
ダイアログの「基本」タブで「他のタイトルと説明」を展開して、「サブタイトル」プロパティに「私たちの活動」と入力します。「OK」をクリックします。
-
ここまでの手順を繰り返して、「私たちのサービス」というサブタイトルを サービス ページに追加します。
-
ここまでの手順を繰り返して、「私たちが得た信頼」というサブタイトルを 顧客 ページに追加します。
ヒント: CRXDE Lite で、/content/mywebsite/en/products/jcr:content ノードを選択し、サブタイトルのプロパティが追加されたことを確認します。
画像リンクを使用して上部ナビゲーションを強化する enhance-top-navigation-by-using-image-links
topnav コンポーネントのレンダリングスクリプトを強化して、ナビゲーションコントロールにハイパーテキストの代わりに画像リンクを使用します。画像には、リンクターゲットのタイトルとサブタイトルが含まれます。
この演習では、Sling のリクエスト処理を示します。topnav.jsp スクリプトを変更して、ページナビゲーションリンクに使用する画像を動的に生成するスクリプトを呼び出します。この演習では、Sling は画像ソースファイルの URL を解析し、画像のレンダリングに使用するスクリプトを決定します。
例えば、製品ページへの画像リンクのソースは、https://localhost:4502/content/mywebsite/jp/products.navimage.png になります。Sling は、この URL を解析して、リソースタイプと、リソースをレンダリングするために使用するスクリプトを決定します。
-
Sling がリソースのパスを
/content/mwebysite/en/products.png.
と特定します。 -
Sling がこのパスを
/content/mywebsite/en/products
ノードと照合します。 -
Sling がこのノードの
sling:resourceType
をmywebsite/components/contentpage
と特定します。 -
Sling が、このコンポーネント内で、URL セレクター(
navimage
)およびファイル名拡張子(png
)に最も一致するスクリプトを見つけます。
この演習では、Sling はこれらの URL を、ユーザーが作成する /apps/mywebsite/components/contentpage/navimage.png.java スクリプトと照合します。
-
CRXDE Lite で、
/apps/mywebsite/components/topnav.
の下のtopnav.jsp
を開きます。アンカー要素(14 行目)のコンテンツを見つけます。code language-xml <%=child.getTitle() %>
-
アンカーコンテンツを次のコードに置き換えます。
code language-xml <img alt="<%= child.getTitle() %>" src="<%= child.getPath() %>.navimage.png">
-
変更内容を保存します。
-
/apps/mywebsite/components/contentpage
ノードを右クリックして、作成/ファイルを作成 をクリックします。 -
ファイルを作成 ウィンドウで、「名前」に
navimage.png.java
と入力します。.java というファイル名の拡張子は、Apache Sling Scripting Java™ Support を使用してスクリプトをコンパイルし、サーブレットを作成する必要があることを Sling に示しています。
-
以下のコードを
navimage.png.java.
にコピーします。このコードによって、AbstractImageServlet クラスが拡張されます。- AbstractImageServlet は、現在のリソースのプロパティを格納する ImageContext オブジェクトを作成します。
- リソースの親ページは、ImageContext オブジェクトから抽出されます。次に、ページタイトルとサブタイトルが取得されます。
- ImageHelper は、サイトデザインの navimage_bg.jpg ファイル、ページタイトルおよびページサブタイトルから画像を生成するために使用されます。
code language-java package apps.mywebsite.components.contentpage; import java.awt.Color; import java.awt.Paint; import java.awt.geom.Rectangle2D; import java.io.IOException; import javax.jcr.RepositoryException; import com.day.cq.wcm.api.Page; import com.day.cq.wcm.api.PageManager; import com.day.cq.wcm.api.components.Component; import com.day.cq.wcm.api.designer.Designer; import com.day.cq.commons.SlingRepositoryException; import com.day.cq.wcm.commons.WCMUtils; import com.day.cq.wcm.commons.AbstractImageServlet; import com.day.cq.commons.ImageHelper; import com.day.image.Font; import com.day.image.Layer; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; /** * Renders the navigation image */ public class navimage_png extends AbstractImageServlet { protected Layer createLayer(ImageContext ctx) throws RepositoryException, IOException { PageManager pageManager = ctx.resolver.adaptTo(PageManager.class); Page currentPage = pageManager.getContainingPage(ctx.resource); /* constants for image appearance */ int scale = 6; int paddingX = 24; int paddingY = 24; Color bgColor = new Color(0x004a565c, true); /* obtain the page title */ String title = currentPage.getTitle(); if (title == null) { title = currentPage.getName(); } /* format the title text */ title = title.toUpperCase(); Paint titleColor = Color.WHITE; Font titleFont = new Font("Myriad Pro", 10 * scale, Font.BOLD); int titleBase = 10 * scale; /* obtain and format the page subtitle */ String subtitle = currentPage.getProperties().get("subtitle", ""); Paint subtitleColor = new Color(0xffa9afb1, true); Font subTitleFont = new Font("Tahoma", 7); int subTitleBase = 20; /* create a layer that contains the background image from the mywebsite design */ Designer dg = ctx.resolver.adaptTo(Designer.class); String imgPath = new String(dg.getDesignPath(currentPage)+"/images/navimage_bg.jpg"); Layer bg = ImageHelper.createLayer(ctx.resolver.resolve(imgPath)); /* draw the title text (4 times bigger) */ Rectangle2D titleExtent = titleFont.getTextExtent(0, 0, 0, 0, title, Font.ALIGN_LEFT, 0, 0); Rectangle2D subtitleExtent = subTitleFont.getTextExtent(0, 0, 0, 0, subtitle, Font.ALIGN_LEFT, 0, 0); /* ensure subtitleExtent is wide enough */ if ( subtitle.length() > 0 ) { int titleWidth = (int)titleExtent.getWidth() / scale; if ( subtitleExtent.getWidth() > titleWidth && subtitleExtent.getWidth() + 2 * paddingX > bg.getWidth() ) { int charWidth = (int)subtitleExtent.getWidth() / subtitle.length(); int maxWidth = (bg.getWidth() > titleWidth + 2 * paddingX ? bg.getWidth() - 2 * paddingX : titleWidth); int len = (maxWidth - ( 2 * charWidth) ) / charWidth; subtitle = subtitle.substring(0, len) + "..."; subtitleExtent = subTitleFont.getTextExtent(0, 0, 0, 0, subtitle, Font.ALIGN_LEFT, 0, 0); } } int width = Math.max((int) titleExtent.getWidth(), (int) subtitleExtent.getWidth()); /* create the text layer */ Layer text = new Layer(width, (int) titleExtent.getHeight() + 40, new Color(0x01ffffff, true)); text.setPaint(titleColor); text.drawText(0, titleBase, 0, 0, title, titleFont, Font.ALIGN_LEFT | Font.ALIGN_BASE, 0, 0); text.resize(text.getWidth() / scale, text.getHeight() / scale); text.setX(0); text.setY(0); if (subtitle.length() > 0) { /* draw the subtitle normal sized */ text.setPaint(subtitleColor); text.drawText(0, subTitleBase, 0, 0, subtitle, subTitleFont, Font.ALIGN_LEFT | Font.ALIGN_BASE, 0, 0); } /* merge the image and text layers */ text.setY(paddingY); text.setX(paddingX); text.setBackgroundColor(bgColor); int bgWidth = bg.getWidth(); if ( text.getWidth() + 2 * paddingX > bgWidth ) { bgWidth = text.getWidth() + 2 * paddingX; bg.resize(bgWidth, bg.getHeight()); } bg.merge(text); return bg; } }
-
変更を保存します。
-
ブラウザーで製品ページをリロードします。上部ナビゲーションは次のように表示されます。
リストの子コンポーネントの作成 creating-the-list-children-component
ページのタイトル、説明、日付(製品ページなど)を含むページリンクのリストを生成する listchildren コンポーネントを作成します。リンクは、現在のページの子ページ、またはコンポーネントダイアログで指定されたルートページをターゲットとします。
製品ページの作成 creating-product-pages
製品ページの下に 2 つのページを作成します。2 つの特定の製品について説明する各ページに、タイトル、説明および日付を設定します。
-
Web サイトページのフォルダーツリーで、Websites/My Website/English/Products 項目を選択し、新規/新しいページをクリックします。
-
ダイアログで、次のプロパティ値を入力して「作成」をクリックします。
- タイトル:Product 1
- 名前:product1
- 「マイ web サイトコンテンツページテンプレート」を選択します。
-
次のプロパティ値を使用して、Products の下に別のページを作成します。
- タイトル:Product 2
- 名前:product2
- 「マイ web サイトコンテンツページテンプレート」を選択します。
-
CRXDE Lite で、Product 1 ページの説明と日付を設定します。
-
/content/mywebsite/en/products/product1/jcr:content
ノードを選択します。 -
「プロパティ」タブで、以下の値を入力します。
- 名前:
jcr:description
- タイプ:
String
- 値:
This is a description of the Product 1!.
- 名前:
-
「追加」をクリックします。
-
「プロパティ」タブで、次の値を使用して別のプロパティを作成します。
- 名前:date
- タイプ:String
- 値:02/14/2008
- 「追加」をクリックします。
-
「すべて保存」をクリックします。
-
-
CRXDE Lite で、Product 2 ページの説明と日付を設定します。
-
/content/mywebsite/jp/products/product2/jcr:content ノードを選択します。
-
「プロパティ」タブで、以下の値を入力します。
- 名前:jcr:description
- タイプ:String
- 値:商品 2 の説明です。
-
「追加」をクリックします。
-
同じテキストボックスで、以前の値を次の値に置き換えます。
- 名前:date
- タイプ:String
- 値:05/11/2012
- 「追加」をクリックします。
-
「すべて保存」をクリックします。
-
リストの子コンポーネントの作成 creating-the-list-children-component-1
listchildren コンポーネントを作成するには、次の操作を実行します。
-
CRXDE Lite で
/apps/mywebsite/components
を右クリックして、作成/コンポーネントを作成 をクリックします。 -
ダイアログで、次のプロパティ値を入力して「次へ」をクリックします。
- ラベル:listchildren
- タイトル:自分の Listchildren コンポーネント
- 説明:これは自分の Listchildren コンポーネントです。
-
「次へ」を数回クリックして許可されている子パネルを表示し、「OK」をクリックします。
リストの子スクリプトの作成 creating-the-list-children-script
listchildren コンポーネントのスクリプトを開発します。
-
CRXDE Lite で、
/apps/mywebsite/components/listchildren
の下のlistchildren.jsp
ファイルを開きます。 -
デフォルトのコードを次のコードに置き換えます。
code language-xml <%@include file="/libs/foundation/global.jsp"%><% %><%@ page import="java.util.Iterator, com.day.cq.wcm.api.PageFilter"%><% /* Create a Page object using the path of the current page */ String listroot = properties.get("listroot", currentPage.getPath()); Page rootPage = pageManager.getPage(listroot); /* iterate through the child pages and gather properties */ if (rootPage != null) { Iterator<Page> children = rootPage.listChildren(new PageFilter(request)); while (children.hasNext()) { Page child = children.next(); String title = child.getTitle() == null ? child.getName() : child.getTitle(); String date = child.getProperties().get("date",""); %><div class="item"> <a href="<%= child.getPath() %>.html"><b><%= title %></b></a> <span><%= date %></code><br> <%= child.getProperties().get("jcr:description","") %><br> </div><% } } %>
-
変更内容を保存します。
リストの子ダイアログの作成 creating-the-list-children-dialog
listchildren コンポーネントのプロパティの設定に使用するダイアログを作成します。
-
listchildren コンポーネントの下に dialog ノードを作成します。
-
CRXDE Lite で
/apps/mywebsite/components/listchildren
ノードを右クリックして、作成/ダイアログを作成 をクリックします。 -
ダイアログで、以下のプロパティ値を入力して「OK」をクリックします。
-
ラベル:
dialog
-
タイトル:
Edit Component
を行い、「OK」をクリックします。
-
次のようにプロパティを定義します。
-
-
/apps/mywebsite/components/listchildren/dialog/items/items/tab1
ノードを選択します。 -
「プロパティ」タブで、タイトル プロパティの値を
List Children
に変更します。 -
tab1 ノードを選択し、作成/ノードを作成をクリックし、次のプロパティ値を入力して、「OK」をクリックします。
- 名前:items
- タイプ:cq:WidgetCollection
-
次のプロパティ値を使用して、items ノードの下にノードを作成します。
- 名前:listroot
- タイプ:cq:Widget
-
listroot ノードのプロパティを追加して、テキストフィールドとして設定します。以下の表の行は、それぞれプロパティを表します。完了したら、「すべて保存」をクリックします。
table 0-row-3 1-row-3 2-row-3 3-row-3 名前 タイプ 値 fieldLabel 文字列 リストルートのパス name 文字列 。/listroot xtype 文字列 textfield
contentpage コンポーネントへのリストの子の追加 including-list-children-in-the-contentpage-component
contentpage コンポーネントに listchildren コンポーネントを組み込むには、次の手順に従います。
-
CRXDE Lite で
/apps/mywebsite/components/contentpage
の下のleft.jsp
ファイルを開いて、以下のコードを見つけます(4 行目)。code language-xml <div>newslist</div>
-
そのコードを次のコードに置き換えます。
code language-xml <cq:include path="newslist" resourceType="mywebsite/components/listchildren" />
-
変更内容を保存します。
ページ内のリストの子の表示 viewing-list-children-in-a-page
このコンポーネントの完全な操作を確認するには、製品ページを表示します。
- 親ページ(「リストルートのパス」)が定義されていない場合。
- 親ページ(「リストルートのパス」)が定義されている場合。
-
ブラウザーで製品ページをリロードします。listchildren コンポーネントは次のように表示されます。
-
-
「リストルートのパス」に、
/content/mywebsite/en
と入力します。「OK」をクリックします。ページ上の listchildren コンポーネントは次のようになります。
ロゴコンポーネントの作成 creating-the-logo-component
会社のロゴを表示し、サイトのホームページへのリンクを提供するコンポーネントを作成します。コンポーネントにはデザインモードのダイアログが含まれ、プロパティの値はサイトデザイン(/etc/designs/mywebsite)に格納されます。
- プロパティの値は、デザインを使用するページに追加されるコンポーネントのすべてのインスタンスに適用されます。
- プロパティは、デザインを使用するページ上にある任意のコンポーネントのインスタンスを使用して設定できます。
デザインモードダイアログには、画像とリンクパスを設定するためのプロパティが含まれています。ロゴコンポーネントは、web サイトのすべてのページの左上に配置されます。
完了したら、次のようになります。
/libs/foundation/components/logo
)を提供します。ロゴコンポーネントノードの作成 creating-the-logo-component-node
ロゴコンポーネントを作成するには、次の手順に従います。
-
CRXDE Lite で、/apps/mywebsite/components を右クリックして、作成/コンポーネントを作成 をクリックします。
-
コンポーネントを作成ダイアログで、以下のプロパティ値を入力して「次へ」をクリックします。
- ラベル:
logo
. - タイトル:
My Logo Component
. - 説明:
This is My Logo Component
.
- ラベル:
-
ダイアログの最後のパネルにまで「次へ」をクリックして、「OK」をクリックします。
ロゴスクリプトの作成 creating-the-logo-script
この節では、ホームページへのリンクを含むロゴ画像を表示するスクリプトを作成する方法について説明します。
-
CRXDE Lite で、
/apps/mywebsite/components/logo
の下のlogo.jsp
ファイルを開きます。 -
以下のコードでは、サイトのホームページへのリンクが作成され、ロゴイメージへの参照が追加されます。このコードを
logo.jsp
にコピーします。code language-xml <%@include file="/libs/foundation/global.jsp"%><% %><%@ page import="com.day.text.Text, com.day.cq.wcm.foundation.Image, com.day.cq.commons.Doctype" %><% /* obtain the path for home */ long absParent = currentStyle.get("absParent", 2L); String home = Text.getAbsoluteParent(currentPage.getPath(), (int) absParent); /* obtain the image */ Resource res = currentStyle.getDefiningResource("imageReference"); if (res == null) { res = currentStyle.getDefiningResource("image"); } /* if no image use text link, otherwise draw the image */ %> <a href="<%= home %>.html"><% if (res == null) { %>Home<% } else { Image img = new Image(res); img.setItemName(Image.NN_FILE, "image"); img.setItemName(Image.PN_REFERENCE, "imageReference"); img.setSelector("img"); img.setDoctype(Doctype.fromRequest(request)); img.setAlt("Home"); img.draw(out); } %></a>
-
変更内容を保存します。
ロゴデザインダイアログの作成 creating-the-logo-design-dialog
デザインモードでロゴコンポーネントを設定するためのダイアログを作成します。デザインモードのダイアログには、design_dialog
という名前を付ける必要があります。
-
logo コンポーネントの下に dialog ノードを作成します。
-
/apps/mywebsite/components/logo
ノードを右クリックして、作成/ダイアログを作成 をクリックします。 -
以下のプロパティ値を入力して「OK」をクリックします。
-
ラベル:
design_dialog
-
タイトル:
Logo (Design)
-
-
-
design_dialog ブランチの tab1 ノードを右クリックして「削除」をクリックします。「すべて保存」をクリックします。
-
design_dialog/items/items
ノードの下に、cq:Widget
タイプのimg
という名前のノードを作成します。次のプロパティを追加し、「すべて保存」をクリックします。table 0-row-3 1-row-3 2-row-3 3-row-3 4-row-3 5-row-3 名前 タイプ 値 fileNameParameter 文字列 。/imageName fileReferenceParameter 文字列 。/imageReference name 文字列 。/画像 title String 画像 xtype 文字列 html5smartimage
ロゴレンダリングスクリプトの作成 creating-the-logo-render-script
ロゴイメージを取得してページに書き込むスクリプトを作成します。
- ロゴコンポーネントノードを右クリックし、作成/ファイルを作成をクリックして、img.GET.java という名前のスクリプトファイルを作成します。
- ファイルを開き、次のコードをファイルにコピーして、「すべて保存」をクリックします。
package apps.mywebsite.components.logo;
import java.io.IOException;
import java.io.InputStream;
import javax.jcr.RepositoryException;
import javax.jcr.Property;
import javax.servlet.http.HttpServletResponse;
import com.day.cq.wcm.foundation.Image;
import com.day.cq.wcm.commons.RequestHelper;
import com.day.cq.wcm.commons.WCMUtils;
import com.day.cq.wcm.commons.AbstractImageServlet;
import com.day.cq.commons.SlingRepositoryException;
import com.day.image.Layer;
import org.apache.commons.io.IOUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
/**
* Renders an image
*/
public class img_GET extends AbstractImageServlet {
protected Layer createLayer(ImageContext c)
throws RepositoryException, IOException {
/* do not create the layer yet. handle everything later */
return null;
}
protected void writeLayer(SlingHttpServletRequest req,
SlingHttpServletResponse resp,
ImageContext c, Layer layer)
throws IOException, RepositoryException {
Image image = new Image(c.resource);
image.setItemName(Image.NN_FILE, "image");
image.setItemName(Image.PN_REFERENCE, "imageReference");
if (!image.hasContent()) {
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
/* get pure layer */
layer = image.getLayer(false, false, false);
/* do not re-encode layer, just spool */
Property data = image.getData();
InputStream in = data.getStream();
resp.setContentLength((int) data.getLength());
String contentType = image.getMimeType();
if (contentType.equals("application/octet-stream")) {
contentType=c.requestImageType;
}
resp.setContentType(contentType);
IOUtils.copy(in, resp.getOutputStream());
in.close();
resp.flushBuffer();
}
}
contentpage コンポーネントへのロゴコンポーネントの追加 adding-the-logo-component-to-the-contentpage-component
-
CRXDE Liteで
/apps/mywebsite/components/contentpage file
の下にあるleft.jsp
を開き、次のコード行を探します。code language-xml <div>logo</div>
-
そのコードを次のコード行に置き換えます。
code language-xml <cq:include path="logo" resourceType="mywebsite/components/logo" />
-
変更を保存します。
-
ブラウザーで製品ページをリロードします。ロゴは以下のようになりますが、現時点では基になるリンクのみが表示されます。
ページ内でのロゴ画像の設定 setting-the-logo-image-in-a-page
この節では、デザインモードダイアログを使用して画像をロゴとして設定する方法について説明します。
-
ブラウザーで製品ページを開き、サイドキックの下部にある「デザイン」ボタンをクリックして、デザインモードに入ります。
-
ロゴバーのデザインで、「編集」をクリックし、ダイアログを使用してロゴコンポーネントの設定を編集します。
-
ダイアログで、「画像」タブのパネル内をクリックし、mywebsite.zip ファイルから抽出した logo.png 画像を参照して「OK」をクリックします。
-
サイドキックタイトルバーの三角形をクリックして編集モードに戻ります。
-
CRXDE Lite で、以下のノードに移動して、格納されているプロパティ値を確認します。
/etc/designs/mywebsite/jcr:content/contentpage/logo
パンくずコンポーネントの取り込み including-the-breadcrumb-component
この節では、基盤コンポーネントの 1 つであるパンくず(trail)コンポーネントを含めます。
-
CRXDE Lite で
/apps/mywebsite/components/contentpage
を参照し、center.jsp
ファイルを開いて次と置換します。code language-java <div>trail</div>
以下に置き換えます。
code language-xml <cq:include path="trail" resourceType="foundation/components/breadcrumb" />
-
変更を保存します。
-
ブラウザーで Products 1 ページをリロードします。trail コンポーネントは次のようになります。
タイトルコンポーネントの取り込み including-the-title-component
この節では、基盤コンポーネントの 1 つであるタイトルコンポーネントを含めます。
-
CRXDE Lite で
/apps/mywebsite/components/contentpage
を参照し、center.jsp
ファイルを開いて次と置換します。code language-xml <div>title</div>
以下に置き換えます。
code language-xml <cq:include path="title" resourceType="foundation/components/title" />
-
変更を保存します。
-
ブラウザーで製品ページをリロードします。タイトルコンポーネントは次のようになります。
注意:編集モードで別のタイトルおよびタイプ/サイズを設定できます。
段落システムコンポーネントの取り込み including-the-paragraph-system-component
段落システム(parsys)は、段落のリストを管理する web サイトの重要な部分です。作成者は、これを使用して、ページに段落コンポーネントを追加し、構造を提供できます。
parsys コンポーネント(基盤コンポーネントの 1 つ)を contentpage コンポーネントに追加します。
-
CRXDE Lite で
/apps/mywebsite/components/contentpage
を参照し、center.jsp
ファイルを開いて以下のコード行を見つけます。code language-xml <div>parsys</div>
-
このコード行を以下のコードに置き換えて、変更内容を保存します。
code language-xml <cq:include path="par" resourceType="foundation/components/parsys" />
-
ブラウザーで、Products ページを更新します。parsys コンポーネントが以下のように表示されます。
画像コンポーネントの作成 creating-the-image-component
段落システムに画像を表示するコンポーネントを作成します。時間を節約するために、画像コンポーネントはロゴコンポーネントのコピーとして作成され、いくつかのプロパティの変更が加えられます。
/libs/foundation/components/image
)を提供します。画像コンポーネントの作成 creating-the-image-component-1
-
/apps/mywebsite/components/logo
ノードを右クリックして、「コピー」をクリックします。 -
/apps/mywebsite/components
ノードを右クリックして、「貼り付け」をクリックします。 -
Copy of logo
ノードを右クリックし、「名前を変更」をクリックして既存のテキストを削除し、image
と入力します。 -
image
コンポーネントノードを選択して、以下のプロパティ値を変更します。jcr:title:
:自分の画像コンポーネントjcr:description
:これは自分の画像コンポーネントです。
-
以下のプロパティ値を使用して、
image
ノードにプロパティを追加します。- 名前:componentGroup
- タイプ:String
- 値:MyWebsite
-
image
ノードの下で、design_dialog
ノードの名前をdialog
に変更します。 -
logo.jsp
をimage.jsp.
に名前を変更します。 -
img.GET.java を開いて、パッケージを
apps.mywebsite.components.image
に変更します。
画像スクリプトの作成 creating-the-image-script
この節では、画像スクリプトを作成する方法について説明します。
-
次を開きます:
/apps/mywebsite/components/image/
image.jsp
-
既存のコードを次のコードに置き換えてから、変更内容を保存します。
code language-xml <%@include file="/libs/foundation/global.jsp"%><% %><%@ page import="com.day.cq.commons.Doctype, com.day.cq.wcm.foundation.Image, com.day.cq.wcm.api.components.DropTarget, com.day.cq.wcm.api.components.EditConfig, com.day.cq.wcm.commons.WCMUtils" %><% /* global.jsp provides access to the current resource through the resource object */ Image img = new Image(resource); img.setItemName(Image.NN_FILE, "image"); img.setItemName(Image.PN_REFERENCE, "imageReference"); img.setSelector("img"); img.setDoctype(Doctype.fromRequest(request)); img.setAlt("Home"); img.draw(out); %>
-
変更内容を保存します。
画像 cq:editConfig ノードの作成 creating-the-image-cq-editconfig-node
cq:editConfig
ノードタイプを使用すると、プロパティを編集するときに、コンポーネントの一定の動作を設定できます。
この節では、cq:editConfig ノードを使用して、コンテンツファインダーから画像コンポーネントにアセットをドラッグできるようにします。
-
CRXDE Lite の /apps/mywebsite/components/image ノードの下に、次のようにノードを作成します。
- 名前:cq:editConfig
- タイプ:cq:EditConfig
-
cq:editConfig ノードの下に、次のようにノードを作成します。
- 名前:cq:dropTargets
- タイプ:cq:DropTargetConfig
-
cq:dropTargets ノードの下に、次のようにノードを作成します。
- 名前:画像
- 型:nt:unstructured.
-
CRXDE で、プロパティを次のように設定します。
アイコンの追加 adding-the-icon
この節では、画像コンポーネントがサイドキックに一覧表示される際に画像コンポーネントの横に表示されるアイコンを追加します。
- CRXDE Lite で
/libs/foundation/components/image/icon.png
ファイルを右クリックして「コピー」を選択します。 /apps/mywebsite/components/image
ノードを右クリックして「貼り付け」をクリックし、「すべて保存」をクリックします。
画像コンポーネントの使用 using-the-image-component
ここでは、製品 ページを表示して、段落システムに画像コンポーネントを追加します。
-
ブラウザーで 製品 ページをリロードします。
-
サイドキックで、デザインモード アイコンをクリックします。
-
「編集」ボタンをクリックして、par のデザインダイアログを編集します。
-
ダイアログで、許可されたコンポーネント のリストが表示されます。MyWebsite に移動して、「マイ画像コンポーネント」を選択し、「OK」をクリックします。
-
編集モードに戻ります。
-
parsys フレーム(コンポーネントまたはアセットをここにドラッグ)をダブルクリックします。新規コンポーネントを挿入 および サイドキック セレクターは次のようになります。
ツールバーコンポーネントを含める including-the-toolbar-component
この節では、基盤コンポーネントの 1 つであるツールバーコンポーネントを含めます。
デザインモードに加えて、編集モードにも複数のオプションがあります。
-
CRXDE Lite で
/apps/mywebsite/components/contentpage
に移動し、body.jsp
ファイルを開いて以下のコードを見つけます。code language-java <div class="toolbar">toolbar</div>
-
このコードを以下のコードに置き換えて、変更内容を保存します。
code language-java <cq:include path="toolbar" resourceType="foundation/components/toolbar"/>
-
AEM web サイトページのフォルダーツリーで、Websites/My Website/English を選択し、新規/新しいページをクリックします。次のプロパティ値を指定し、「作成」をクリックします。
- タイトル:ツールバー
- 「マイ web サイトコンテンツページテンプレート」を選択します。
-
ページのリストで、ツールバーページを右クリックし、「プロパティ」をクリックします。「ナビゲーション内で非表示にする」を選択し、「OK」をクリックします。
「ナビゲーション内で非表示にする」オプションを使用すると、topnav や listchildren などのナビゲーションコンポーネントにページが表示されなくなります。
-
ツールバーの下に、次のページを作成します。
- 連絡先
- フィードバック
- ログイン
- 検索
-
ブラウザーで製品ページをリロードします。次のようなコンソールが表示されます。
検索コンポーネントの作成 creating-the-search-component
この節では、web サイト上のコンテンツを検索するためのコンポーネントを作成します。この検索コンポーネントは、任意のページの段落システム(特殊な検索結果ページなど)に配置できます。
完了したら、検索入力ボックスは、英語 のページに以下のように表示されます。
検索コンポーネントの作成 creating-the-search-component-1
-
CRXDE Lite で
/apps/mywebsite/components
を右クリックして、作成/コンポーネントを作成 をクリックします。 -
ダイアログを使用してコンポーネントを設定します。
-
最初のパネルで、次のプロパティ値を指定します。
- ラベル:検索
- タイトル:自分の検索コンポーネント
- 説明:これは自分の検索コンポーネントです。
- グループ:MyWebsite
-
「次へ」をクリックしてから、再度「次へ」をクリックします。
-
許可された親パネルで、「+」ボタンをクリックして
*/parsys
と入力します。 -
「次へ」をクリックして「OK」をクリックします。
-
-
「すべて保存」をクリックします。
-
次のノードをコピーし、apps/mywebsite/components/search ノードに貼り付けます。
-
/libs/foundation/components/search/dialog
-
``
/libs/foundation/components/search/i18n
-
/libs/foundation/components/search/icon.png
-
-
「すべて保存」をクリックします。
検索スクリプトの作成 creating-the-search-script
ここでは、検索スクリプトを作成する方法について説明します。
-
/apps/mywebsite/components/search/search.jsp
ファイルを開きます。 -
以下のコードを
search.jsp
にコピーします。code language-java <%@ page import="com.day.cq.wcm.foundation.Search,com.day.cq.tagging.TagManager" %> <%@include file="/libs/foundation/global.jsp" %><% %><cq:setContentBundle/><% Search search = new Search(slingRequest); String searchIn = (String) properties.get("searchIn"); String requestSearchPath = request.getParameter("path"); if (searchIn != null) { /* only allow the "path" request parameter to be used if it is within the searchIn path configured */ if (requestSearchPath != null && requestSearchPath.startsWith(searchIn)) { search.setSearchIn(requestSearchPath); } else { search.setSearchIn(searchIn); } } else if (requestSearchPath != null) { search.setSearchIn(requestSearchPath); } pageContext.setAttribute("search", search); TagManager tm = resourceResolver.adaptTo(TagManager.class); %><c:set var="trends" value="${search.trends}"/><% %><center> <form action="${currentPage.path}.html"> <input size="41" maxlength="2048" name="q" value="${fn:escapeXml(search.query)}"/> <input value="<fmt:message key="searchButtonText"/>" type="submit" /> </form> </center> <br/> <c:set var="result" value="${search.result}"/> <c:choose> <c:when test="${empty result && empty search.query}"> </c:when> <c:when test="${empty result.hits}"> <c:if test="${result.spellcheck != null}"> <p><fmt:message key="spellcheckText"/> <a href="<c:url value="${currentPage.path}.html"><c:param name="q" value="${result.spellcheck}"/></c:url>"><b><c:out value="${result.spellcheck}"/></b></a></p> </c:if> <fmt:message key="noResultsText"> <fmt:param value="${fn:escapeXml(search.query)}"/> </fmt:message> </c:when> <c:otherwise> <p class="searchmeta">Results ${result.startIndex + 1} - ${result.startIndex + fn:length(result.hits)} of ${result.totalMatches} for <b>${fn:escapeXml(search.query)}</b>. (${result.executionTime} seconds)</p> <br/> <div class="searchresults"> <div class="results"> <c:forEach var="hit" items="${result.hits}" varStatus="status"> <div class="hit"> <a href="${hit.URL}">${hit.title}</a> <div class="excerpt">${hit.excerpt}</div> <div class="hiturl"> ${hit.URL}<c:if test="${!empty hit.properties['cq:lastModified']}"> - <c:catch><fmt:formatDate value="${hit.properties['cq:lastModified'].time}" dateStyle="medium"/></c:catch></c:if> - <a href="${hit.similarURL}"><fmt:message key="similarPagesText"/></a> </div></div> </c:forEach> </div> <br/> <div class="searchRight"> <c:if test="${fn:length(trends.queries) > 0}"> <p><fmt:message key="searchTrendsText"/></p> <div class="searchTrends"> <c:forEach var="query" items="${trends.queries}"> <a href="<c:url value="${currentPage.path}.html"><c:param name="q" value="${query.query}"/></c:url>"><span style="font-size:${query.size}px"><c:out value="${query.query}"/></code></a> </c:forEach> </div> </c:if> <c:if test="${result.facets.languages.containsHit}"> <p>Languages</p> <c:forEach var="bucket" items="${result.facets.languages.buckets}"> <c:set var="bucketValue" value="${bucket.value}"/> <c:set var="label" value='<%= new java.util.Locale((String) pageContext.getAttribute("bucketValue")).getDisplayLanguage(request.getLocale()) %>'/> <c:choose> <c:when test="${param.language != null}">${label} (${bucket.count}) - <a href="<cq:requestURL><cq:removeParam name="language"/></cq:requestURL>">remove filter</a></c:when> <c:otherwise><a title="filter results" href="<cq:requestURL><cq:addParam name="language" value="${bucket.value}"/></cq:requestURL>">${label} (${bucket.count})</a></c:otherwise> </c:choose><br/> </c:forEach> </c:if> <c:if test="${result.facets.tags.containsHit}"> <p>Tags</p> <c:forEach var="bucket" items="${result.facets.tags.buckets}"> <c:set var="bucketValue" value="${bucket.value}"/> <c:set var="tag" value="<%= tm.resolve((String) pageContext.getAttribute("bucketValue")) %>"/> <c:if test="${tag != null}"> <c:set var="label" value="${tag.title}"/> <c:choose> <c:when test="<%= request.getParameter("tag") != null && java.util.Arrays.asList(request.getParameterValues("tag")).contains(pageContext.getAttribute("bucketValue")) %>">${label} (${bucket.count}) - <a href="<cq:requestURL><cq:removeParam name="tag" value="${bucket.value}"/></cq:requestURL>">remove filter</a></c:when> <c:otherwise><a title="filter results" href="<cq:requestURL><cq:addParam name="tag" value="${bucket.value}"/></cq:requestURL>">${label} (${bucket.count})</a></c:otherwise> </c:choose><br/> </c:if> </c:forEach> </c:if> <c:if test="${result.facets.mimeTypes.containsHit}"> <jsp:useBean id="fileTypes" class="com.day.cq.wcm.foundation.FileTypes"/> <p>File types</p> <c:forEach var="bucket" items="${result.facets.mimeTypes.buckets}"> <c:set var="bucketValue" value="${bucket.value}"/> <c:set var="label" value="${fileTypes[bucket.value]}"/> <c:choose> <c:when test="<%= request.getParameter("mimeType") != null && java.util.Arrays.asList(request.getParameterValues("mimeType")).contains(pageContext.getAttribute("bucketValue")) %>">${label} (${bucket.count}) - <a href="<cq:requestURL><cq:removeParam name="mimeType" value="${bucket.value}"/></cq:requestURL>">remove filter</a></c:when> <c:otherwise><a title="filter results" href="<cq:requestURL><cq:addParam name="mimeType" value="${bucket.value}"/></cq:requestURL>">${label} (${bucket.count})</a></c:otherwise> </c:choose><br/> </c:forEach> </c:if> <c:if test="${result.facets.lastModified.containsHit}"> <p>Last Modified</p> <c:forEach var="bucket" items="${result.facets.lastModified.buckets}"> <c:choose> <c:when test="${param.from == bucket.from && param.to == bucket.to}">${bucket.value} (${bucket.count}) - <a href="<cq:requestURL><cq:removeParam name="from"/><cq:removeParam name="to"/></cq:requestURL>">remove filter</a></c:when> <c:otherwise><a title="filter results" href="<cq:requestURL><cq:removeParam name="from"/><cq:removeParam name="to"/><c:if test="${bucket.from != null}"><cq:addParam name="from" value="${bucket.from}"/></c:if><c:if test="${bucket.to != null}"><cq:addParam name="to" value="${bucket.to}"/></c:if></cq:requestURL>">${bucket.value} (${bucket.count})</a></c:otherwise> </c:choose><br/> </c:forEach> </c:if> <c:if test="${fn:length(search.relatedQueries) > 0}"> <br/><br/><div class="related"> <fmt:message key="relatedSearchesText"/> <c:forEach var="rq" items="${search.relatedQueries}"> <a href="${currentPage.path}.html?q=${rq}"><c:out value="${rq}"/></a> </c:forEach></div> </c:if> </div> <c:if test="${fn:length(result.resultPages) > 1}"> <div class="pagination"> <fmt:message key="resultPagesText"/> <c:if test="${result.previousPage != null}"> <a href="${result.previousPage.URL}"><fmt:message key="previousText"/></a> </c:if> <c:forEach var="page" items="${result.resultPages}"> <c:choose> <c:when test="${page.currentPage}">${page.index + 1}</c:when> <c:otherwise> <a href="${page.URL}">${page.index + 1}</a> </c:otherwise> </c:choose> </c:forEach> <c:if test="${result.nextPage != null}"> <a href="${result.nextPage.URL}"><fmt:message key="nextText"/></a> </c:if> </div> </c:if> </div> </c:otherwise> </c:choose>
-
変更内容を保存します。
contentpage コンポーネントへの検索ボックスの追加 including-a-search-box-in-the-contentpage-component
contentpage ページの左側のセクションに検索入力ボックスを含めるには、次の手順に従います。
-
CRXDE Lite で
/apps/mywebsite/components/contentpage
の下のleft.jsp
ファイルを開いて、以下のコードを見つけます(2 行目)。code language-xml %><div class="left">
-
その行の 前 に、次のコードを挿入します。
code language-java %><%@ page import="com.day.text.Text"%><% %><% String docroot = currentDesign.getPath(); String home = Text.getAbsoluteParent(currentPage.getPath(), 2);%><%
-
次のコード行を探します。
code language-xml <div>search</div>
-
このコードを以下のコードに置き換えて、変更内容を保存します。
code language-java <div class="form_1"> <form class="geo" action="<%= home %>/toolbar/search.html" id="form" > <p> <input class="geo" type="text" name="q"><br> <a href="<%= home %>/toolbar/search.html" class="link_1">advanced search</a> </p> </form> </div>
-
ブラウザーで、Products ページを再読み込みします。検索コンポーネントは次のようになります。
検索ページへの検索コンポーネントの追加 including-the-search-component-in-the-search-page
この節では、段落システムに検索コンポーネントを追加します。
-
ブラウザーで検索ページを開きます。
-
サイドキックで、デザインモードアイコンをクリックします。
-
デザインの par ブロック(検索タイトルの下)で、「編集」をクリックします。
-
ダイアログで、下にスクロールして 自分の web サイト グループを表示し、「自分の検索コンポーネント」を選択して「OK」をクリックします。
-
サイドキックで、三角形をクリックして編集モードに戻ります。
-
My Search コンポーネントをサイドキックから parsys フレームにドラッグします。次のようなコンソールが表示されます。
-
製品ページに移動します。入力ボックスに customers と入力して Enter キーを押して検索します。検索ページにリダイレクトされます。プレビューモードに切り替わります。出力は以下のような形式です。
iparsys コンポーネントの取り込み including-the-iparsys-component
この節では、基盤コンポーネントの 1 つである継承段落システム (iparsys) コンポーネントを含めます。このコンポーネントを使用すると、親ページ上に段落の構造を作成でき、子ページに段落を継承させることができます。
このコンポーネントでは、編集モードとデザインモードの両方で複数のパラメーターを設定できます。
-
CRXDE Lite で
/apps/mywebsite/components/contentpage
に移動し、right.jsp
ファイルを開いて次と置き換えます。code language-java <div>iparsys</div>
以下に置き換えます。
code language-java <cq:include path="rightpar" resourceType="foundation/components/iparsys" />
-
変更を保存します。
-
ブラウザーで製品ページをリロードします。ページ全体は次のようになります。