Archivo de la categoría: jQuery y SharePoint

Superar problema molesto con las direcciones URL relativas en lanzamiento rápido de SharePoint

Quería añadir un enlace a la navegación de lanzamiento rápido el otro día y me dijo que SharePoint:

image

Versión en texto puro de es:

Asegúrese de que la URL es válida y comienza ya sea con un carácter válido (un signo de número (#) o diagonal (/)) o un protocolo válido de apoyo (por ejemplo, ' http://’, ' https://’, ' archivo://’, ' ftp://’, ' mailto:’, ' noticias:’).

"Blech y pox!"Le dije.

Una solución a esto es utilizar JavaScript para encontrar un vínculo conocido en la puesta en marcha rápida y reemplazar su comportamiento.

Para probar esto, Añadir un nuevo enlace a su sitio de prueba así:

image

He usado jQuery. Para resolverlo, JavaScript y jQuery hasta la página usando su técnica favorita y con una línea de código como esta:

 

$(documento).listo( función () {

    $("un:contiene('Test reemplazo URL')").Haga clic en(función () { alerta("Haga clic en nuevo comportamiento!"); retorno falso;});

});

Y Bob, su tío.

El selector de jQuery se encuentra cada <un> etiqueta que tenga "prueba enlace" en su nombre. Quizá quieras buscar-melodía que dependiendo de su enlace y tal.

El .click(función() reemplaza lo que habría hecho SharePoint cuando el usuario hace clic en. Asegúrese de que usted "return false" o bien se haga su trabajo y luego intentar lo href también, casi seguro que no es su meta.

Esto fue hecho y prueba en un entorno de SharePoint en línea pero debe funcionar bien en 2010 y antes también.

</final>

undefinedSuscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Rápida y sencilla: Resolver "parámetro de URL no válida” problema con UpdateListItems en lists.asmx

Cuando se trabaja con UpdateListItems vía lists.asmx, es fácil generar el error:

Parámetro de URL no válida.

La URL proporcionada contiene un comando no válido o valor. Por favor comprueba la URL otra vez.

Usted puede conseguir este error cuando se olvida de incluir ID en la la lista de campos para actualizar.  Esto, como muchos de estos SP servicios web, es un poco ilógica puesto que es necesario incluir el ID en el atributo ID de la <Método> elemento.  Y no estás actualizado ID y probablemente nunca quiero en primer lugar.

Este sobre jabón funciona:

<soapenv:Xmlns envolvente:soapenv =' http://schemas.xmlsoap.org/SOAP/Envelope/'>
  <soapenv:Cuerpo>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <actualizaciones>                     
         <Lote OnError ="Continuar">
          <Método ID ="1" Cmd ="Update">
            <Nombre del campo ="CooperativeLock">bloqueado!</Campo>
            <Nombre del campo ="ID">1</Campo>
          </Método>
        </Lote>                     
        </actualizaciones>                
      </UpdateListItems>             
  </soapenv:Cuerpo>         
</soapenv:Envolvente>

Si tiras a la referencia del campo ID entonces obtendrás el molesto mensaje "Parámetro de URL no válida".

</final>

undefinedSuscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

 

Pobre del almacenamiento en caché en JavaScript

[TL;Versión DR: utiliza cookies para almacenar los resultados de las llamadas asincrónicas; prestar inmediatamente los resultados de las últimas llamadas asincrónicas y validarlos luego después de carga de la página.]

He estado trabajando en sitio de intranet de SharePoint para un cliente que ofrece, entre otras cosas, una estilizada navegación secundaria cuyas opciones del menú se administran mediante una lista personalizada vieja regular.  La idea es que el cliente obtiene al menú de "su" sitio de control sin afectar o ser afectados por la navegación global por lo.

(Hay algo increíblemente subversiva con la adición de un CEWP que apunta a un archivo HTML que carga un CSS y JS fundamentalmente modificar casi todo sobre el comportamiento de un sitio... pero eso es para otro post)

El código para esta bastante simple:

El dolor punto aquí es cada vez que alguien golpea una de las páginas del sitio, navegador del usuario es llegar a obtener elementos de la lista.  Una vez termine la dev y pruebas han demostrado que todo sea estable y completa, esta llamada no es necesaria más de 99% el tiempo desde el menú rara vez cambia.  También tiene un raro efecto UI que es común en este nuevo mundo de sitios web de hiper-ajaxy – hace que la página y sólo entonces hace el menú render.  Es nervioso y distracción en mi punto de vista.  Y nervioso. Por lo tanto, almacenamiento en caché. 

Modifiqué la lógica de esta manera:

  • Busque una cookie en el navegador que contiene el menú como último lo leí
    • Si encuentran, hacerla inmediatamente.  No esperes a terminar de cargar la página.  (Usted necesita para asegurarse de que el código HTML está ubicado estratégicamente aquí, Pero no es difícil de hacer).
  • Esperar a que la página termine de cargar y hacer un async llamar a cargar los elementos de menú de una lista utilizando el resto lists.asmx o lo que sea
  • Comparar lo que tengo contra la cookie
    • Si coincide con, PARADA
    • De lo contrario, utilizando jQuery, rellenar dinámicamente un montón si <Li>está en un <UL>
  • Usar CSS para hacer todo el formato
  • Beneficio!

Algunos de ustedes van a decir, "Hola! no habrá verdadera caché aquí puesto que estás leyendo el menú de todos modos cada vez.”  Y tienes razón, no voy a dar al servidor cualquier tipo de rotura.  Pero porque la llamada asincrónica y ocurre después de la Página inicial carga HTML representa plenamente, "parece" más sensible al usuario.  El menú bastante rinde tanto como la página dibuja.  Si el menú pasa al cambio, el usuario se somete a un nervioso volver a dibujar del menú, Pero sólo una vez.

Hay algunas maneras de hacer más eficaz esta caché y ayudar al servidor al mismo tiempo:

  • Poner en una regla que la caché"cookie" es válida para un mínimo de 24 horas o algunos otros plazos. Mientras no hay ninguna cookie caducada, usar copias instantáneas de menú de la cookie y nunca golpeó el servidor.

Bueno... eso es lo que vienen a la mente ahora :). 

Si alguien tiene alguna idea inteligente aquí me encantaría conocerlos.

Y por último – esta técnica puede utilizarse para otras cosas.  Página de mi cliente tiene un número de cosas basadas en datos de varias páginas, muchos de ellos cambiando relativamente raramente (como una vez por semana o una vez al mes).  Si destino áreas específicas de la funcionalidad, Puedes darle una interfaz de usuario más sensible tirando de contenido de la tienda local de galleta y procesamiento inmediato.  Se siente más rápido para el usuario incluso si no estás salvando el servidor cualquier ciclos.  Te puede Guarde los ciclos del servidor por decidir sobre algunas condiciones y disparadores para invalidar esta caché local cookie.  Eso es todo situacional artístico y verdad lo más divertido :). 

</final>

undefinedSuscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Muestras de XSLT y jQuery

Vengo haciendo mucho de XSLT y jQuery y pensamiento que comparto algunos fragmentos que otros pueden resultar útiles en el futuro.

Ejemplo 1: Emiten simple JavaScript / jQuery en XSLT:

<XSL:Partido de plantilla = "algo" XML:Space = "preserve">

  <!– En blanco el campo oculto de filtros amigable de consulta –>
  <tipo de secuencia de comandos = "text/javascript">
    $(documento).listo(función(){
      $("#QueryFriendlyFilters").Val("vacía");
    });
  </secuencia de comandos>

</XSL:plantilla>

Que bit emite algunos JavaScript que espera de la página finalizar la carga (debido a la $(documento).listo(…)) y, a continuación, establece el valor de un campo oculto llamado QueryFriendlyFilters el valor literal "vacía".

Ejemplo 2: Uso <XSL:Si> para comprobar la "mayor que",  "menor que", etc..

<XSL:Partido de plantilla = "algo" XML:Space = "preserve">

  <div id = "fdcAllFilters">
 
    <XSL:Si test="@Count>0">
      <span class = "fdcFilterLabel">Filtros actuales:</abarcan>
    </XSL:Si>

    <!– más cosas sucede aquí. –>

</XSL:plantilla>

El fragmento de código anterior comprueba si un atributo denominado "Contar" del elemento "algo" es mayor que cero.  El XML detrás de todo esto sería algo así como:”

<algo Count = "5" />

Ejemplo 3: Recorrer en iteración todos los elementos, intercalando llamadas jQuery.

<!– Recorrer en iteración todos los filtros y mostrar la correcta  enlaces. –>
<XSL:for each select = "UserFilter">

  <una clase = "FilterHref" href = "javascript:mySubmitPage('RemoveUserFilter','{@ ID}’)">[X]</un>

  <span class = "fdcFilterLabel"><XSL:valor de select="@FilterValue"/></abarcan>

  <tipo de secuencia de comandos = "text/javascript">

    $(documento).listo(función(){
        <XSL:texto><![CDATA[$("#QueryFriendlyFilters").Val( ($("#QueryFriendlyFilters").Val() + " ]]></XSL:texto>\"<XSL:valor de select="@FilterValue"/>\"<XSL:texto><![CDATA["));]]></XSL:texto>
    });

  </secuencia de comandos>

</XSL:para cada>

El fragmento de código anterior es el más complejo y puede haber formas más fácil de hacerlo.

El XML detrás de todo esto más o menos este aspecto:

<UserFilter ID = "123" FilterValue = "xyzzy" />

Este fragmento es iterar a través de <UserFilter> nodos. 

Primero emite un ancla de etiqueta que cuando hace clic en invoca una función de JavaScript que ya está en la página, "mySubmitPage" y pasa el valor de un atributo la <UserFilter> nodo denominado "ID". 

A continuación, emite algunos jQuery que espera para que cargar la página.  Que jQuery actualiza un campo oculto denominado "QueryFriendlyFilters" agregando el valor del atributo FilterValue.  Nota todos los locos <XSL:texto> y <![CDATA[ … ]]> cosas.

Eso es todo, esperanza de ayuda!

</final>

Suscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Lists.asmx, GetListItems y carpetas

Estaba haciendo algunas investigaciones para alguien hoy alrededor del servicio web de list.asmx proporcionado como parte de SharePoint 2010 (y anteriores).  Ella fue capaz de obtener los elementos de lista en la carpeta raíz (incluidos los nombres de las subcarpetas), pero no se pudo obtener elementos en las subcarpetas.  Hice algunos mirando alrededor de la internets y es una cuestión sorprendentemente común.  Todavía, No podía obtener una buena respuesta a la pregunta simple, "si sé la carpeta, Cómo obtener los elementos de la carpeta?”  Para ser honesto, No intente duro todo lo que ya he quería figura esta uno fuera de mi propia durante un tiempo Sonreír.

Para configurar esto, He creado un sitio llamado "Blogging escenarios" y una lista personalizada denominada "Lista personalizada con las subcarpetas".  A continuación, crear carpetas con el nombre:

  • Año 2005
  • Año 2006
  • Año 2007

He añadido algunos elementos a la carpeta "Año 2006".  Esto es lo que parece:

image

Mi amigo no escribir código C# sino más bien mediante Java, por lo que la envoltura SOAP era lo que necesitaba realmente.  Para conseguir, Escribí un poco de jQuery y entonces utilizarse violinista para obtener la conversación real de HTTP.

Aquí es el jQuery pertinente (He copiado el código abajo a continuación si desea copiar y pegar):

image

Su primera clave es incluir tanto un <queryOptions> y <QueryOptions> nodo.  La segunda clave es que el <Carpeta> el nodo es una dirección URL a la que el cliente tiene acceso.

Puede haber otras formas de obtener esto, pero esto funcionó bien para mí cuando usando jQuery.

Aquí es la envoltura SOAP para la anterior:

<soapenv:Xmlns envolvente:soapenv =’http://schemas.xmlsoap.org/SOAP/Envelope/’>                
  <soapenv:Cuerpo>
    <GetListItems xmlns =’
http://schemas.Microsoft.com/SharePoint/SOAP/’>
      <listName>Lista personalizada con las subcarpetas</listName>
      <viewFields>  
        <ViewFields>
          <FieldRef nombre =' título’ />
          <FieldRef nombre ='EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Carpeta>
http://demoserver1/blogs Lista personalizada de listas de escenarios con Sub carpetas/año 2006</Carpeta>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Cuerpo>
</soapenv:Envolvente>

Un montón de ejemplos y debate en torno a esto me llevó a creer que todo lo que necesito <QueryOptions> y especifique un nombre de carpeta.  Para mí, Yo necesito a ambos envolverlo dentro <queryOptions> así como especificar una dirección URL completa de la <Carpeta> nodo.

Aquí está el programa de instalación de AJAX jQuery:

$(documento).listo(función() {
       var soapEnv =
           "<soapenv:Xmlns envolvente:soapenv =’http://schemas.xmlsoap.org/SOAP/Envelope/’> \
               <soapenv:Cuerpo> \
                    <GetListItems xmlns =’http://schemas.Microsoft.com/SharePoint/SOAP/’> \
                       <listName>Lista personalizada con las subcarpetas</listName> \
                       <viewFields> \
                           <ViewFields> \
                              <FieldRef nombre =' título’ /> \
                              <FieldRef nombre ='EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Carpeta>http://demoserver1/Blogging Lista personalizada de listas de escenarios con Sub carpetas/año 2006</Carpeta> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Cuerpo> \
           </soapenv:Envolvente>";

</final>

Suscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Lists.asmx, GetList y "valor no puede ser nulo”

Hoy he descubierto que la GetList() método en lists.asmx servicio Web tiene que ser llamado muy cuidadosamente o es propenso a tirar un misterioso "Valor no puede ser nulo" excepción (y que está suponiendo que puede superar el peor mensaje de error genérico, "Excepción de tipo ' Microsoft.SharePoint.SoapServer.SoapServerException’ fue arrojado.")  Específicamente, Me encontré con que no puede ofrecer ningún tipo de prefijo en el método GetList.  El siguiente fragmento de código de jQuery ilustra el punto:

image

Si haces, el servicio web responde con "Valor no puede ser nulo" por esto violinista-proporciona la transcripción HTTP:

<?XML version = "1.0" Encoding = "utf-8"?>
  <jabón:Envolvente
     xmlns:jabón ="
http://schemas.xmlsoap.org/SOAP/Envelope/"    
     xmlns:XSi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns:XSD ="
http://www.w3.org/2001/XMLSchema">

  <jabón:Cuerpo>
    <jabón:Fallas>
      <faultcode>jabón:Servidor</faultcode>
      <FaultString>
        Excepción de tipo ' Microsoft.SharePoint.SoapServer.SoapServerException’ fue arrojado.
      </FaultString>
      <detalle>
        <ErrorString xmlns ="
http://schemas.Microsoft.com/SharePoint/SOAP/">
Valor no puede ser nulo.
        </ErrorString>
      </detalle>
    </jabón:Fallas>
  </jabón:Cuerpo>
</jabón:Envolvente>

Claro, probablemente no agregar ese prefijo "s0" sobre su propia, pero algunas herramientas son propensas a hacerlo (como Eclipse).

Esto es aún más confuso / frustrante porque otros métodos toleran prefijos.  Por ejemplo, el GetListCollection método no importa si se es prefijo, incluso con prefijos de tonterías como "xyzzy":

image

Este "valor no puede ser nulo" parece bastante común con lists.asmx así que esperemos que esto nos ayudará a alguien fuera en el futuro.

</final>

Suscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Sin cesar de anidamiento <div> Etiquetas y jQuery

Esto me parece un tema tan extraños, No estoy seguro vale blogs acerca de, pero que nunca ha dejado de mi antes, así que aquí vamos Sonreír

Estoy elaborando un proyecto donde estoy tirando de algunos datos de una búsqueda, embalaje en un mensaje XML y, a continuación, ese XML en última instancia es transformado en HTML mediante XSLT.  Hay un montón de jQuery involucrados, un bit que implementa algunas funciones de tabulación.  Cuando hace clic en una ficha (realmente, un <div>), jQuery invoca .hide() y .show() en diferentes divs (la carga de la página inicial descargas todo el contenido por lo que en este caso no hay ninguna devoluciones).

Un montón de horas hace, la ficha conmutación lógica comenzó a comportarse de manera irregular y no mostrará uno de mis fichas.  Yo finalmente seguimiento es el hecho de internet explorer (por lo menos) pensaba que el <div> etiquetas anidadas mucho, mucho más profundo que pretende.Mostrar la barra de herramientas de desarrollador:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— mostrando finalmente cerró todo el camino aquí!

Por lo tanto, si hice un $("# Tab1Content").ocultar(), También podría ocultar Tab2 y nunca pude mostrar Tab2 si también no muestro Tab1.  Copia y pega el código visual studio y mostró todos del revestimiento del div hasta bien, al igual que se suponía que iban a estar haciendo, mirando como este:

-<div id = "Tab1Content">
  +<div>
  +<div>
-<div id = "Tab2Content">
  +<div>
  +<div>

Golpearon la cabeza contra la pared durante un tiempo y notó que en el código HTML actual código estaba generando un montón de vacío <div> Etiquetas, como:

<cuerpo>

  <div id = "Tab1Content">

    <div id = "row1" />
    <div id = "row2" />

  </div>

  <div id = "Tab2Content">

    <div id = "row1" />
    <div id = "row2" />

  </div>

</cuerpo>

(Lo anterior es waaaaaaaaaaaay simplificada.  Las etiquetas div vacía son totalmente válidas. Algunos de mis <div> Etiquetas estaban llenos de contenido, pero no fueron muchos más.  Llegué a la realización que mi <XSL:para cada> directivas estaban emitiendo el formulario corto cuando las etiquetas div el xsl:no para cada ' encontrar ningún dato.  Obligó a un comentario HTML en la salida, como se muestra:

image

 

Después de hice, el div se alinearon bien y mi ficha conmutación empezó a trabajar.

Como siempre, Espero que esto ayude a alguien en una pizca.

</final>

Suscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Aún más jQuery–Cambiar el tamaño de un ejemplo de imagen

Heredé un elemento web de proveedor antiguo del cliente y tiene un problema de tamaño de imagen.  Las imágenes deben ser 60×50 pero por alguna extraña razón, el proveedor original les obligó a 42×42, para que su aspecto aplastados:

 

Buena imagen

Mala imagen

Aquí es el marcado (algo simplificado):

<tabla clase = 'outlook extendida'>
  <THEAD>
    <TR>
      <TH  ancho = 100′>3 Martes</TH>
    </TR>
  </THEAD>

  <tbody>
    <clase TR = 'Previsión'>
      <anchura TD = 100′>
        <UL>
          <clase de Li = 'alto'>Alta: 72&DEG;F</Li>
          <clase de Li = 'baja'>Baja: 44&DEG;F</Li>
          <clase de Li = 'condición'>Soleado
            <img src =’
http://deskwx.weatherbug.com/images/Forecast/icons/localized/60×50/en/Trans/cond007.png’ anchura = 42’ altura = 42’ Alt =” />
          </Li>
        </UL>
      </TD>
    </TR>

  </tbody>

</mesa>

Se tenga en cuenta que aunque el camino a la propia imagen muestra la dimensión correcta (60×50) el vendedor original lo forzó en 42×42.  ¿Por qué?  Loco.

De todos modos, Yo quería una solución rápida y fácil a este problema y me volví a jQuery.  El truco era localizar todos los adecuados <IMG> Etiquetas.  No quiero tontear con cualquier otras etiquetas img (de los cuales hay muchos).  Un poco de jQuery hizo el truco:

<la escritura de tipo = text/javascript"" src ="http://Ajax.googleapis.com/Ajax/libs/jQuery/1.5/jQuery.min.js"></secuencia de comandos>

<tipo de secuencia de comandos = "text/javascript">
     $(documento).listo(función () {

         $(' li.condition > IMG').cada(función (índice, artículo)
           
{
             $(artículo).CSS("anchura", "60"); 
             $(artículo).CSS("altura", "50");
            });
     }); // carga de documento
</secuencia de comandos>

La colección encuentra ese trozo de código <Li> Etiquetas cuya clase es "condición" y <IMG> a los niños.  Luego itera a través de todo eso.  Trabajó como un encanto.

Yo probablemente pudiera racionalizarlo, Pero nunca fui a la clase de tipo unix que resolvió π Para 18 precisión de dígitos con sed y awk y yo no soy ese tipo si jQuery o tipo Sonreír.

</final>

Suscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Implementar un sistema de notificación emergente Global

Escribí un artículo para www.SharePoint.Briefing.com titulado"Implementar un sistema de notificación emergente Global.”  Esta función fue implementada para que un colegio comunitario comunicar cierre de escuela debido a la nieve y así sucesivamente. 

Utiliza una lista personalizada, fuera de la caja de SharePoint web services y algunos jQuery para hacer el trabajo.

Aquí es un reclamo:

image

Leer todo aquí: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</final>

Suscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin

Tomar el Control de sus botones Cancelar y aceptar

Escribí en este artículo un tiempo atrás, pero parece no vincular a ella desde mi blog en el momento, así que aquí va:

image

Este artículo describe cómo forzar newform.aspx redirigir a una página cuando el usuario hace clic en Aceptar y otra página cuando hace clic en Cancelar.

</final>

Suscribirse a mi blog.

Sígueme en Twitter en http://www.twitter.com/pagalvin