Category Archives: jQuery e SharePoint

Superar o problema chato com Urls relativas em SharePoint Quick Launch

Eu queria adicionar um link para a navegação de lançamento rápido no outro dia e SharePoint me disse:

image

Versão de texto puro do que é:

Certifique-se de que o URL é válido e começa com qualquer um caractere válido (um sinal de número (#) ou barra (/)) ou um válido suporte protocolo (por exemplo, ' http://’, ' https://’, ' arquivo://’, ' ftp://’, ' mailto:’, «Notícias:’).

"Blech e varíola!"Eu disse.

Uma solução para isso é usar JavaScript para encontrar um link conhecido no lançamento rápido e substituir o comportamento de.

Para testar isso, Adicionar um novo link para o seu site de teste desta forma:

image

Eu usei o jQuery. Para resolvê-lo, pegar um pouco de JavaScript e jQuery para a página usando sua técnica favorita e com uma linha de código como este:

 

$(documento).pronto( função () {

    $("uma:contém('Substituição de URL de teste')").Clique em(função () { alerta("comportamento de clique alterados!"); Voltar falso;});

});

E Bob é seu tio.

O seletor do jQuery encontra cada <uma> marca que tem a "Substituição de URL de teste" em seu nome. Você pode querer encontrar-melodia que dependendo do seu link e tal.

As meretrizes(função() Substitui o SharePoint teria feito quando o usuário clicou. Certifique-se "retorna false" ou então vai fazer suas coisas e depois tentar a coisa href também, quase de certeza que não é seu objetivo.

Isso foi feito e teste em um ambiente de SharePoint online mas deve funcionar bem em 2010 e mais cedo demais.

</fim>

undefinedSubscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Rápido e simples: Resolver "parâmetro de URL inválido” problema com UpdateListItems em lists. asmx

Quando trabalhando com UpdateListItems via Lists. asmx, é fácil gerar o erro:

Parâmetro de URL inválido.

A URL fornecida contém um comando inválido ou o valor. Por favor verifique a URL novamente.

Você pode obter este erro quando você esquecer de incluir o ID na lista de campos para atualizar.  Isso, como um monte de SP, esses serviços da web, é um pouco intuitivo, pois você precisa incluir o ID no atributo ID do <Método> elemento.  E você não está atualizado ID e provavelmente nunca mais quero em primeiro lugar.

Este envelope SOAP funciona:

<soapenv:Envelope xmlns:soapenv =' http://schemas.xmlsoap.org/soap/envelope/'>
  <soapenv:Corpo>                      
    <UpdateListItems xmlns =' http://schemas.Microsoft.com/SharePoint/SOAP/'>                     
      <listName>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</listName>                     
        <atualizações>                     
         <Lote OnError ="Continuar">
          <Método ID ="1" Cmd ="Update">
            <Nome do campo ="CooperativeLock">trancado!</Campo>
            <Nome do campo ="ID">1</Campo>
          </Método>
        </Lote>                     
        </atualizações>                
      </UpdateListItems>             
  </soapenv:Corpo>         
</soapenv:Envelope>

Se você retirar a referência de campo ID, então você vai ter a irritante mensagem "Parâmetro de URL inválido".

</fim>

undefinedSubscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

 

Coitado do cache em JavaScript

[TL;DR versão: utilizamos cookies para armazenar os resultados de chamadas assíncronas; processar os resultados das últimas chamadas assíncronas imediatamente e em seguida, validá-los após o carregamento da página.]

Tenho trabalhado no site de intranet do SharePoint para um cliente que apresenta, entre outras coisas, uma navegação secundária estilizada, cujas opções de menu são gerenciadas através de uma lista personalizada velha regular.  A idéia é que o cliente obtém controle menu do "seu" site sem afetar ou ser afetado pela navegação global, por isso.

(Há algo de incrivelmente subversiva sobre a adição de um CEWP que aponta para um arquivo HTML que carrega alguns CSS e JS fundamentalmente alterar quase tudo sobre o comportamento de um site... mas isso é para outro post)

O código para esta bem simples:

O local dolorido, aqui é que toda vez que alguém bate uma das páginas do site, navegador da web do usuário que está tentando para obter os itens da lista.  Uma vez que o colaborador é completo e teste provou coisas para ser estável e completa, Essa chamada não é necessário mais do que 99% o tempo desde o menu raramente muda.  Também tem um estranho efeito de interface do usuário que é comum este admirável mundo novo de hiper-ajaxy web sites – processa a página e só então é que o menu render.  É nervosa e distraindo na minha opinião.  E nervoso. Assim, armazenamento em cache. 

Eu modifiquei a lógica desta forma:

  • Procure um cookie no navegador que contém o menu como última li-
    • Se encontrou, torná-lo imediatamente.  Não espere terminar o carregamento da página.  (Você precisa ter certeza de que seu HTML é estrategicamente colocado aqui, Mas não é difícil de fazer).
  • Esperar a página terminar de carregar e fazer async chamada para carregar itens de menu de uma lista usando o resto ou Lists. asmx ou qualquer outro
  • Comparar o que eu tenho contra o cookie
    • Se combina com, PARAR
    • Caso contrário, usando jQuery, popular dinamicamente um bando se <Li>está em um <UL>
  • Usar CSS para fazer toda a formatação
  • Lucro!

Alguns de vocês vão dizer, "Ei! Não há verdadeiro cache aqui desde que você está lendo o menu Enfim cada vez que.”  E você está certo-eu não vou dar o servidor qualquer tipo de pausa.  Mas porque a chamada é assíncrona e acontece após a página inicial carga HTML totalmente processa, "parece" mais ágil para o usuário.  O menu processa muito tanto quanto desenha a página.  Se o menu acontece para a mudança, o usuário é submetido a uma re-desenhar nervoso do menu, Mas só uma vez.

Existem algumas maneiras de tornar mais eficaz esta cache e ajudar o servidor ao mesmo tempo:

  • Colocar em uma regra que o cache de"cookie" é válido por um período mínimo de 24 horas ou algum outro período de tempo. Enquanto não há nenhum cookie expirado, Use o instantâneo de menu do cookie e nunca bateu o servidor.

Bem... isso é tudo o que vêm à mente agora :). 

Se alguém tiver alguma idéia inteligente aqui eu adoraria conhecê-los.

E por último – esta técnica pode ser usada para outras coisas.  Página do cliente, este tem uma série de coisas orientado a dados em várias páginas, muitos deles relativamente raramente mudando (como uma vez por semana ou uma vez por mês).  Se você destinar a áreas específicas de funcionalidade, Você pode dar uma interface de usuário mais responsiva puxando o conteúdo da loja do cookie local e tornando-se imediatamente.  Parece mais rápido para o usuário, mesmo se você não está salvando o servidor qualquer ciclos.  Você pode Salve os ciclos de servidor por decidir em algumas condições e gatilhos para invalidar esta cache local de cookie.  Isso é tudo situacional e artsy coisas e realmente a coisa mais divertida :). 

</fim>

undefinedSubscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Amostras de XSLT e jQuery

Eu tenho feito muita de XSLT e jQuery e pensei que iria partilhar alguns trechos que outros podem ser úteis no futuro.

Exemplo 1: Emit simples do JavaScript / jQuery em XSLT:

<XSL:jogo de modelo = "algo" XML:Space = "preserve">

  <!– Espaço em branco fora da consulta amigável filtra campo oculto –>
  <script type = "text/javascript">
    $(documento).pronto(função(){
      $("#QueryFriendlyFilters").Val("vazio");
    });
  </script>

</XSL:modelo>

Esse bit emite algum JavaScript que aguarda concluir Carregando a página (devido a $(documento).pronto(…)) e, em seguida, define o valor de um campo oculto chamado QueryFriendlyFilters para o valor literal "vazio".

Exemplo 2: Utilização <XSL:se> para verificar a "maior que",  "menor que", etc.

<XSL:jogo de modelo = "algo" XML:Space = "preserve">

  <div id = "fdcAllFilters">
 
    <XSL:se test="@Count>0">
      <span class = "fdcFilterLabel">Filtros atuais:</extensão>
    </XSL:se>

    <!– mais coisas acontece aqui. –>

</XSL:modelo>

O trecho acima verifica se um atributo chamado "Contar" do elemento "algo" é maior que zero.  O XML por trás disto seria algo como:”

<algo Count = "5" />

Exemplo 3: Percorrer todos os elementos, intercalando chamadas de jQuery.

<!– Iterar em todos os filtros e exibir o correto  ligações. –>
<XSL:for-each selecione = "UserFilter">

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

  <span class = "fdcFilterLabel"><XSL:valor de select="@FilterValue"/></extensão>

  <script type = "text/javascript">

    $(documento).pronto(função(){
        <XSL:texto><![CDATA[$("#QueryFriendlyFilters").Val( ($("#QueryFriendlyFilters").Val() + " ]]></XSL:texto>\"<XSL:valor de select="@FilterValue"/>\"<XSL:texto><![CDATA["));]]></XSL:texto>
    });

  </script>

</XSL:for-each>

O trecho acima é a mais complexa e pode haver maneiras mais fácil de fazê-lo.

O XML por trás disso fica mais ou menos assim:

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

Este trecho é iterar através de <UserFilter> nós. 

Ele primeiro emite uma âncora tag que quando clicado chama uma função JavaScript que já está na página, "mySubmitPage" e passa o valor de um atributo o <UserFilter> nó chamado "ID". 

Ele, em seguida, emite algum jQuery que aguarda carregar a página.  Esse jQuery atualiza um campo oculto chamado "QueryFriendlyFilters", adicionando o valor do atributo FilterValue.  Observe o louco <XSL:texto> and <![CDATA[ … ]]> coisas.

É isso, esperança que aquilo ajuda!

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Lists. asmx, GetListItems e pastas

Eu estava fazendo uma pesquisa para alguém hoje em torno de serviço da web list.asmx fornecido como parte do SharePoint 2010 (e versões anteriores).  Ela foi capaz de obter os itens da lista na pasta raiz (incluindo os nomes das subpastas), mas não poderia obter itens de subpastas.  Eu fiz alguns olhando em volta na Internet e é uma questão surpreendentemente comum.  Ainda, Eu não poderia obter uma boa resposta para a pergunta simples, "se eu sei que a pasta, Como faço para obter os itens na pasta?”  Para ser honesto, Eu não tentei tudo o que dura desde que eu tenho quis figura esta um fora em meu próprio por um tempo Sorriso.

Para configurá-lo, Eu criei um site chamado "Blogging cenários" e uma lista personalizada denominada "Lista com Sub pastas personalizadas".  Em seguida, criei pastas com o nome:

  • Ano 2005
  • Ano 2006
  • Ano 2007

Eu adicionei alguns itens para a pasta "Ano 2006".  Isso é o que parece:

image

Meu amigo não é escrever código c# mas sim usando Java, assim que o envelope SOAP foi o que ela realmente precisava.  Para obter que, Eu escrevi um pouco de jQuery e então usado fiddler para começar a conversa de HTTP real.

Aqui está o jQuery pertinente (Eu copiei o código para baixo abaixo se você quiser copiar/colar):

image

Eles primeiro chave deve incluir ambos um <queryOptions> and <QueryOptions> nó.  A segunda chave é que o <Pasta> nó é uma URL para que o cliente tem acesso.

Pode haver outras maneiras de obter esta, mas isso funcionou bem para mim quando usando jQuery.

Aqui está o envelope SOAP para o acima:

<soapenv:Envelope xmlns:soapenv =’http://schemas.xmlsoap.org/soap/envelope/’>                
  <soapenv:Corpo>
    <GetListItems xmlns =’
http://schemas.Microsoft.com/SharePoint/SOAP/’>
      <listName>Lista personalizada com Sub pastas</listName>
      <viewFields>  
        <ViewFields>
          <FieldRef FieldRef nome =' título’ />
          <FieldRef FieldRef nome ='EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Pasta>
http://demoserver1/Blogs Lista de cenários/listas/Custom com Sub pastas/ano 2006</Pasta>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Corpo>
</soapenv:Envelope>

Um monte de exemplos e discussão em torno deste levou-me a crer que era tudo que eu preciso <QueryOptions> e especifique um nome de pasta.  Para mim, Eu preciso tanto para envolvê-lo dentro <queryOptions> assim como especificar um URL totalmente qualificado para o <Pasta> nó.

Aqui está o programa de configuração do AJAX jQuery:

$(documento).pronto(função() {
       var soapEnv =
           "<soapenv:Envelope xmlns:soapenv =’http://schemas.xmlsoap.org/soap/envelope/’> \
               <soapenv:Corpo> \
                    <GetListItems xmlns =’http://schemas.Microsoft.com/SharePoint/SOAP/’> \
                       <listName>Lista personalizada com Sub pastas</listName> \
                       <viewFields> \
                           <ViewFields> \
                              <FieldRef FieldRef nome =' título’ /> \
                              <FieldRef FieldRef nome ='EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Pasta>http://demoserver1/Blogging Lista de cenários/listas/Custom com Sub pastas/ano 2006</Pasta> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Corpo> \
           </soapenv:Envelope>";

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Lists. asmx, GetList e "valor não pode ser nulo”

Descobri hoje que o GetList() Método em lists. asmx serviço da Web tem de ser chamado com muito cuidado ou é propenso ao lançar uma misteriosa exceção "Valor não pode ser nulo" (e que está assumindo que você pode passar a mensagem de erro genérico ainda pior, "Exceção do tipo ' Microsoft.SharePoint.SoapServer.SoapServerException’ foi lançada.")  Especificamente, Achei que você não pode fornecer qualquer tipo de prefixo sobre o método GetList.  O seguinte trecho de jQuery ilustra o ponto:

image

Se você fizer isso, o serviço web responde com "Valor não pode ser nulo" como por isso Fiddler-desde transcrição HTTP:

<?XML version = "1.0" Encoding = "utf-8"?>
  <sabão:Envelope
     xmlns:sabão ="
http://schemas.xmlsoap.org/soap/envelope/"    
     xmlns:xsi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns:XSD ="
http://www.w3.org/2001/XMLSchema">

  <sabão:Corpo>
    <sabão:Falhas>
      <FaultCode>sabão:Servidor</FaultCode>
      <FaultString>
        Exceção do tipo ' Microsoft.SharePoint.SoapServer.SoapServerException’ foi lançada.
      </FaultString>
      <Detalhes>
        <ErrorString xmlns ="
http://schemas.Microsoft.com/SharePoint/SOAP/">
Valor não pode ser nulo.
        </ErrorString>
      </Detalhes>
    </sabão:Falhas>
  </sabão:Corpo>
</sabão:Envelope>

É claro, Você provavelmente não iria adicionar o prefixo "s0" em seu próprio país, mas algumas ferramentas são propensas a fazê-lo (como o Eclipse).

Isto é tanto mais confuso / frustrante porque outros métodos toleram prefixos.  Por exemplo, o GetListCollection Método não se importa se for prefixado, mesmo com prefixos de disparates como "xyzzy":

image

Este "valor não pode ser nulo" parece bastante comum com lists. asmx tão esperançosamente isto ajudará alguém fora no futuro.

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Infinitamente aninhando <div> Tags e jQuery

Este parece ser um tema tão excêntrico, Não tenho certeza realmente vale a pena blogar sobre, mas que nunca deixou de me antes, Então, aqui vamos nós Sorriso

Estou trabalhando fora de um projeto onde estou puxando alguns dados de uma pesquisa, embalagem em uma mensagem de XML e, em seguida, o XML é, finalmente, transformada em HTML através do XSLT.  Há um monte de jQuery envolvido, um pouco de que implementa algumas funcionalidades das tabulações.  Quando você clica em uma guia (realmente, uma <div>), jQuery chama Hide() e show() em várias divs (o carregamento da página inicial baixa todo o conteúdo assim lá não são nenhuma postagens neste caso).

Um monte de horas atrás, na guia comutação lógica começou a se comportar de forma irregular e ele não iria mostrar um dos meus guias.  Eu finalmente seguiu para baixo para o fato de que explorer internet (pelo menos) pensa-se que o <div> marcas aninhadas até agora, muito mais profundo do que se destinam.Mostra barra de ferramentas do desenvolvedor:

-<div id = "Tab1Content">
  -<div>
    -<div>
      -<div id = "Tab2Content">
        -<div>
           …………………………
                   </div>  <— Finalmente mostrando ele foi fechado todo o caminho aqui!

Assim, se eu fiz um $("# Tab1Content").esconder(), Eu também esconderia Tab2 e nunca poderia mostrar Tab2 se eu não mostrar também Tab1.  Copiei e colei o código em visual studio e ele mostrou tudo de forro da div acima agradàvel, exatamente como eles deveriam estar fazendo, parecido com isto:

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

Eu bati minha cabeça contra a parede por um tempo e notei que no HTML real código foi gerando um monte de vazio <div> marcas, como:

<corpo>

  <div id = "Tab1Content">

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

  </div>

  <div id = "Tab2Content">

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

  </div>

</corpo>

(O acima é waaaaaaaaaaaay simplificado.  As tags div vazia são totalmente válidas. Alguns dos meus <div> marcas estavam cheias de conteúdo, mas muitos outros não foram.  Cheguei à conclusão de que meu <XSL:for-each> directivas foram emitindo a forma curta div marcas quando o xsl:for each não ' encontrar qualquer dados.  Forcei um comentário HTML na saída, como mostrado:

image

 

Depois que eu fiz que, o div alinhado perfeitamente e meu guia comutação começou a trabalhar.

Como sempre, Espero que isso ajude alguém em um beliscão.

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Ainda mais jQuery–Redimensionar um exemplo de imagem

Eu herdei uma web part de fornecedor antigo do cliente e tem um problema de tamanho de imagem.  As imagens devem ser 60×50 mas por algum motivo estranho, o fornecedor original forçou-os em 42×42, para que eles tenham aparência achatados:

 

Boa imagem

Imagem ruim

Aqui está a marcação (um pouco simplificado):

<classe de tabela = 'estendido-outlook'>
  <thead>
    <TR>
      <th  largura = 100′>3 Terça-feira</th>
    </TR>
  </thead>

  <tbody>
    <Classe TR = 'tempo'>
      <largura de TD = 100′>
        <UL>
          <Classe Li = 'alta'>Alta: 72&deg;F</Li>
          <Classe Li = 'baixa'>Baixo: 44&deg;F</Li>
          <Classe Li = 'condição'>Ensolarado
            <img src =’
http://deskwx.WeatherBug.com/images/Forecast/Icons/localized/60×50/en/trans/cond007.png’ Largura = 42’ altura = 42’ ALT =” />
          </Li>
        </UL>
      </TD>
    </TR>

  </tbody>

</tabela>

Você notará que, embora o caminho para a própria imagem mostra a dimensão adequada (60×50) o fornecedor original forçou-42.×42.  Por que?  Louco.

De qualquer forma, Eu queria uma solução rápida e fácil para esse problema e eu me virei para jQuery.  O truque foi localizar todos os apropriado <img> marcas de formatação.  Eu não queria Muck com quaisquer outras tags img (de que há muitos).  Este pouco de jQuery feito a manha:

<script type = "text/javascript" src ="http://AJAX.googleapis.com/AJAX/libs/jQuery/1.5/jQuery.min.js"></script>

<script type = "text/javascript">
     $(documento).pronto(função () {

         $(' li.condition > img').cada(função (índice, item de)
           
{
             $(item de).CSS("largura", "60"); 
             $(item de).CSS("altura", "50");
            });
     }); // carga do documento
</script>

Esse pedaço de código localiza a coleção <Li> marcas cuja classe é "condição" e <img> crianças.  Ele, em seguida, itera Tudo isso.  Trabalhou como um encanto.

Eu provavelmente poderia simplificar ele, mas eu nunca fui um o tipo de cara de unix que resolveu π Para 18 precisão de dígitos usando sed e awk e eu não sou desse tipo se jQuery cara quer Sorriso.

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Implementar um sistema de notificação de pop-up Global

Eu escrevi um artigo para a www.SharePoint.briefing.com intitulado"Implementar um sistema de notificação de pop-up Global.”  Esta função foi implementada para uma faculdade comunitária comunicar o fechamento de escola devido a neve e assim por diante. 

Ele usa uma lista personalizada, fora da caixa de SharePoint web services e alguns jQuery para fazer o trabalho.

Aqui está um teaser:

image

Leia tudo aqui: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin

Assuma o controle de seu OK e cancelar botões

Eu escrevi Este artigo um tempo atrás, mas parece que não ligar para ele do meu blog no momento, por isso aqui vai:

image

Este artigo descreve como forçar NewForm. aspx para redirecionar para uma página quando o usuário clica OK e outra página quando ela clica em Cancelar.

</fim>

Subscreva ao meu blog.

Siga-me no Twitter em http://www.twitter.com/pagalvin