Home RSS 2.0 ATOM 1.0  CDF  
 
CodeSegment - Carlos Segura Sanz (blog)
 
Previous Page Page 3 of 11 in the SharePoint-es category Next Page

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>

Monday, June 04, 2007 2:14:00 PM (Hora de verano romance, UTC+02:00)   #    Comments [0]   SharePoint-es  | 

Mucha gente me ha preguntado sobre la posibilidad de realizar cambios en el diseño del Wiki de SharePoint. (¿Será porque en una de mis demos enseño un Fantástico Wiki?), bueno, la respuesta es… que no se puede cambiar grrrr y explicaré  porque no.

¿Cómo está construido el Wiki de SharePoint?

El wiki de sharepoint, es una biblioteca de documentos que maneja un tipo de contenido oculto WikiDocument.

La definición XML

   1:  <ContentType ID="0x010108"
   2:          Name="$Resources:WikiDocument"
   3:          Group="_Hidden"
   4:          Description="$Resources:WikiDesc"
   5:          Version="0">
   6:          <FieldRefs>
   7:              <RemoveFieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" />
   8:              <FieldRef ID="{c33527b4-d920-4587-b791-45024d00068a}" Name="WikiField" />
   9:          </FieldRefs>
  10:          <XmlDocuments>
  11:              <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
  12:                  <FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
  13:                      <Display>DocumentLibraryForm</Display>
  14:                      <Edit>WikiEditForm</Edit>
  15:                      <New>WikiEditForm</New>
  16:                  </FormTemplates>
  17:              </XmlDocument>
  18:          </XmlDocuments>
  19:          <DocumentTemplate TargetName="/_layouts/CreateWebPage.aspx" />
  20:      </ContentType>


Cuando creamos una nueva página lo que hace sharepoint es pedirnos que rellenemos los campos a través del formulario /_layouts/createwebpage.aspx, está página nos pedirá que introduzcamos los campos Título, que asignará al documento y Contenido (WikiField) que será el contenido de nuestra nueva página.


Además si hemos añadido campos personalizados a la biblioteca de documentos, también nos pedirá que rellenemos estos.
El meollo de CreateWebPage.aspx se encuentra en la parte en que se crea el formulario:

   1:      <TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 cellspacing=0 id="formTbl" width=100%>
   2:          <TR>
   3:              <TD valign="top" class="ms-formbody" width="625px">
   4:                      <b>
   5:                      <label for="<%=Name.ClientID%>">
   6:                      <SharePoint:FieldLabel FieldName="FileLeafRef" ControlMode="New" runat="server"/>
   7:                      </label>
   8:                      </b>&nbsp;
   9:                      <asp:TextBox id="Name" name="Name" runat="server" /> 
  10:                      <SPAN class="ms-authoringcontrols"></SPAN>
  11:                      <wssawc:UrlNameValidator ID="CusValSiteName" ControlToValidate="Name" runat="server"/>
  12:                      <br />
  13:                      <span class="ms-formvalidation">
  14:                      <asp:Label id="Error" name="Error" runat="server" />
  15:                      </span>
  16:              </TD>
  17:          </TR>
  18:          <SharePoint:ListFieldIterator TemplateName="WideFieldListIterator" 
  19:              ExcludeFields="FileLeafRef" ControlMode="New" runat="server"/>
  20:      </TABLE>

Por un lado va el título, que es el nombre del documento (línea 9), con su validador que se encargará de comprobar que no exista ya un documento en la biblioteca con el mismo nombre (línea 11)  y después el resto de los campos que se renderiza mediante el control de Sharepoint ListFieldIterator (líneas 18 y 19)


En el momento en el que hacemos el submit de es este formulario, sharepoint copiará la plantilla contenida en C:\...\ Microsoft Shared\web server extensions\12\TEMPLATE\DocumentTemplates llamada wkpstd.aspx en la biblioteca de documentos asignandole como nombre el que hemos especificado, de modo que todas las páginas de nuestro wiki en realiadad son la misma ya que el contenido se aloja en la lista.


Wkpstd.aspx es la plantilla a través de la cual visualizamos las páginas Wiki.


A priori, para cambiar el diseño de nuestro Wiki, bastaría con modificar el diseño de esta página, pero el problema es que cambiarían todos los wikis de nuestro portal.
Si vemos como está construido wkpstd.aspx veremos que es una simple página que nos muestra el contenido de los datos de la lista, la parte interesante se encuentra dentro del PlaceHolderMain

   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:      <table border=0 cellpadding=2 cellspacing=0 width=100%&gt;
  12:          &lt;tr>
  13:              <td class="ms-descriptiontext" ID=onetidinfoblock2>
  14:                  <SharePoint:FormattedString FormatText="<%$Resources:wss,form_modifiedby%>" runat="server">
  15:                      <SharePoint:FormField ControlMode="Display" FieldName="Modified" runat="server"/>
  16:                      <SharePoint:FormField ControlMode="Display" FieldName="Editor" runat="server"/>
  17:                  </SharePoint:FormattedString>
  18:              </td>
  19:          </tr>
  20:      </table>
  21:  </asp:Content>


En donde se renderiza el campo WikiField primero y después el resto de los campos a excepción del nombre y del propio WikiField. (el truki del WikiField lo coemntamos más tarde)

Aquí podemos trastear para ver como los cambios hechos en esta página afectan al diseño de la página Wiki. (Guardar siempre una copia de la página original)

Wednesday, May 30, 2007 2:14:09 PM (Hora de verano romance, UTC+02:00)   #    Comments [0]   SharePoint-es  | 

Estos días, he terminado de leer dos libros de SharePoint.

Microsoft Office SharePoint Server 2007 Administrator's Companion que es un libro imprescindible con muy buenos consejos y prácticas que todo administrador de Sharepoint debería leer. El libro está escrito por Bill English y varios MVPs de SharePoint. Aunque su tamaño asuste (1200 páginas), no tiene desperdicio, cubre todos los aspectos de MOSS y está muy bien escrito. Es un libro que recomiendo tener encima de la mesa.


El otro es Microsoft SharePoint: Building Office 2007 Solutions in C# 2005 (Expert's Voice in Sharepoint) de Scot Hillier, MVP  de Sharepoint, el cual hace una introducción a diferentes aspectos de la programación en MOSS, como Workflows con Visual Studio, WebParts, vinculación con Office 2007. Otro libro muy recomendado para los que se pegan con la programación en MOSS.

 

Wednesday, May 30, 2007 10:03:55 AM (Hora de verano romance, UTC+02:00)   #    Comments [2]   SharePoint-es  | 

Este es un pequeño webpart, a su vez un clásico pero muy útil webpart, que nos permitirá recorrer la estructura de carpetas de una biblioteca de documentos. Por supuesto es para Windows Sharepoint Services 3.0 y Office Sharepoint Server 2007

¿Por cierto alguien se ha fijado en este botón que ha desaparecido en Windows Sharepoint Services 3.0 ?

Windows Sharepoint Services 2.0

 WSS3

La verdad es que aún siendo un simple history.back() era un botón muy útil.

 IdeSeg.SharePoint.WebParts.TreeExplorer.zip (9,19 KB)

Para instalarlo, descomprimir el zip

stsadm -o addwppack -filename IdeSeg.SharePoint.WebParts.TreeExplorer.cab -globalinstall
iisreset


Wednesday, March 07, 2007 4:38:38 PM (Hora estándar romance, UTC+01:00)   #    Comments [6]   csegDocLibTools | SharePoint | SharePoint-es  | 

Si recordáis en Windows Sharepoint Services 2.0 teníamos una opción para ver las carpetas de una biblioteca de imágenes, que por alguna misteriosa razón, no se encontraba disponible en las bibliotecas de documentos.

En su día, con un simple truco, podíamos tener esta opción en las bibliotecas de documentos. (http://www.ideseg.com/SharePointViewAllFoldersInDocumentLibraries.aspx) he recordado esto esta mañana cuando me he dado cuenta de que esta opción ya no está disponible ni en las bibliotecas de imágenes ni en las bibliotecas de documentos.

Ahora bien, en la carpeta (_layouts) sigue estando el archivo folders.aspx, por lo que bastaría otro simple truco (ahora una FEATURE) para devolver esa útil vista.

<?xml version="1.0" encoding="utf-8" ?>
<Feature Id="5A7074FE-C628-47eb-B905-94BF8DFD4ED4"
         Title="Vista de explorador"
         Description="Permite navegar sobre una biblioteca de documentos"
         Version="1.0.0.0"
         Scope="Web" 
         Hidden="FALSE"
         ImageUrl="actionssettings.gif"
         xmlns="http://schemas.microsoft.com/sharepoint/">
  <ElementManifests>
    <ElementManifest Location="TreeExplorer.xml" />
  </ElementManifests>
</Feature>

Y el TreeExplorer.xml

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <CustomAction
    Title="Explorardor"
    RegistrationType="List"
    RegistrationId="101"
    GroupId="ActionsMenu"
    Location="Microsoft.SharePoint.StandardMenu"
    Id="IdeSeg_TreeExplorer"
    ImageUrl="_layouts/images/GORTL.GIF">
    <UrlAction Url="/_layouts/folders.aspx?List={ListId}" />
  </CustomAction>
</Elements>

Esto nos añadirá una opción bajo el menú de acciones de una biblioteca de documentos para poder recuperar esa vista.

No es lo más bobnito del mundo, pero ayuda ...

Tuesday, March 06, 2007 12:45:15 PM (Hora estándar romance, UTC+01:00)   #    Comments [4]   SharePoint-es  | 

Hace unos días termine de leer el libro de Todd C. BleekerDeveloper’s Guide to Windows SharePoint Services 3.0”, pero hoy quiero recordaros que la revista dotNetMania, pública este mes su cuaderno técnico número 6.
Programación con SharePoint 2007”, sin duda la mejor guía para comenzar a programar para SharePoint, (además está en castellano).


El Libro ha sido escrito por un gran amigo Gustavo Vélez, compañero de blog aquí en Geeks, e incansable sufridor de SharePoint.

El libro comprende:

- Instalación y configuración de MOSS
- Modelo de Objetos
- WebParts
- Columnas de sitio y tipos de contenido
- Características
- Catalogo de datos empresariales
- Flujos de Trabajo
- Servicios de Excel

Por el momento no hay nada igual en castellano, por lo que es un libro que HAY QUE TENER.

Tuesday, March 06, 2007 11:49:02 AM (Hora estándar romance, UTC+01:00)   #    Comments [0]   SharePoint-es  | 

No sé pero últimamente me ha dado por las siglas ... Bueno que ya tenemos las versiones finales para descargar...

Windows SharePoint Services 3.0: Software Development Kit (SDK)

The Windows SharePoint Services 3.0 software development kit (SDK) contains conceptual overviews, programming tasks, samples, and references to guide you in developing solutions based on Microsoft Windows SharePoint Services 3.0.

Versión en línea

SharePoint Server 2007 SDK: Software Development Kit and Enterprise Content Management Starter Kit

The Microsoft Office SharePoint Server 2007 Software Development Kit (SDK) contains conceptual overviews, programming tasks, code samples, references, and an Enterprise Content Management (ECM) starter kit to guide you in developing solutions based on Microsoft Office SharePoint Server 2007.

Versión en línea

 

Thursday, January 25, 2007 9:36:20 PM (Hora estándar romance, UTC+01:00)   #    Comments [0]   SharePoint-es  | 

Well, today the first day of 2007,I Want to thank all the people who read this blog for this stats. Also today I received my MVP award renewal.
Gracias a todos los que me leéis, seguiré dando la lata :-)

También mis felicitaciones para Miguel Jimenez, Rodrigo Corral, Marco Amoedo, Haaron Gonzalez

Monday, January 01, 2007 11:32:14 PM (Hora estándar romance, UTC+01:00)   #    Comments [0]   Misc | SharePoint | SharePoint-es  | 

Para añadir una nueva actividad a nuestro SharePoint Designer, lo primero que debemos hacer es comenzar un proyecto de Workflow,  en concreto un Workflow Activity Library (Biblioteca de actividades para el flujo de trabajo).

A partir de ese punto crearíamos nuestra actividad, para este ejemplo voy a crear una actividad que consiste en enviar un texto al visor de eventos.

   1:  public partial class LogEventViewer : Activity
   2:  {
   3:     
   4:      public static DependencyProperty TextLogProperty =
   5:          DependencyProperty.Register("TextLog", typeof(string), typeof(LogEventViewer));
   6:   
   7:      public LogEventViewer()
   8:      {
   9:          InitializeComponent();
  10:      }
  11:   
  12:      /// <summary>
  13:      /// Valor que figurará en el visor de eventos
  14:      /// </summary>
  15:      /// <value>Texto</value>
  16:      [Description("Texto que saldrá en el visor de eventos")]
  17:      [Category("User")]
  18:      [Browsable(true)]
  19:      [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
  20:      public string TextLog
  21:      {
  22:          get { return (string) GetValue(TextLogProperty); }
  23:          set { SetValue(TextLogProperty, value); }
  24:      }
  25:   
  26:      /// <summary>
  27:      /// Ejecución de la actividad
  28:      /// </summary>
  29:      /// <param name="provider">Contexto de ejecución de la actividad</param>
  30:      /// <returns></returns>
  31:      protected override ActivityExecutionStatus Execute(ActivityExecutionContext provider)
  32:      {
  33:          EventLog eventLog = new EventLog("Workflow");
  34:   
  35:          eventLog.Source = "SharePoint Workflow";
  36:   
  37:          try
  38:          {
  39:              eventLog.WriteEntry(TextLog, EventLogEntryType.Information);
  40:          }
  41:          finally
  42:          {
  43:              eventLog.Dispose();
  44:          }
  45:   
  46:          return ActivityExecutionStatus.Closed;
  47:      }
  48:  }

 

Lo primero que hacemos es declarar una propiedad dependiente del flujo de trabajo llamada TextLogProperty, a través de la cual pasaremos el texto que deseamos visualizar en el visor de eventos.

La propiedad interna de la actividad será TextLog, esta propiedad interna obtiene y establece el valor desde la propiedad dependiente del flujo de trabajo.

Solo nos queda el método Execute, que será el encargado de realizar el trabajo de visualizar el mensaje en el visor de sucesos.

Una buena práctica es que las actividades incluyan un Validador, que yo he omitido en el ejemplo pero que es altamente recomendado aunque no sea obligatorio, ó si queremos usar la actividad con el diseñador de Visual Studio.
 
Una vez tenemos nuestro ensamblado, podemos probarlo primero (otra buena práctica) creando una aplicación host de workflow.

Por último tras asegurarnos que nuestra actividad funciona correctamente, debemos instalarla en el GAC en nuestro servidor de SharePoint. Y debemos editar el archivo web.config para incluir nuestro ensamblado en el apartado siguiente

 <System.Workflow.ComponentModel.WorkflowCompiler>
   <authorizedTypes>
       ......
     <authorizedType Assembly="IdeSeg.SharePoint.Workflow.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3bba710be857fdc1" 
                     Namespace="IdeSeg.SharePoint.Workflow.Activities" 
                     TypeName="*" 
                     Authorized="True" />
   </authorizedTypes>
 </System.Workflow.ComponentModel.WorkflowCompiler>

Ahora hemos de modificar el archivo WSS.ACTIONS que vimos anteriormente
 <Action Name="Log en visor de eventos"
         ClassName="IdeSeg.SharePoint.Workflow.Activities.LogEventViewer"
         Assembly="IdeSeg.SharePoint.Workflow.Activities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3bba710be857fdc1"
         AppliesTo="all"
         Category="Personalizadas">