Pregunta

He visto otras preguntas similares (como Éste), revisó la documentación de Microsoft (como todos los que se derivan y están relacionados con la página Localización de soluciones de sandboxed en SharePoint 2010), más otros artículos (Johnwpowell y Spbits).

De todos modos, no puedo resolver el siguiente problema:

Tener una solución sandboxed SP2010 en VS2010 con una parte web solo en código, ¿Cómo localizo el título de la parte web, descripción? (en el archivo .webpart), Grupo, QuickAddGroup (Elements.xml)?

Gracias a todos

Notas adicionales:

Puedo localizar el título y la descripción de la función, así como el contenido de WebPart por código (por ejemplo, el texto de alguna etiqueta). También conozco los atributos personalizados para localizar las propiedades de WebPart cuando el usuario los edite en el navegador.

Pude hacer esto en SP2007, a través de una magia aleatoria de Visual Studio (BuildAction + CopyTooutput + CustomTool + Despliegue Ubicación + Tipo de implementación + Manifiesto de edición ... No me preguntes cómo :)), pero la mayoría de esas opciones no son Disponible en una solución de sandbox.

Editar

Después de volver a leer documentos, he visto esta nota que pone la última palabra al menos en el archivo .webpart:

Las cadenas en el archivo .webpart de una solución de sandboxed se pueden localizar solo si los archivos de recursos localizados se han instalado por separado en el sistema de archivos como parte de una solución agrícola. En la mayoría de las situaciones en las que está creando una solución de sandboxed, es porque no tiene permiso para instalar soluciones agrícolas en las granjas objetivo. En tales casos, no hay una forma práctica de localizar el archivo .webpart en una solución de sandboxed. Esto significa que el nombre de la parte web en la galería de piezas web es el mismo en sitios de todos los idiomas.

¿Alguna pista sobre cómo hacer esto al menos mediante programación, por ejemplo, agregando el WebPart a la galería en un receptor de evento de funciones?

¿Fue útil?

Solución

Supongo que no puede instalar una solución agrícola que incluye archivos de recursos como parte de un enfoque híbrido. Si puede, esto esto logra el problema.

Si no es: (lo siento, si ya lo sabe) como probablemente sepa, recursos referenciados en un archivo .webpart (o.dwp) se ve como esto: "$ recursos: core, webparttitle;" donde "Core" se refiere al nombre del archivo de recursos y "WebParttitle" se refiere al nombre de la cadena de recursos. Estos recursos se resuelven cuando el archivo .webpart se implementa como parte de una característica y se resuelven mirando el lenguaje del sitio de la raíz porque aquí es donde existe la galería de piezas web. Es un solo éxito en el punto de aprovisionar en el sitio.

En un sandbox, solo puede hacer referencia al servidor instalado archivos de recursos, no recursos implementados como parte de la solución Sandbox. Por lo tanto, la única forma de evitar esto parece ser usar código como un receptor de funciones. En la función activada, le sugiero que tenga un mango en el archivo WebPart en la galería de piezas web (usando spweb.getCatalog) y luego haga una búsqueda y reemplazo simples, resolviendo la referencia de recursos programáticamente buscando la cadena de recursos que se almacena en El conjunto del receptor de características.

Otros consejos

Estoy construyendo este basado en Steve Respuesta y otros enlaces, con los pasos principales necesarios. Puede ser útil para los siguientes que vienen. Por favor, corrija si está mal.

  1. Obtenga la galería de piezas web como una espalda con GetCatalog(SPListTemplateType.WebPartCatalog)
  2. Encuentre el elemento en la lista correspondiente a su parte web, por ejemplo, coincidir con SPListItem.Name
  3. Crear un xmltextreader basado en el archivo de pieza web con XmlReader xmlReader = new XmlTextReader(listItem.File.OpenBinaryStream());
  4. Cree un XMLDocument basado en el lector con XmlDocument xmlDoc = new XmlDocument(xmlReader)
  5. Cree un xpathnavigator basado en el documento con XPathNavigator navigator = xmlDoc.CreateNavigator()
  6. Obtenga un solo nodo XPATHNAVIGATOR para el título de la pieza web con XPathNavigator titleNode = navigator.SelectSingleNode(titleXPath), donde TitlexPath es "/WebParts/WebPart/Data/Properties/Property [@name = title]
  7. Establecer su valor tomado de recursos localizados + clase autogenerada con titleNode.SetValue(MyResources.SomeClass.MyWebPartTitle)
  8. Repita 6. y 7. Para la descripción de la parte web (XPath es "/WebParts/WebPart/Data/Properties/Property [@name = Descripción])
  9. Guardar el XMLDocument con xmlDoc.Save()
  10. Poner todo esto en FeatureReceiver.FeatureActivated Método de la función que contiene su parte web.

Otros créditos para Acantilado, Anders y Jaime.

En este caso, la forma simple de localizar un título de pieza web es modificar el campo de título del elemento de la lista:

SPList catalog = web.GetCatalog(SPListTemplateType.WebPartCatalog);

SPQuery query = new SPQuery();
query.Query = string.Format( @"<Where><Eq><FieldRef Name='LinkFilename'/><Value Type='Computed'>{0}</Value></Eq></Where>", webPartName);

SPListItem webPartItem = catalog.GetItems(query).Cast<SPListItem>().FirstOrDefault();
webPartItem[SPBuiltInFieldId.Title] = WebPartsResources.Title;
webPartItem.Update();
Licenciado bajo: CC-BY-SA con atribución
scroll top