2012-05-10 14 views
20

現在、Tridion 2009 SP1で機能を実装しています。このフィルタでは、フィルタを使用してブローカに一致条件を照会し、コンポーネントプレゼンテーションをページに返します。 返される各アイテムにはコンポーネントリンクが含まれます。Tridionコンポーネントリンクが動的コンポーネントプレゼンテーションで解決されない

元々ダイナミックCPはHTMLフラグメントとしてブローカDBに格納されていましたが、このようにCPを保存すると、Tridionはコンテンツからコンポーネントリンクを取り除き、HTMLに空白を残すことに気付きました。

次に、ダイナミックCPがascxコントロールとしてfilestoreに保存されるように設定を変更しました。この設定を使用すると、<tridion:ComponentLink ... />は正常にascxファイルに格納されます。

しかし、結果を画面に表示すると、コンポーネントのリンクが解決されず、結果のソースに<tridion:ComponentLink ... />が残っています。

現在、私はGetComponentPresentationメソッドを使用してCPコンテンツを返しています。これは、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のtagprefixがweb.configに正しく登録されていることを確認しました。

私はTridionをかなり新しくしていますので、どんな助けでも大歓迎です!

UPDATE

私はそれが私のシナリオのために最も適切な解決策のように思えるようウィルの提案を実装しようとしましたが、私は私とウィルの提案を使用しようとするとき、私は(かなり当たり障りのない)エラーを受信して​​います以下のコード:

ComponentPresentationAssembler cpa = new ComponentPresentationAssembler("tcm:35-62652-64"); 
string content = cpa.GetContent(tbl.Rows[i][0].ToString(), strComponentTemplate.ToString()); 

cpa.GetContent(...)コールで(一見)ランダムにいつも起こる2つのエラーは、実際にあります。エラーは次のとおりです。

Exception occurred during configuration callback 
OR 
com.tridion.dcp.ComponentPresentationFactory 

私はコードを実行する時間の間にエラーが変化する理由を理解できないようです。コードを変更しなくてもエラーは変化します。

私がここで紛失していることを誰かが知っていますか?私はそれがBrokerストレージなどへの接続性に問題があると思っていましたが、ComponentPresentationFactoryクラスを使用しているときにその部分が動作していたことを思い出しました。それが助け場合

、ascxファイルには、次のHTML含まれているとして、ファイルストアに保存されているDCP:ライアンへ

<div class="content-list-item offer redesign noImage"> 
<h2><span>Mike Offer 01/06 - 10/06 &amp; 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&lt;span class=&#34;rm&#34;&gt;: Button Text&lt;/span&gt;" LinkAttributes=" alt=&#34;Button Text&#34; target=&#34;_self&#34; " 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> 

UPDATE 2

おかげで、私は」私のDCP(ASCX)ファイルが、ソースに直接<tridion:ComponentLink ... />タグを出力するという問題を解決したwwwrootフォルダ内のアプリケーションのフォルダ内に公開されていないことが判明しました。現在レンダリングされていますが、リンクはまだ解決されていません。 <a ... />タグが出力されていません。これは、アセンブラがうまくいけばうまくいきます - 一度これを動作させることができます。

私はより多くのロギングを実施し、チェックし、私はjarファイルを欠落しているか、間違ったバージョンを持っていることを示唆しているエラーの詳細情報を持っていました:私が使用している場合

Exception Details: Java.Lang.ClassNotFoundException: com.tridion.dcp.ComponentPresentationFactory 

面白いこれは、ありますクラスでは(内部リンクを解決することなく)動作しますが、アセンブラを使用すると直ちに上記のエラーがスローされます。

Alvinが提案したように、Pageをコンストラクタに追加しようとしましたが、出力は同じです。

+0

に敏感であることに注意してくださいねえマイクは、Tridionのへようこそ。あなたは新鮮さをかなりよく隠すことができます。 :-)あなたはTridionコミュニティのほとんどのメンバーが非常に役に立ちます。もし私がまだ行っていないのであれば、エリア51のTridion提案にコミットしてください:http://area51.stackexchange.com/proposals/38335/tridion?referrer=lav544jo87qNn9xqeeO2NA2 –

+0

問題はCPFactoryにあります - 代わりにCPAssemblerをWill彼の返信で表示されます –

+0

.getContent()エラーでは、複数のプレゼンテーションサーバーやコンポーネントプレゼンテーションが実際にコードを実行したときに公開されていないことがあります。 –

答えて

11

ためthis articleを参照してくださいしかし、あなたはTridion.ContentDelivery.WAI名前空間内ComponentPresentationAssemblerクラスを使用していることを確認する必要があります。

Tridion.ContentDelivery.WAI.ComponentPresentationAssembler presentationAssembler = new Tridion.ContentDelivery.WAI.ComponentPresentationAssembler("tcm:5-44410-64",this.Page); 
Response.Write(presentationAssembler.GetContent("tcm:5-62700", "tcm:5-62627-32")); 

ます。また、確認する必要があります:あなたのASCXファイルは、ファイルシステム に公開されている

  • これはcd_broに設定されていますker_conf.xmlファイル(<Bindings>セクション内)。 <Binding Name="ASPComponentPresentation" Class="com.tridion.broker.componentpresentations.FSASCXComponentPresentationHome"/>

  • あなたのASCXファイルは.Net Webアプリケーション内に公開されています。 これは<Publications>セクションのcd_broker_conf.xmlファイルに設定されています。

    <Publication Id="5" DocumentRoot="C:/Inetpub/wwwroot/website1" DataRoot="C:/Inetpub/wwwroot/website1/dcp"> 
        <Dcp> 
         <Asp Location="C:/Inetpub/wwwroot/website1/dcp"/> 
        </Dcp> 
    </Publication> 
    

あなたは上記を参照場所はケース

+0

Ryan、私は、ComponentPresentationAssemblerを使用していたので正しい答えとしてWillの答えをマークしましたが、これがすべてであることを確認するために必要なもののリストを持つことは本当に便利でした作業。乾杯! –

+0

実際、これをもう一度見て、私はあなたの答えは実際に私がこれを修正することができた理由だと思います。 ClassNotFoundException(Update 2参照)に関するエラーは、私がComponentPresentationAssemblerに間違った名前空間を使用していたためです。 Tridion.ContentDelivery.WAI名前空間に変更すると、この問題が修正され、コードが完全に機能するようになりました。正解の印をつけるとき、その重要な部分を逃したことに対する謝罪。 –

+2

私が間違っていない限り、WAI機能を使用するためのライセンスを持っていることを確認する必要があります。ちょうどメモ...私は誰もがこれを実装し、彼らが必要なTridionのライセンスを持っていないことを知ってほしくないでしょう! –

9

ユーザーコントロールのように文字列を実行するのではなく、動的コンポーネントプレゼンテーションの内容を文字列として読み込みます。 TridionのAPIを使用してリンクを処理するためにcp.Contentに正規表現を使用してください)

1:あなたは1 2のソリューションを使用することができますあなたの問題を解決するために

2)これを実行、ユーザーコントロールなどのファイルシステムにあなたの動的なコンテンツを公開し、あなたのページ/ユーザーコントロール上にこのコントロールを読み込むこと

using (var cpf = new ComponentPresentationFactory(publicationId)) 
{ 
    var cp = cpf.GetComponentPresentation(componentId, componentTemplateId); 
    fileLocation = cp.FileLocation; 
} 

if (!String.IsNullOrEmpty(fileLocation)) 
{ 
    var crtl = this.LoadControl(MapPathReverse(fileLocation)); 
    phldControls.Controls.Add(crtl); 
} 
+1

-1の一般的なエラーメッセージとは異なり、 Tridionには、ComponentPresentationAssembler –

+3

ありがとうDominicでこれを行うための、すぐにサポートされています。私はComponentPresentationAssemblerを知らなかった。あなたは毎日新しいことを学びます。 –

10

マークの答えは、すでにお使いのバージョンのための最も重要な部分をカバーTridion:tridion:CompontentLinkコントロールをASP.NETで実行するには、ASCXファイルをディスクに公開する必要があります。

Tridion 2011では、これに対する代替ソリューションとしてRELが導入されました。 RELを使用すると、HTMLフラグメントを再度公開するだけで、tcdl:ComponentLinkはそのままデータベースに格納されます(デプロイ時にtridion:ComponentLinkに変換されません)。その後、ComponentPresentationTransformerまたは新しいコンテンツ配信OData Webサービスを通じてコン​​テンツを取得すると、tcdl:ComponentLink(および他のtcdl:*タグ)が解決され、必要な結果が得られます。

18

公開コンテンツを取得するのではなく、DCPを実行するには、ComponentPresentationFactoryクラスではなくComponentPresentationAssemblerクラスを使用する必要があります。

以下の簡単な例:あなたがコンポーネントのプレゼンテーションの(つまり、数百)(および頻繁に公開)、そのないascxファイルを使用することをお勧め多くのことを公開している場合は、その

ComponentPresentationAssembler cpa = 
    new ComponentPresentationAssembler("tcm:69-6212-64",this.Page); 
Response.Write(cpa.GetContent("tcm:69-2882", "tcm:69-6339-32")); 

注 - あなたが得ることができますASPのパフォーマンスに関する問題NETバッチを再コンパイルするか、アプリケーションの再起動をトリガーします。

これらを(X)HTMLフラグメントとしてデータベースに公開し、マークのコメントとしてリンクを後処理する方が安全です。

Frankが2011 SP1で言及しているように、RELを使用してこの後処理を行うことができます。あなたがComponentPresentationAssemblerクラス、ないComponentPresentationFactoryクラスを使用する必要があなたの問題を解決するためには、既に述べたようにより多くの情報

+0

良いものです。 Tridion固有のStackExchangeエリアを取得するために、私たちの提案にまだ参加していないことがわかります。このリンクに従って、それを考慮してください:http://area51.stackexchange.com/proposals/38335/tridion?referrer=lav544jo87qNn9xqeeO2NA2 –

+0

その情報をありがとう@Will。私はこれを試みましたが、DCPを試してみるとエラーになります。投稿にエラーの詳細を追加しました。何か案は? –

+0

ああ、古典的なCPアセンブラ対工場の説明(RELからの新しい善意と)、素晴らしい! @ MikePercival - 私はあなたの最初の例ではnull CPをキャッチしたエラーの違いが疑わしい。チェックを外すと、同じコンポーネントIDの同じセットに対して同じエラーが発生しますか? –

関連する問題