Wednesday, July 22, 2009

Cannot make a cache safe URL for "init.js", file not found

Sí, me dijeron que debía instalar un paquete de lenguaje, porque el sitio que se está intentando subir al nuevo servidor utiliza un lenguaje diferente del instalado con mi MOSS 2007, pero aun no funciona…

Así te puedes pasar todo el día, si efectivamente instalas tú Language Pack, que estoy seguro lo encontraste aquí:
http://www.microsoft.com/downloads/details.aspx?FamilyID=2447426b-8689-4768-bff0-cbb511599a45&displaylang=en

Pero el siguiente mensaje seguirá apareciendo: Cannot make a cache safe URL for "init.js", file not found. Please verify that the file exists under the layouts directory.

Lo que ocurre es que muy seguramente estas intentando subir un sitio que fue desarrollado utilizando WSS 3.0 a tú nuevo y reluciente MOSS 2007.  Ahí está el problema, de igual forma debes instalar el Language Pack del idioma utilizado por el sitio, pero para esa versión de Sharepoint específica, la cual está por aquí: http://www.microsoft.com/downloads/details.aspx?FamilyId=36EE1BF0-652C-4E38-B247-F29B3EEFA048&displaylang=en

Felíz restore

Tuesday, June 23, 2009

Preparando Exam 70-541

Algunos links para cubrir los temas que se preguntan en el examén:

1. Deploy a Web Part to the Windows SharePoint Services server.

  1. Register an assembly as a safe control in the Web.config file
    ”To deploy the Web Part to your WSS Site, you must then register the control as safe in web.config’s SafeControls node, as described in Chapter 3. Assuming the project name LitwareWebParts, the following entry in the SafeControls node in web.config will register the assembly and namespace as safe.
    <SafeControl Assembly="LitwareWebParts" Namespace="LitwareWebParts"
        TypeName="*" Safe="True" />
    Note that for this example, we are not strong-naming the assembly, and therefore we can use the simple name of the assembly. When you strong-name the assembly, you should always register the SafeControl entry using the full four-part assembly name.” [1]

Monday, May 04, 2009

Operation is not valid due to the current state of the object.

O debería decir mejor:

The database WSS_Content on ComputerName\Microsoft##SSEE is not accessible to missing Windows Internal Database signatur

Pasaron una cuantas horas y un colapso de mi sistema nervioso para llegar hasta aquí y gracias a los logs de windows y del propio Sharepoint.

untitled

http://support.microsoft.com/kb/944267/en-us/

- Primer consejo, lean todas esas entradas de Microsoft en inglés, la traducción es sencillamente una pestilencia.

- Segundo, estos errores de verdad que pueden causarle a un mortal un colapso nervioso, más cuando hay grandes proyectos de por medio que de un momento a otro dejan de andar.

-

En letra roja les digo que corran esto con mucho cuidado, por ejemplo lo que hacen ahi vuelve y deja los archivos web.config de sus sitios con la configuración original, así que si tienen en estos entradas personalizadas se van a perder. Esto es el caso cuando hemos utilziado webparts, páginas aspx, en fin extensibilidad a través de programación para sharepoint que siempre requiere modificar el web.config.

La teoría dice que una actualización pudo haber sido instalada, yo la verdad no pude ver en qué momento esto sucedió, así que creo que Microsoft debería hacer algo al respecto porque este error cuesta varias horas y que los sitios de Sharepoint dejen de funcionar abruptamente.

Felíz solución

AJAXControlToolKit – El blog de Pinocho

En el siguiente blog dicen algunas mentirillas, que no lastiman a nadie pero si nos vuelven paranóicos a los principiantes:

http://weblogs.asp.net/jan/archive/2007/02/26/using-the-ajax-control-toolkit-in-sharepoint.aspx

Nuestro buen amigo dice que para poder utilizar el ACT en Sharepoint es necesario agregar un par de entradas en los tags assemblies y controls del web.config. MENTIRA!!

Eso para nada es necesario amigos mios, lo único que Sharepoint quiere es que la dll del ACT sea confiable para el, así que la primera nota del amigo sí es cierta, pero solo la mitad, debemos poner la DLL en la carpeta BIN del sitio de Sharepoint.

Algunos blogs parecen autoria de Pinocho, pero solo con la práctica nos vamos dando cuenta de que muchas cosas le han pasado inadvertidas a muchas personas.

Feliz práctica

Saturday, April 25, 2009

Sharepoint List … Programáticamente

Hola de nuevo, y esta vez quiero mostrar un sencillo ejemplo de cómo podemos guardar información en una lista previamente configurada en Sharepoint.

Suponiendo que tenemos una página aspx en la cual programamos una interfaz adecuada para ingresar los valores y posteriormente guardarlos en la lista, el código de ejemplo quedaría de la siguiente forma:

Protected Sub btnGuardar_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGuardar.Click
        SPSecurity.RunWithElevatedPrivileges(AddressOf Guardar)
    End Sub

    Private Sub Guardar()
        Dim objSitio As SPSite = New SPSite(ConfigurationManager.AppSettings("MiSitio"))
        Using objWeb As SPWeb = objSitio.OpenWeb()
            objWeb.AllowUnsafeUpdates = True
            Dim objLista As SPList = objWeb.Lists("MiLista")
            Dim objItem As SPListItem = objLista.Items.Add()
            objItem("Campo 1") = "xxxx"
            objItem("Campo 2") = "yyyy"
            objItem.Update()
            objWeb.AllowUnsafeUpdates = False
        End Using

    End Sub

Lo primero y más importante es la llamada al método:

SPSecurity.RunWithElevatedPrivileges(AddressOf Guardar)
Con lo anterior aseguramos que un usuario que ha iniciado sesión en el sitio de Sharepoint pueda ejecutar la acción.

Ya en el método Guardar(), se supone que ya existe un sitio llamado MiSitio, con una lista en ese sitio llamada MiLista la cual tiene una serie de campos, Campo 1 y 2. Eso obviamente lo deben cambiar a sus valores reales.

Lo realmente importante es la llamada a la propiedad AllowUnsafeUpdates con el valor true, lo cual le dice a la Lista que debe quedar hábilitada para permitir la actualización cuando se invoca el método  Update().

Lo anterior, que conste que lo escribo en letra roja, es practicamente una impersonación, así que hasta el más razo de los usuarios (read only) podrá hacer una actualización sobre esa lista. Por lo tanto miren la llamada nuevamente a AllowUnsafeUpdates pero esta vez asignado a False, porque puede ser un hueco de seguridad lo anterior. Además si ustedes quieren que la actualización la pueda ejecutar únicamente un usuario con mayores privilegios pues es cuestión de adicionar código que valide el grupo o algo por el estílo que verifique los permisos de dicho usuario, ya que lo anterior lo puede ejecutar cualquiera.

Felíz Update.

Thursday, April 16, 2009

Windows Sharepoint Services Book – OnLine

Esto me dió gran sorpresa y entusiasmo que se comparta un preview de un libro tan maravilloso sobre la tecnología ya que para los que lo compramos desafortunadamente no trae una versión dígital o los que les interese comprarlo puedan darle un vistazo antes de. Afortunadamente como lo dije en un post anterior el libro vale mucho la pena por cada dolar invertido.

http://techbus.safaribooksonline.com/9780470127285/dear_reader

Felíz preview

Wednesday, April 15, 2009

El GridView programático … una triste história

Si han seguido un post anterior sobre el gridview programático notaron que todo marchó a pedir de boca.

Pero cuando habilité la paginación del gridview en la webpart apareció este engendro sobrenatural:

Server Error in '/' Application.

Object reference not set to an instance of an object.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.]
System.Web.UI.WebControls.GridView.get_StateFormatter() +25


Lo anterior es lo ocurrido cuando el gridview queda configurado para paginación. ¿Pero cómo se logra el error anterior?



Antes





Protected Overrides Sub CreateChildControls() 
           Dim customField As New TemplateField 


            customField.ItemTemplate = New GridViewTemplate(DataControlRowType.DataRow, "", Me.Imagen, Me.Titulo, Me.Resumen, Me.Contenido) 
            grvPrueba = New GridView() 
             grvPrueba.AutoGenerateColumns = False             grvPrueba .ShowHeader = False             grvPrueba .RowStyle.CssClass = Me.EstiloFila             grvPrueba .AlternatingRowStyle.CssClass = Me.EstiloAlternado 
            If Paginar Then 
                grvPrueba .AllowPaging = Paginar 
                If Me.NumeroRegistros > 0 Then 
                    grvPrueba .PageSize = Me.NumeroRegistros 
                End If 
            End If 
            grvPrueba.Columns.Add(customField) 
            grvPrueba.DataSource = ConsultarLista() 
            grvPrueba.DataBind() 
            AddHandler grvPrueba.PageIndexChanging, AddressOf grvPrueba_PageIndexChanging 
Me.Controls.Add(grvNoticias) 
        End Sub


¿Si han notado que dejo para el final el agregar el gridview a la colección Controls de la webpart? Pues eso es un grave error cuando el gridview permitirá la paginación y cuesta un par de tasas de café y una tarde entera de trabajo perdido. El por qué del error, creo quedo en deuda con la explicación de fondo porque no sé la razón.



Solución



En seguida de la creación del GridView este se debe agregar a la colección Controls de tal forma que nos queda así:



grvPrueba= New GridView()

Me.Controls.Add(grvPrueba)




Feliz GridView programático

Wednesday, April 08, 2009

Una luz en el tunel … Guía Sharepoint

Quiero para los que no sepan que existe una guía de Patterns & Practices para Sharepoint darles el siguiente link:

http://msdn.microsoft.com/en-us/library/dd203468.aspx

Es muy bueno sentarse a revisar esto antes de tomar desiciones sobre la arquitectura y desarrollos para Sharepoint.

Y aprovechando esta entrada también darles el link a la revista de Sharepoint en español que me parece una grandiosa entrega del tema.

http://www.gavd.net/servers/compartimoss/compartimoss_main.aspx

Felíz arquitectura

TemplateField el Gridview programático

Teniendo que hacer una WebPart para WSS 3.0 necesitaba incluir un Gridview como control de la webpart pero con controles dentro de el como lo podemos hacer desde el diseñador de visual studio.

<asp:GridView ID="gvWebPart" runat="server" AutoGenerateColumns="false">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <div>
                                  <asp:HyperLink  ID="lblContenido" runat="server" Text='<%# Bind("campo")  %>'   ></asp:HyperLink>
                                    </div>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>

Pero lo anterior solo se logra en un proyecto de tipo ASP.NET, pero en un proyecto tipo Webpart? La respuesta está aquí igualmente para cualquier otro proyecto donde no podemos hacer lo anterior vía el diseñador:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.templatefield.aspx

Felíz Gridview programático

Sunday, March 22, 2009

Code behind en las páginas maestras o de contenido en Sharepoint

Mucho se ha escrito sobre este tema. Pero espero contribuir de manera práctica sin mucho enredo sobre esto.

1. Lo primero que vamos hacer es crear un proyecto de librería de clases en VS.NET 2005 o 2008, da igual al cual llamaremos MasterPageCustom. Les sugiero crear ese proyecto en C#. Las páginas de Sharepoint utilizan ese lenguaje por defecto. Aunque en este momento me estoy preguntando qué pasa si ponemos a trabajar eso con VB.NET, pero si no es molestía seleccionen C#.

2. Supongamos que vamos a asignarle un poco de lógica a nuestra página mestra, que hemos personalizado para nuestro proyecto, y a la que hemos colocado una etiqueta (Label) que deberá desplegar el título de nuestro sitio dinámicamente. El objetivo es que este simple ejemplo, les de pie para construir lo que deseen en su página maestra o páginas de contenido (ASPX). Asignenle un nombre al archivo .cs por ejemplo Master.cs, igual utilicen ese nombre para su clase. El caso es que deben tener algó así:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls ;

namespace MasterPageCustom
{
    public class Master : MasterPage
    {
        protected Label  lblTitulo;

        protected override void OnLoad(EventArgs e)
        {
            SPSite objSitioActual = SPControl.GetContextSite(Context);
            using (SPWeb objWeb = objSitioActual.OpenWeb())
            {
                this.lblTitulo .Text = objWeb.Title;
            }

        }

    }
}

Pongan atención a la definición del Label, la reescritura del evento Load que escuchará cuando se carga la Master, y por supuesto la herencia de la clase MasterPage. Lo demás es carpinteria del modelo de objetos de Sharepoint.

3. Compilen y firmen su proyecto de libreria de clases. La firma nos permite arrastar y soltar el assembly en el GAC. Entonces coloquen el assembly en el GAC.

4. Es momento de decirle a Sharepoint que les permita ejecutar el assembly, esto lo hacen asignando la siguiente entrada en el Web.config asociado con el sitio de sharepoint que están trabajando. Busque en su web.config la sección adecuada, en este caso <SafeControls>.

<SafeControl Assembly="MasterPageCustom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=254e1a9738d6d566" Namespace="MasterPageCustom" TypeName="*" Safe="True" />

5. Con lo anterior configurado finalmente debemos asignar el archivo Master.cs a la página maestra, sencillamente en la siguiente línea de su archivo .master asociado a su sitio de Sharepoint hacen el siguiente cambio.

<%@Master language="C#" Inherits="MasterPageCustom.Master,MasterPageCustom,Version=1.0.0.0, Culture=neutral, PublicKeyToken=254e1a9738d6d566" %>

Importante: El valor de PublicKeyToken, obviamente cambiará según su libreria de clases, y lo pueden ver en el GAC muy fácilmente viendo las propiedades del archivo ahi mismo.

Si todo va bien lo anterior estará funcionando sin problema y desplegandoles el título asignado a su sitio raíz o subsitio en el Label que se ha colocado en la Master.

Además del tema técnico, lo que vemos aquí es la potencia de Sharepoint + .NET, que nos permitirá hacer muchas cosas espectaculares de forma programática.

Feliz code behind!!

Saturday, March 21, 2009

Sharepoint Tips y Tricks I Parte

Tip 1- Comprando libros

El primer consejo que les puedo dar es, compren libros, muchos libros, pero que ojalá y obviamente sean buenos. Para ahorrarles en gastos innecesarios, dejenme recomedarles dos biblias excelentes. Muy claramente un libro es sobre Windows Sharepoint Services 3.0 y el otro es sobre MOSS 2007. Estos dos engendros se han convertido en mi mejor fuente de información, por su claridad y excelente forma de explicar cada concepto de estos dos sabores de Sharepoint. Les dejo el enlace de Amazon para que detallen y analicen si los adquieren o no, yo lo hice a ojo cerrado:

http://www.amazon.com/Mastering-Windows-SharePoint-Services-3-0/dp/0470127287/ref=sr_1_16?ie=UTF8&s=books&qid=1237687347&sr=1-16

http://www.amazon.com/Microsoft-Office-SharePoint-Server-Practices/dp/0735625387/ref=sr_1_1?ie=UTF8&s=books&qid=1237687534&sr=1-1

Tip 2- Lean estos artículos antes de...

La revista MSDN Magazine llega con un muy interesante artículo, donde los autores comparten experiencias de la vida real y hacen unas excelentes recomendaciones, que dada mi experiencia uno debería tomar en cuenta antes de hacer cualquier cosa con Sharepoint, llamese WSS 3.0 o MOSS 2007.

http://msdn.microsoft.com/es-co/magazine/dd458798.aspx

Igualmente detallen cada uno de los artículos que el citado enlaza poque son igualmente muy buenos, sobre todo si somos desarrolladores marca Sharepoint.

Tip 3- Ya me leí los artículos y ahora?

Después de tener conceptos claros, por lo menos lo básico, es hora de destapar la caja e instalar Sharepoint, aclaro que la instalación debió ser tema de lectura antes de, porque es todo un proceso de cuidado. Si la intención es un ambiente de desarrollo, les recomiendo mucho tener claro el punto del artículo recomendado en Tip 2 "Desarrollando sin Servidor", es decir, que no necesariamente tenemos porque instalar Visual Studio .NET en el servidor donde reside Sharepoint, la idea consumir los Web Services que ofrece la plataforma http://msdn.microsoft.com/es-co/library/ms458094.aspx. Si es un máquina virtual lo que ustedes desean pues simplemente instalen todo ahi. Mi recomendación es que dejen la máquina virtual para juegos con muñecas, en un proyecto real, lo mejor es tener un buen servidor donde desarrollador y diseñador puedan trabajar a la par, ya que las exigencias de negocio de cada cliente exigirán la presencia de estos dos individuos, porque no hay cosa que el usuario final deteste más que el diseño por defecto de Sharepoint. Quieren comenzar a modificar el diseño básico de Sharepoint? todo un reto, y les recomiendo leer sobre Branding en Sharepoint. Si su diseñador es hábil, como en mi afortunado caso, presentenle Sharepoint Designer, aunque igual este señor los regañará, porque realmente lo que Designer hace con el HTML de las páginas, es sencillamente desastrozo, o bueno por lo menos desde la perspectiva del diseñador, quien está acostumbrado a ver cosas más "limpias". Pero no habiendo más, es hora de explotar Sharepoint designer, así que una buena idea es comenzar viendo a los mejores: http://www.microsoft.com/downloads/details.aspx?familyid=5B10F061-41D4-48CE-85CB-01D46772240D&displaylang=en

No desperdicien dinero en libros de este engendro, que quede claro, no lo veo nada necesario.

Mis consejos son:

- Dejen las páginas maestras de Sharepoint quietas, no las modifiquen, creen sus propias páginas maestras, ojalá basadas en las por defecto y de ahi comiencen el embellecimiento.

- Estudien los formularios ASPX propios de Sharepoint, esos utilizan páginas maestras por defecto de Sharepoint, y por lo tanto no se renderizan con su página maestra, pero aclaro, pueden ponerlos apuntar a la que ustedes construyan. Sinceramente esos formularios propios de Sharepoint, deberían tratar de dejarlos como vienen, a no ser que el cliente les exija que debe conservarse el diseño en todos los rincones, hasta en los más reconditos. Esas formas son por ejemplo: DispForm.aspx, EditForm.aspx, NewForm.aspx.

- Dejen su página mestra global a todo sitio de su proyecto Sharepoint. How To? Primero coloquen su nueva master en el sitio raíz y en cada subsitio que la requiere sencillamente apunten con esta línea en sus páginas ASPX: MasterPageFile="~sitecollection/_catalogs/masterpage/miMaestra.master"

No se inventen más de dos páginas maestras por sitio, es decir máximo yo aconsejo tener la maestra del Home, cuando el cliente requiere que este sea totalmente diferente de lo demás, y su maestra global a cada subsitio. Esto ahorrará dolores de cabeza a ustedes y al adminstrador final.

- Como para el diseñador no hay vida después de las hojas de estilo o CSS, sencillamente estas serán creadas desde cero para su nueva personalización y será enlazada a través de su página mestra global: <link rel="stylesheet" type="text/css" href="miCSS.css"/>

Algo que deberán enfrentar seguramente, si nuevamente cuentan con un gran diseñador que quiere hacer retoques especiales a cosas como WebParts, es que se debe sobreescribir los estilos definidos en CORE.CSS, la hoja de estilos propia de Sharepoint, lo cual se puede lograr en miCSS.css. Les doy un ejemplo, imaginen que quieren ocultar el header de sus webparts, donde sharepoint coloca los titulos de las columnas que se muestran en cada webpart. Hacen esto en su CSS y listo, el estilo por defecto queda sobreescrito:

.default .ms-viewheadertr {
    display:none;
}

Pero deben tener cuidado que lo anterior afectará todos y cada uno de los formularios ASPX que muestran webparts, lo cual no puede ser muy deseable, pero esto ya será vuestro problema.

Esta es mi primera entrada sobre temas relacionados a Sharepoint, que espero poder seguir escribiendo para dar guia y recibir su retroalimentación y así compartir las lecciones aprendidas.

Un abrazo!!