Creación y Configuración de Definiciones de Sitio CON SUBSITIOS
Como muchos de ustedes ya habrán notado, cuando crean una definición de sitio tomando como base un sitio con el SharePoint Solution Generator, no importa que el sitio base contenga subsitios, estos no entrarán dentro de la Definición de Sitio que se creará, el inconveniente llega cuando queremos crear una definición de sitio con subsitios, tal como sucede cuando generamos un "Portal de Colaboración", el cual genera los subsitios:
- Centro de Documentación
- Noticias
- Directorio de Sitios
- Centro de Búsqueda
Y es allí donde esta el punto clave de este procedimiento que explicaré a continuación, si se han dado a la tarea de curiosear entre los archivos que usa MOSS para mostrar las plantillas de las Definiciones de Sitios, se habrán percatado ya que MOSS usa unos archivos XML llamados WEBTEMP<algo>.XML dentro de la ruta:
%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\<ID del IDIOMA>\XML
En dichos archivos se encuentran listadas las distintas definiciones de sitio que están configuradas en MOSS, incluso si ya se han dado a la tarea de crear sus propias definiciones de sitio, ya sea de las dos maneras que explique en mi Post anterior o de alguna otra, estos archivos serán familiares para ustedes. Pero enfoquémonos a uno en específico "webtempsps.xml", si lo abrimos en su interior aparecerá un listado de algunas definiciones de sitio, nos enfocaremos a una en específico, SIP, adivinaron, se trata de la definición de sitio "Portal de Colaboración" o "Collaboration Portal", la pueden encontrar debajo de la línea: <Template Name="SPSPORTAL" ID="47">, al ponerse a analizarla un poco y compararla con las demás definiciones de sitio vemos que esta tiene varias peculiaridades, comenzando con que ese Name que muestra en la sección de Template se refiere a una definición de sitio que no existe físicamente, y es que si vemos los demás names, la mayoría los podemos encontrar físicamente en la ruta:
%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates
Por lo que esto ya comienza a ser sospechoso, después vemos la sección de "Configuración":
<Configuration ID="0" Title="Collaboration Portal" Type="0" Hidden="FALSE" ImageUrl="/_layouts/1033/images/template_corp_intranet.png" Description="A starter site hierarchy for an intranet divisional portal. It includes a home page, a News site, a Site Directory, a Document Center, and a Search Center with Tabs. Typically, this site has nearly as many contributors as readers and is used to host team sites."
ProvisionAssembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" ProvisionClass="Microsoft.SharePoint.Publishing.PortalProvisioningProvider" ProvisionData="SiteTemplates\\WebManifest\\PortalWebManifest.xml"
RootWebOnly="TRUE" DisplayCategory="Publishing" VisibilityFeatureDependency="97A2485F-EF4B-401f-9167-FA4FE177C6F6"
</Configuration>
Y aqui podemos encontrar otra cosa interesante, esta definición de sitio hace uso de un Ensamblado llamado Microsoft.SharePoint.Publishing de una clase de ese ensamblado y de un archivo PortalWebManifest.xml que si podemos encontrar físicamente en la ruta:
%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates\WebManifest
Eureka, tenemos la respuesta, MOSS usa un ensamblado para generar sitios con subsitios, la pregunta es: ¿podemos usar este ensamblado y ahorrarnos las molestias de programar?...
La respuesta es: SÍ... Microsoft ha hecho el trabajo por nosotros y lo mejor de todo es que nos lo deja a nuestra entera disposición...
Así que aquí viene el proceso de creación de una definición de sitio con subsitios:
1. Debemos generar y configurar nuestras definiciones de sitios, tanto del sitio primario, como de los subsitios que conformarán nuestra definición... el proceso es el que les puse en el post anterior y, si usan todo en ingles, pues mejor aun, será más sencillo generarlos.
2. Ya que tenemos todas nuestras definiciones probadas, tenemos dos alternativas, dejarlas como definiciones individuales para que se generen sitios a partir de cada una de ellas y además tener una definición que use varias o todas ellas, Ó, si no queremos que estas definiciones estén disponibles para generar sitios individuales, quitarles la tentación a nuestros usuarios, como lo hacemos, pues quitando los webtemps de cada una de las definiciones que hemos configurado, vamos a la ruta:
%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\<ID del IDIOMA>\XML
y allí deberán estar los webtemps de cada definición de sitio, las distinguiremos porque tienen el nombre de nuestra definición de sitio y un ID, lo que hará que tengan un nombre extenso, así que no hay pierde. Un IISRESET para que desaparezcan.
3. Ya que quitamos la tentación podemos pasar a generar nuestra definición de sitio con subsitios, vamos a abrir el WEBTEMPSPS.xml y copiaremos la sección "configuration" de la definición de Sitio "Portal de Colaboración". Ahora cambiaremos el ID a 1, el Titulo de la definición de sitio por lo que queramos, Type y Hidden se quedan como están, ImageURL la podemos cambiar por la imagen que queramos que aparezca del lado izquierdo cuando seleccionamos esa definición de sitio, obviamente editaremos la descripción y por ultimo cambiaremos el archivo PortalWebManifest.xml por otro XML con el nombre que deseemos, el nombre lo usaremos mas adelante. Quedará algo parecido a esto:
<Configuration ID="1" Title="MiSitioConSubsitios" Type="0" Hidden="FALSE" ImageUrl="/_layouts/images/mi_logo.png" Description="Este sitio tiene subsitios"
ProvisionAssembly="Microsoft.SharePoint.Publishing, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" ProvisionClass="Microsoft.SharePoint.Publishing.PortalProvisioningProvider" ProvisionData="SiteTemplates\\WebManifest\\PortalWebManifest1.xml"
RootWebOnly="TRUE" DisplayCategory="Publishing" VisibilityFeatureDependency="97A2485F-EF4B-401f-9167-FA4FE177C6F6">
</Configuration>
4. Ahora iremos a la ruta:
%CommonProgramFiles%\Microsoft Shared\web server extensions\12\TEMPLATE\SiteTemplates\WebManifest
hacemos una copia del archivo PortalWebManifest.xml y lo editamos, dentro tendremos algo como esto:
<?xml version="1.0" encoding="utf-8"?>
<!-- _lcid="<ID del lenguaje>" _version="<version de MOSS>" _dal="1" -->
<!-- _LocalBinding -->
<portal xmlns="PortalTemplate.xsd">
<web name="Home" siteDefinition="SPS" displayName="$Resources:spscore,PortalManifest_Home_DisplayName;" description="$Resources:spscore,PortalManifest_Home_Description;">
<webs>
<web name="News" siteDefinition="SPSNHOME" displayName="$Resources:spscore,PortalManifest_News_DisplayName;" description="$Resources:spscore,PortalManifest_News_Description;" />
<web name="SiteDirectory" siteDefinition="SPSSITES" displayName="$Resources:spscore,PortalManifest_SiteDirectory_DisplayName;" description="$Resources:spscore,PortalManifest_SiteDirectory_Description;" />
<web name="SearchCenter" siteDefinition="SRCHCEN" displayName="$Resources:spscore,PortalManifest_SearchCenter_DisplayName;" description="$Resources:spscore,PortalManifest_SearchCenter_Description;" />
<web name="Docs" siteDefinition="BDR" displayName="$Resources:spscore,PortalManifest_DocumentCenter_DisplayName;" description="$Resources:spscore,PortalManifest_DocumentCenter_Description;" />
</webs>
</web>
</portal>
Aquí esta la magia del asunto... tenemos un listado con el sitio primario y los subsitios que lo componen... lo que debemos hacer es modificar el sitio primario y los subsitios con nuestras definiciones de sitios:
- Name: debemos poner el nombre que queramos que tenga nuestro sitio a nivel de URL
- siteDefinition: el nombre de la carpeta que contiene nuestra definición de sitio propia
- displayName: el nombre a nivel de sitio que queremos que tenga tanto el sitio primario como los subsitios
- description: la descripción del sitio o subsitio
Podemos poner el numero de subsitios que deseemos. Cuando lo hemos editado todo a nuestro antojo guardamos el archivo. Recuerden ponerle el nombre que usaron en el WEBTEMP, sino no se podrá encontrar el archivo al crearse el sitio.
5. Damos un IISRESET y listo, podemos probar entrando a generar una colección de sitios en la administración central, en el Tab de Publicación o Publishing debe aparecer nuestra definición de sitio y podremos generar sitios con subsitios a partir de ella.
Si tienen dudas, comentarios o les marca error algo pueden ponerme un comentario y tratare de responder lo antes posible, o mándenme un correo a ingeniero.vladimir@gmail.com
P.D.: Para los que les guste meterse a las tripas de las definiciones, un archivo que editarán muy a menudo es el ONET.XML ya que alli se encuentra la estructura de nuestro sitio, además notarán que todo esta manejado por FeatureIDs que se usan para las distintas partes del sitio (listas, Bibliotecas, etc)... asi es que una muy buena página y que les será de gran ayuda para andarle manoseando alli es esta:
http://thorprojects.com/blog/archive/2007/05/16/652.aspx
Alli encontrarán una lista de los IDs de todos los Features que contiene MOSS, lo que no aparesca alli significa que es un Feature personalizado... ojo esos IDs son solo para MOSS en ingles, en español cambian. Gracias a Robert Bogue (MVP) por compartir esa lista, que lata a de haber sido generarla...
Saludos;
Vlad