sitecore sitecore6

Enlaces y referencias entre elementos clonados en Sitecore 6.4.



sitecore6 (1)

Estoy construyendo un sitio de repositorio de datos que luego clonaré en su totalidad para proporcionar múltiples sitios de clonación, permitiendo la localización de contenido global.

Lo que debo hacer es garantizar que todas las referencias entre los elementos en el sitio del repositorio (enlaces en los campos de texto enriquecido, referencias de elementos para obtener puntos de "elementos relacionados", etc.) se anulen para referirse a los clones relevantes en lugar de los elementos originales en el repositorio

Es probable que esto implique, por ejemplo, personalizar el LinkManager y tal vez GetItem (itemID) con alguna lógica adicional para encontrar el clon correcto.

Lo que necesito saber es qué bits de la API debo preocuparme? ¿Puedo hacer una única modificación que heredará la vinculación de la representación en un campo de texto enriquecido en los componentes .Net, las referencias de elementos que se envían a una sublayout desde la lista desplegable, las representaciones a través de XSLT, etc.? Necesito un ID de elemento para trabajar como un alias para su clonación en el contexto del sitio de clonación. Context.Database.GetItem (ID) debe devolver un clon cuando esté en el contexto del sitio de clonación.

Básicamente, estoy buscando un mecanismo que traduzca "Datos / Inicio / Productos / Producto A" a "clonar / Inicio / Productos / ProductoA" siempre y cuando lo use en el contexto de un sitio de clonación.

¿Dónde necesito implementar esta lógica, cuántos lugares?

Cross publicado en SDN http://sdn.sitecore.net/SDN5/Forum/ShowPost.aspx?PostID=35598

Esto está relacionado con una pregunta anterior sobre el manejo de enlaces internos en los sitios clonados de Sitecore 6.4 , pero contiene más detalles y es más específico.

EDITAR: aunque la solución ideal ubicaría esta funcionalidad en lo profundo de Sitecore, es importante que solo se aplique al contenido tal como se ve en el sitio web real, es decir, no debe interferir con las tuberías de Sitecore para, por ejemplo, crear, clonar y eliminar elementos.


Te recomiendo que tomes un enfoque diferente. En lugar de cambiar los enlaces, puede agregar código a HttpRequestPipeline para resolver "Data / Home / Products / Product A" como "clone / Home / Products / ProductA". Un enfoque similar se describe en Reutilizar y compartir datos :

Un usuario de CMS podría usar el Editor de texto enriquecido, las propiedades de representación u otras características para vincular a un elemento basado en una plantilla de datos de selección de elemento. Cuenta para estas condiciones en tu código. Puede configurar un procesador de canalización httpRequestBegin para manejar las solicitudes HTTP de elementos [...]

Para aplicar este enfoque a su escenario, agregue la implementación personalizada de HttpRequestProcessor después de <processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel"/> en la canalización HttpRequestBegin en web.config.

Aquí está la lógica para implementar:

  1. Utilice HttpContext.Current.Request.UrlReferrer para determinar el sitio de referencia.
  2. Verifique que el sitio de referencia esté en su lista de sitios clonados.
  3. Compruebe si Sitecore.Context.Item está en el sitio de origen.
  4. Cree una cadena con la nueva ruta y verifique que este elemento exista utilizando Database.GetItem() .
  5. Modifique Sitecore.Context.Item al nuevo elemento.

La ventaja de este enfoque es que no necesita interceptar las muchas formas en que se puede crear un enlace, y mantener su lógica de reescritura de ruta en un solo lugar. En efecto, creará un alias de "Datos / Productos / ProductoA" a "clonar / Inicio / ProductoA" que solo tendrá efecto si su sitio está en su lista de clones.

Actualización: hice una prueba de este enfoque en Office Core. Creé un segundo sitio, AlternalteSite, con un nodo secundario Our-Process. La página de inicio de AlternateSite tiene un enlace a / home / Our-Process. Cuando el código a continuación se agrega a la canalización HttpRequestBegin, el enlace se dirige al elemento / AlternateSite / Our-Process.

public class SiteChanger : HttpRequestProcessor { // Some definitions removed... public override void Process(HttpRequestArgs args) { if (ReferringSiteIsTarget()) { Item targetItem = GetTargetItem(); if (targetItem != null) { Sitecore.Context.Item = targetItem; } } } private Item GetTargetItem() { string currentItemPath = Sitecore.Context.Item.Paths.FullPath; string newPath; if (currentItemPath.Contains(SourcePath)) { newPath = currentItemPath.Replace(SourcePath, TargetPath); return Sitecore.Context.Database.GetItem(newPath); } return null; } }

Actualización 2: como señala James Walford en los comentarios, este enfoque solo funciona si no se cambia el nombre de los clones. Sitecore, según mi conocimiento, no proporciona una forma de atravesar un elemento fuente a sus clones en la base de datos web. En master, puede usar la base de datos de enlaces para obtener de un elemento a sus clones (consulte esta publicación del foro de John West), pero después de la publicación, los clones se convierten en elementos normales, por lo que presumiblemente no se incluirán en la base de datos de enlaces.

Un enfoque sería agregar una lista múltiple de enlaces a clones a la plantilla estándar, y agregar lógica para rellenar esto como parte de la tubería uiCloneItems , y usar estos datos en el código HttpRequestProcessor. Esto preservará la relación de la Base de datos de enlaces, pero supondrá una sobrecarga tanto para el proceso de clonación como para el proceso de resolución de Solicitud de HTTP, ya que su código deberá recorrer todos los clones para determinar cuál vivió en el sitio web solicitante.