Ich implementiere derzeit Funktionalität in Tridion 2009 SP1, wo der Benutzer einen Filter verwenden kann, der wiederum den Broker nach übereinstimmenden Kriterien abfragt und dann die Komponentenpräsentationen an die Seite zurückgibt. Jedes zurückgegebene Element enthält einen Komponentenlink.Tridion Component Link aufgelöst in Dynamische Komponentenpräsentation
Ursprünglich wurden die dynamischen CPs in der Broker-DB als HTML-Fragmente gespeichert, aber es wurde entdeckt, dass Tridion beim Speichern der CPs den Komponentenlink vom Inhalt streichen und einen leeren Bereich im HTML hinterlassen würde.
Ich habe dann die Einstellung so geschaltet, dass die dynamischen CPs jetzt im Dateispeicher als ascx-Steuerelemente gespeichert sind. Wenn diese Einstellung verwendet wird, wird <tridion:ComponentLink ... />
erfolgreich in der Datei ascx gespeichert.
Wenn ich jedoch komme, um die Ergebnisse auf dem Bildschirm zu rendern, wird die Komponentenverknüpfung nicht aufgelöst und ich werde mit der <tridion:ComponentLink ... />
in meiner resultierenden Quelle belassen.
Momentan verwende ich die Methode GetComponentPresentation
, um den CP-Inhalt zurückzugeben, der dann zu einer Liste hinzugefügt wird, bevor er zur Anzeige an einen Repeater gebunden wird.
Zusammengefasst Code ist unten:
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);
}
}
Diese Liste der an den Repeater auf die übliche Weise gebunden ist:
rptOffer.DataSource = componentPresentations;
rptOffer.DataBind();
Wer weiß, wie ich die Komponente Verbindung zu lösenden zwingen kann, und Warum macht die GetComponentPresentation
Funktion dies nicht für mich?
Gibt es etwas, was ich anders machen sollte, oder ist das nicht möglich in der Art, wie ich das umsetze?
Ich habe bestätigt, dass der Tagprefix tridion
korrekt in der web.config registriert ist.
Ich bin ziemlich neu zu Tridion, so dass jede Hilfe sehr geschätzt wird!
UPDATE
Ich habe versucht Will Vorschlag umzusetzen, da es wie die am besten geeignete Lösung für mein Szenario scheint, aber ich bin ein (ziemlich langweilig) Fehler zu erhalten, wenn ich versuche meinen Willen Vorschlag zu verwenden, um mit Code unten:
ComponentPresentationAssembler cpa = new ComponentPresentationAssembler("tcm:35-62652-64");
string content = cpa.GetContent(tbl.Rows[i][0].ToString(), strComponentTemplate.ToString());
Es gibt tatsächlich zwei Fehler, die (scheinbar) zufällig, sondern immer am cpa.GetContent(...)
Anruf auftreten. Die Fehler sind:
Ich kann nicht herausfinden, warum der Fehler zwischen den Zeiten ändert, die ich den Code ausführe. Der Fehler ändert sich, auch wenn keine Codeänderungen vorgenommen werden.
Weiß jemand, was ich hier vermisse? Ich nahm an, dass es ein Problem mit der Konnektivität zu dem Broker-Speicher usw. sein würde, aber dann erinnerte ich mich, dass dieser Teil funktionierte, als ich die Klasse ComponentPresentationFactory
verwendete.
Wenn es hilft, das DCP, die auf dem Dateispeicher als ascx gespeichert wird, enthält die folgende 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>
UPDATE 2
Dank Ryan, I‘ Ich habe entdeckt, dass meine DCP (ASCX) -Dateien nicht im Ordner der Anwendung im Ordner wwwroot veröffentlicht wurden, der das Problem der Ausgabe des Tags <tridion:ComponentLink ... />
direkt an die Quelle gelöst hat. Es wird jetzt gerendert, aber die Verbindung wird immer noch nicht aufgelöst. Die <a ... />
Tags werden nicht ausgegeben. Hier kommt hoffentlich der Assembler rein - sobald ich das zur Arbeit bringen kann.
Ich habe mehr Logging durchgeführt und überprüft und haben mehr Informationen über den Fehler was darauf schließen lässt, dass ich eine JAR-Datei fehlt oder die falsche Version haben:
Exception Details: Java.Lang.ClassNotFoundException: com.tridion.dcp.ComponentPresentationFactory
Interessant ist das, wenn ich die ComponentPresentationFactory
Klasse, es funktioniert (ohne Auflösung der internen Link), aber sobald ich den Assembler verwenden, löst es den obigen Fehler.
Ich habe auch versucht, die Seite zum Konstruktor hinzuzufügen, wie von Alvin vorgeschlagen, aber die Ausgabe ist die gleiche.
Hey Mike, Willkommen bei Tridion. Du schaffst es, deine Neuheit ziemlich gut zu verstecken. :-) Sie werden feststellen, dass die meisten Mitglieder der Tridion Community sehr hilfreich sind. Wenn Sie dies noch nicht getan haben, empfehlen Sie bitte unseren Tridion-Vorschlag auf area51: http://area51.stackexchange.com/proposals/38335/tridion?referrer=lav544jo87qNn9xqeeO2NA2 –
Das Problem ist mit CPFactory - verwenden Sie stattdessen CPAssembler, wie Will zeigt in seiner Antwort –
Auf den Fehler .getContent(), eine Chance, dass es mehrere Präsentationsserver und/oder die Komponentenpräsentationen tatsächlich unveröffentlicht werden, wenn Sie den Code ausführen? –