SharePoint – Destripando el Wiki (2)

Continuando con el Wiki, hemos visto como esta construido básicamente y donde oculta el secreto de las páginas que se generan, ahora bien


¿Podemos cambiar el diseño?


Una vez que hemos visto como esta construido, podemos de tratar de realizar una solución que implemente un comportamiento similar. Para ello deberemos hacer algunas cosas, como crear nuestra propia página de de entrada, y configurar una lista (biblioteca de documentos) para que realice el mismo comportamiento que el Wiki, eso es que llame a nuestra página personalizada para crear nuevas páginas.


Para crear la página de entrada podemos partir de la que trae SharePoint, CreateWebPage.aspx e implementar nuestra propia solución para que en vez de usar la plantilla del wiki por defecto Wkpstd.aspx, podamos utilizar la nuestra. A modo de ejemplo yo he creado una solución un poco más genérica que la que viene por defecto. En este caso, he llamado a la solución CustomTemplate, y lo único que hace es añadir al layouts una nueva página llamada CreateCustomPage.aspx que será la encargada de crear nuevas páginas para nuestro Wiki.


A diferencia de la CreateWebPage.aspx que copia la plantilla Wkpstd.apsx para cada una de las entradas, esta nueva página CreateCustomPage.aspx buscará una página llamada template.aspx que deberá existir en la biblioteca de documentos, para usarla como plantilla. Esto nos va a permitir tener en cada uno de nuestros wikis, una plantilla personalizada, como es lógico la solución podría extenderse incluso para tener más de una plantilla e incluso, decidir que plantilla es la que se quiere aplicar a las páginas que creemos.


Como he comentado anteriormente, podemos partir del código suministrado por CreateWebPage.aspx  y lo único que debemos hacer es modificar el Submit, para que copie nuestra plantilla



   1:  protected void SubmitBtn_Click(object sender, EventArgs e)
   2:  {
   3:      string fileName;
   4:      bool flag;
   5:   
   6:      Page.Validate();
   7:   
   8:      if (Page.IsValid)
   9:      {
  10:          fileName = Name.Text.Trim();
  11:        
  12:          if (fileName == null || fileName.Length == 0)
  13:          {
  14:              Error.Text = SPHttpUtility.HtmlEncode(SPResource.GetString(«CreateWebPageInvalidTitle», new object[0]));
  15:          }
  16:          else
  17:          {
  18:              fileName = fileName + «.aspx»;
  19:              string listGuid = Request.QueryString.Get(«List»);
  20:              try
  21:              {
  22:                  Guid guid;
  23:   
  24:                  guid = new Guid(listGuid);
  25:   
  26:                  SPList list = spWeb.Lists[guid];
  27:   
  28:                  if (list != null)
  29:                  {
  30:                      // Check if already exist the file                                               
  31:                      string newFileUrl = list.RootFolder.Url + «/» + fileName;
  32:                      if (spWeb.GetFile(newFileUrl).Exists)
  33:                      {
  34:                          Error.Text = SPHttpUtility.HtmlEncode(SPResource.GetString(«CreateWebPageDuplicateTitle», new object[0]));
  35:                      }
  36:                      else
  37:                      {                        
  38:                          
  39:                          // Get the template file
  40:                          SPFile srcFile = list.RootFolder.Files[«template.aspx»];
  41:                          byte[] binFile = srcFile.OpenBinary();
  42:   
  43:                          // Create the new file based in the template
  44:                          SPListItem item = list.RootFolder.Files.Add(fileName, binFile, false).Item;
  45:   
  46:                          // Save field values
  47:                          foreach (BaseFieldControl baseField in SPContext.Current.FormContext.FieldControlCollection)
  48:                          {
  49:                              item[baseField.Field.InternalName] = baseField.Value;
  50:                          }
  51:                          item.UpdateOverwriteVersion();
  52:                          SPUtility.Redirect(item.Url, SPRedirectFlags.UseSource | SPRedirectFlags.Static, Context);
  53:                      }
  54:                  }
  55:                  else
  56:                  {
  57:                      Error.Text = SPHttpUtility.HtmlEncode(SPResource.GetString(«CreateWebPageInvalidList», new object[0]));
  58:                  }
  59:              }
  60:              catch (Exception ex)
  61:              {
  62:                  // There is a template file ?
  63:                  Error.Text = SPHttpUtility.HtmlEncode(ex.ToString());
  64:              }
  65:          }
  66:      }
  67:  }


Una vez que tenemos nuestra solución para crear páginas, lo que debemos hacer es crear nuestra propia biblioteca de documentos para almacenar las páginas de nuestro wiki. Para que esta biblioteca de documentos pueda usar nuestra página personalizada para crear contenido CreateCustomPage.aspx, tendremos que crear un tipo de contenido y asignarle nuestra página.



Podemos aprovechar este tipo de contenido para albergar más columnas que luego formen parte de la plantilla, imágenes, y otros cosas. Por último el campo WikiField, El campo WikiField, es básicamente el contenido de nuestra página, y es un campo especial de SharePoint,  que debemos respetar ya que tiene un comportamiento particular, tanto para la entrada de datos como a la hora de renderizarse, ya que trata realiza un tratamiento especial para los los vínculos. Aquí tenemos otro problema ya que tanto la definición del tipo de contenido para los Wikis así como la definición del campo WikiField esta oculta.


De modo que no podemos implementarla directamente y deberemos crear nuestro propio tipo de contenido, para ello, podemos copiar la definición que vimos anteriormente e implementarlo como una característica de modo que podamos asignarlo a cualquier biblioteca de documentos.


feature.xml 

   1:  <?xml version=»1.0″ encoding=»utf-8″ ?>
   2:  <Feature  Id=»6D145000-D35F-43af-83A2-797A263A3ABC»
   3:            Title=»Custom Wiki Content Type»
   4:            Description=»Wiki content type to use templates»
   5:            Version=»12.0.0.0″
   6:            Scope=»Site»
   7:            xmlns=»http://schemas.microsoft.com/sharepoint/»>
   8:      <ElementManifests>
   9:          <ElementManifest Location=»elements.xml» />
  10:      </ElementManifests>
  11:  </Feature>
 


elements.xml

   1:  <?xml version=»1.0″ encoding=»utf-8″ ?>
   2:  <Elements xmlns=»http://schemas.microsoft.com/sharepoint/»>
   3:  <ContentType ID=»0x010100f7c73f52e54d0bbdf1e83273d6db6800″         
   4:          Name=»Template based Wiki»      
   5:          Description=»Template based wiki»
   6:      Group=»IdeSeg»
   7:          Version=»0″>
   8:          <FieldRefs>         
   9:              <RemoveFieldRef ID=»{fa564e0f-0c70-4ab9-b863-0177e6ddd247}» Name=»Title» />
  10:              <FieldRef ID=»{c33527b4-d920-4587-b791-45024d00068a}» Name=»WikiField» />
  11:          </FieldRefs>
  12:      <XmlDocuments>
  13:              <XmlDocument NamespaceURI=»http://schemas.microsoft.com/sharepoint/v3/contenttype/forms»>
  14:                  <FormTemplates xmlns=»http://schemas.microsoft.com/sharepoint/v3/contenttype/forms»>
  15:                      <Display>DocumentLibraryForm</Display>
  16:                      <Edit>WikiEditForm</Edit>
  17:                      <New>WikiEditForm</New>
  18:                  </FormTemplates>
  19:              </XmlDocument>
  20:          </XmlDocuments>
  21:          <DocumentTemplate TargetName/_layouts/CreateCustomPage.aspx» />
  22:  </ContentType>
  23:  </Elements>


Finalmente solo nos queda hacer las modificaciones pertinentes en la plantilla de las páginas Wiki e introducirlas en nuestra biblioteca de documentos como template.aspx. En el ejemplo inferior, he añadido el creador de la entrada del Wiki.



   1:  <asp:Content ContentPlaceHolderId=»PlaceHolderMain» runat=»server»>
   2:      <SharePoint:FormField FieldName=»WikiField» ControlMode=»Display» runat=»server»/>
   3:      <TABLE class=»ms-formtable» border=0 cellpadding=0 id=»formTbl» cellspacing=0 width=100%>
   4:              <SharePoint:ListFieldIterator
   5:                          ControlMode=»Display»
   6:                          TemplateName=»WideFieldListIterator»
   7:                          ExcludeFields=»FileLeafRef;#WikiField»
   8:                          runat=»server»/>
   9:      </TABLE>
  10:      <WebPartPages:WebPartZone runat=»server» FrameType=»None» ID=»Bottom» Title=»loc:Bottom»>
  11:      <ZoneTemplate></ZoneTemplate>
  12:      </WebPartPages:WebPartZone>
  13:      <!– BEGIN CUSTOM –>
  14:      <table border=0 cellpadding=2 cellspacing=0 width=100%>
  15:          <tr>
  16:              <td class=»ms-descriptiontext» ID=onetidinfoblock2>
  17:                  <SharePoint:FormattedString FormatText=»<%$Resources:wss,form_createdby%>» runat=»server»>
  18:                      <SharePoint:FormField ControlMode=»Display» FieldName=»Created» runat=»server»/>
  19:                      <SharePoint:FormField ControlMode=»Display» FieldName=»Author» runat=»server»/>
  20:                  </SharePoint:FormattedString>
  21:              </td>
  22:          </tr>
  23:      </table>
  24:      <!– END CUSTOM –>
  25:      <table border=0 cellpadding=2 cellspacing=0 width=100%>
  26:          <tr>
  27:              <td class=»ms-descriptiontext» ID=onetidinfoblock2>
  28:                  <SharePoint:FormattedString FormatText=»<%$Resources:wss,form_modifiedby%>» runat=»server»>
  29:                      <SharePoint:FormField ControlMode=»Display» FieldName=»Modified» runat=»server»/>
  30:                      <SharePoint:FormField ControlMode=»Display» FieldName=»Editor» runat=»server»/>
  31:                  </SharePoint:FormattedString>
  32:              </td>
  33:          </tr>
  34:      </table>
  35:  </asp:Content>

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *