私は現在、Tridion 2009 SP1 に機能を実装しています。この機能では、ユーザーはフィルターを利用して、ブローカーに一致基準を照会し、コンポーネント プレゼンテーションをページに返します。返される各アイテムには、コンポーネント リンクが含まれています。
もともと動的 CP は HTML フラグメントとしてブローカー DB に保存されていましたが、この方法で CP を保存すると、Tridion がコンテンツからコンポーネント リンクを削除し、HTML に空白スペースを残すことが発見されました。
次に、動的 CP が ascx コントロールとしてファイルストアに保存されるように設定を切り替えました。この設定を使用すると<tridion:ComponentLink ... />
、ascx ファイルに正常に保存されます。
ただし、結果を画面に表示すると、コンポーネント リンクが解決されず<tridion:ComponentLink ... />
、結果のソースに が残ります。
現在、このGetComponentPresentation
メソッドを使用して CP コンテンツを返しています。CP コンテンツは List に追加されてから、Repeater にバインドされて表示されます。
要約されたコードは以下のとおりです。
ComponentPresentationFactory CPFactory = new ComponentPresentationFactory();
List<string> componentPresentations = new List<string>();
for (int i = 0; i < tbl.Rows.Count; i++)
{
ComponentPresentation cp = CPFactory.GetComponentPresentation(
tbl.Rows[i][0].ToString(),
strComponentTemplate.ToString());
if (cp != null)
{
componentPresentations.Add(cp.Content);
}
}
このリストは、通常の方法でリピーターにバインドされています。
rptOffer.DataSource = componentPresentations;
rptOffer.DataBind();
コンポーネントリンクを強制的に解決する方法と、GetComponentPresentation
関数がこれを行わない理由を知っている人はいますか?
私が別の方法でやるべきことはありますか、それとも私がこれを実装している方法では不可能ですか?
tridion
web.configにtagprefixが正しく登録されていることを確認しました。
私はTridionにかなり慣れていないので、どんな助けも大歓迎です!
アップデート
私のシナリオにとって最も適切な解決策のように思われるため、Will の提案を実装しようとしましたが、以下のコードで Will の提案を使用しようとすると、(かなり当たり障りのない) エラーが発生します。
ComponentPresentationAssembler cpa = new ComponentPresentationAssembler("tcm:35-62652-64");
string content = cpa.GetContent(tbl.Rows[i][0].ToString(), strComponentTemplate.ToString());
実際には (一見) ランダムに発生する 2 つのエラーがありますが、常にcpa.GetContent(...)
呼び出し時に発生します。エラーは次のとおりです。
Exception occurred during configuration callback
OR
com.tridion.dcp.ComponentPresentationFactory
コードを実行するたびにエラーが変化する理由がわかりません。コードを変更しなくてもエラーは変わります。
ここで何が欠けているか知っている人はいますか?Brokerストレージなどへの接続の問題かと思っていたのですが、ComponentPresentationFactory
クラスを使っていたらその部分が動いていたことを思い出しました。
それが役立つ場合は、ascx としてファイル ストアに保存されている DCP に次の HTML が含まれています。
<div class="content-list-item offer redesign noImage">
<h2><span>Mike Offer 01/06 - 10/06 & 20/06 - 10/07</span> Exp May 20th</h2>
<div class="content-list-item-text">
<p>Body Text</p>
<div class="input-btn burgundy">
<tridion:ComponentLink runat="server" PageURI="tcm:0-0-0" ComponentURI="tcm:35-31685" TemplateURI="tcm:0-0-0" AddAnchor="false" LinkText="Button Text<span class="rm">: Button Text</span>" LinkAttributes=" alt="Button Text" target="_self" " TextOnFail="true"/>
</div>
<p>Sub Title</p>
</div>
<div class="offers-list">
<ul>
<li>Offer ends: 20 May 2012</li>
<li>Offer available at all hotels</li>
</ul>
</div>
<div class="back-to-top">
<a href="#content">Back to top</a>
</div>
更新 2
Ryan のおかげで、DCP (ASCX) ファイルが wwwroot フォルダー内のアプリケーションのフォルダー内で公開されていないことがわかりました。これにより、<tridion:ComponentLink ... />
タグがソースに直接出力されるという問題が解決されました。現在レンダリング中ですが、リンクはまだ解決されていません。<a ... />
タグが出力されていません。これは、アセンブラーがうまく機能する場所です。これを機能させることができれば。
より多くのロギングとチェックを実装し、jar ファイルが見つからないか、バージョンが正しくない可能性があることを示唆するエラーに関する詳細情報を入手しました。
Exception Details: Java.Lang.ClassNotFoundException: com.tridion.dcp.ComponentPresentationFactory
興味深いことに、ComponentPresentationFactory
クラスを使用すると (内部リンクを解決せずに) 動作しますが、アセンブラーを使用するとすぐに上記のエラーがスローされます。
また、Alvin の提案に従って Page をコンストラクターに追加しようとしましたが、出力は同じです。