trucos plugin personajes para objetos movimientos hacer dinamicos descargar componentes como bloques arquitectura animar animacion tridion tridion2009 tridion-content-delivery

plugin - El enlace de componentes de Tridion no se resuelve en la presentación de componentes dinámicos



plugin para animacion sketchup (4)

Actualmente estoy implementando la funcionalidad en Tridion 2009 SP1, donde el usuario puede utilizar un filtro que, a su vez, consulta al broker por criterios coincidentes y luego devuelve las presentaciones de componentes a la página. Cada artículo devuelto contiene un enlace de componente.

Originalmente, las CP dinámicas se almacenaban en la base de datos del intermediario como fragmentos HTML, pero se descubrió que al almacenar las CP de esta manera, Tridion eliminaría el enlace del componente del contenido y dejaría un espacio en blanco en el HTML.

Luego cambié la configuración para que los CP dinámicos se almacenen ahora en el almacén de archivos como controles ascx. Cuando se utiliza esta configuración, <tridion:ComponentLink ... /> se almacena correctamente en el archivo ascx.

Sin embargo, cuando vengo a mostrar los resultados en la pantalla, el enlace del componente no se está resolviendo y me quedo con el <tridion:ComponentLink ... /> en mi fuente resultante.

Actualmente, estoy usando el método GetComponentPresentation para devolver el contenido de CP que luego se agrega a una Lista antes de vincularse a un Repetidor para su visualización.

El código resumido está abajo:

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); } }

Esta lista está vinculada al repetidor de la forma habitual:

rptOffer.DataSource = componentPresentations; rptOffer.DataBind();

¿Alguien sabe cómo puedo forzar la resolución del vínculo de componente y por qué la función GetComponentPresentation no hace esto por mí?

¿Hay algo que debería estar haciendo diferente o simplemente esto no es posible en la forma en que lo estoy implementando?

He confirmado que el tridion tridion está registrado correctamente en web.config.

Soy bastante nuevo en Tridion, por lo que cualquier ayuda es muy apreciada.

ACTUALIZAR

Intenté implementar la sugerencia de Will, ya que parece ser la solución más adecuada para mi situación, pero recibo un error (bastante insulso) cuando intento usar la sugerencia de Will con mi código a continuación:

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

En realidad, hay 2 errores que ocurren (aparentemente) al azar, pero siempre en la cpa.GetContent(...) . Los errores son:

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

Parece que no puedo entender por qué el error cambia entre las veces que ejecuto el código. El error cambia incluso cuando no se realizan cambios de código.

¿Alguien sabe lo que me estoy perdiendo aquí? Asumí que sería un problema con la conectividad al almacenamiento de Broker, etc. pero luego recordé que esa parte estaba funcionando cuando estaba usando la clase ComponentPresentationFactory .

Si ayuda, el DCP que se almacena en el almacén de archivos como un archivo de acceso contiene el siguiente código HTML:

<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>

ACTUALIZACIÓN 2

Gracias a Ryan, descubrí que mis archivos DCP (ASCX) no se estaban publicando dentro de la carpeta de la aplicación dentro de la carpeta wwwroot que resolvió el problema de la salida de la <tridion:ComponentLink ... /> directamente a la fuente. Ahora se está procesando, pero el enlace aún no se está resolviendo. Las etiquetas <a ... /> no se están emitiendo. Aquí es donde el ensamblador esperará entrar, una vez que pueda hacer que esto funcione.

He implementado más registros y comprobaciones y tengo más información sobre el error, lo que sugiere que me puede faltar un archivo jar o tener una versión incorrecta:

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

Lo interesante es que cuando uso la clase ComponentPresentationFactory , funciona (sin resolver el enlace interno), pero tan pronto como uso el ensamblador, produce el error anterior.

También he intentado agregar la página al constructor como lo sugiere Alvin, pero la salida es la misma.


Como ya se mencionó, para resolver su problema, debe usar la clase ComponentPresentationAssembler , no la clase ComponentPresentationFactory , pero debe asegurarse de que usa la clase ComponentPresentationAssembler dentro del espacio de nombres Tridion.ContentDelivery.WAI :

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"));

También debe asegurarse de:

  • Sus archivos ASCX se publican en el sistema de archivos. Esto se establece en el archivo cd_broker_conf.xml dentro de la sección <Bindings> , por ejemplo, <Binding Name="ASPComponentPresentation" Class="com.tridion.broker.componentpresentations.FSASCXComponentPresentationHome"/>

  • Sus archivos ASCX se publican dentro de su aplicación web .Net. Esto se establece en el archivo cd_broker_conf.xml dentro de la sección <Publications> , por ejemplo

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

Tenga en cuenta que las ubicaciones que ve arriba distinguen entre mayúsculas y minúsculas


Está cargando el contenido de la presentación del componente dinámico como una cadena en lugar de ejecutar la cadena como dice un control de usuario.

Para resolver su problema puede utilizar 1 de 2 soluciones:

1) Use un Regex en cp.Content para procesar los enlaces a través de la API de Tridion.

2) Publique su contenido dinámico en el sistema de archivos como controles de usuario y cargue este control en su página / control de usuario, ejecutándolo así

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); }


La respuesta de Mark ya cubre la parte más importante para su versión de Tridion: debe publicar los archivos ASCX en el disco para que tridion:CompontentLink Controles tridion:CompontentLink sean ejecutados por ASP.NET .

Tridion 2011 introdujo REL como una solución alternativa para esto. Cuando use REL, simplemente publicará los fragmentos HTML nuevamente y tcdl:ComponentLink se almacenará tal como está en la base de datos (por lo tanto, no se transformará en tridion:ComponentLink durante la implementación). Luego, cuando recupere el contenido (a través de ComponentPresentationTransformer o a través del nuevo servicio web Content Delivery OData), se tcdl:ComponentLink el tcdl:ComponentLink (y otras etiquetas tcdl:* ) y obtendrá el resultado que desea.


Para ejecutar un DCP, en lugar de obtener el contenido publicado, debe usar la clase ComponentPresentationAssembler , no la clase ComponentPresentationFactory .

Un simple ejemplo a continuación:

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

Tenga en cuenta que si está publicando una gran cantidad (es decir, cientos) de presentaciones de componentes (y publicándolas con frecuencia), no es una buena idea usar ascx, ya que puede tener algunos problemas de rendimiento con ASP.NET que vuelve a compilar la carpeta que los contiene a todos. o activando reinicios de la aplicación.

Es más seguro publicarlos como (X) fragmentos HTML en la base de datos, y publicar los enlaces como Mark menciona.

Como Frank menciona en 2011 SP1, puede usar REL para hacer este procesamiento posterior. Ver este artículo para más información.