Цатегори Арцхивес: јКуери и СхареПоинт

Превазиђите досадне проблем релативне УРЛ адресе у СхареПоинт Брзо покретање

I wanted to add a link to the quick launch navigation the other day and SharePoint told me:

image

Pure text version of that is:

Ensure that the URL is valid and begins with either a valid character (a number sign (#) or forward slash (/)) or a valid supported protocol (на пример, ‘http://’, ‘https://’, ‘file://’, ‘ftp://’, ‘mailto:’, ‘news:’).

“Blech and pox!” I said.

A workaround to this is to use JavaScript to find a known link in the quick launch and override its behavior.

To test this, add a new link to your test site thusly:

image

I used jQuery. To solve it, get some JavaScript and jQuery onto the page using your favorite technique and with a line of code like this:

 

$(документ).спреман( функција () {

    $("a:contains('Test URL replacement')").клик(функција () { alert("changed click behavior!"); повратак лажан;});

});

And Bob’s your uncle.

The jQuery selector finds every <a> tag that has “Test URL replacement” in its name. You may want to find-tune that depending on your link and such.

The .click(функција() overrides whatever SharePoint would have done when the user clicked. Make sure you “return false” or else it will do your stuff and then try to the href thing too, which is almost certainly not your goal.

This was done and test in a SharePoint online environment but should work well in 2010 and earlier too.

</крај>

undefinedПретплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

Брза и једноставна: Решите "Инвалид УРЛ параметар” Проблем са УпдатеЛистИтемс у листс.асмк

When working with UpdateListItems via lists.asmx, it’s easy to generate the error:

Invalid URL Parameter.

The URL provided contains an invalid Command or Value. Please check the URL again.

You can get this error when you forget to include ID in the the list of fields to update.  Ово, like a lot of these SP web services, is a bit counterintuitive since you need to include the ID in the ID attribute of the <Method> element.  And you’re not updated ID and probably never want to in the first place.

This SOAP envelope works:

<соапенв:Коверте КСМЛнс:соапенв ='http://schemas.xmlsoap.org/soap/envelope/'>
  <соапенв:Тело>                      
    <UpdateListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>                     
      <листнаме>{C712E2EA-54E1-47AD-9D99-1848C7773E2F}</листнаме>                     
        <updates>                     
         <Batch OnError="Continue">
          <Method ID="1" Cmd="Update">
            <Field Name="CooperativeLock">locked!</Field>
            <Field Name="ID">1</Field>
          </Method>
        </Batch>                     
        </updates>                
      </UpdateListItems>             
  </соапенв:Тело>         
</соапенв:Коверат>

If you strip out the ID field reference then you’ll get the annoying “Invalid URL parameter” message.

</крај>

undefinedПретплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

 

Сиромашног човека кеширање у ЈаваСцрипт

[TL;DR version: use cookies to store the results of async calls; render the results of past async calls immediately and then validate them after page-load.]

I’ve been working on SharePoint intranet site for a client that features, између осталог, a stylized secondary navigation whose menu options are managed via a regular old custom list.  The idea is that the client gets to control “their” site’s menu without affecting or being affected by the global navigation put out by IT.

(there is something incredibly subversive about adding a CEWP that points to an HTML file that loads some CSS and JS to fundamentally alter almost everything about a site’s behavior… but that’s for another post)

The code for this pretty simple:

The sore spot here is that every time anyone hits one of the site’s pages, that user’s web browser is reaching out to get items from the list.  Once dev is complete and testing has proven things to be stable and complete, this call is unnecessary more than 99% of the time since the menu rarely changes.  It also has a weird UI affect which is common in this brave new world of hyper-ajaxy web sites – the page renders and only then does the menu render.  It’s jittery and distracting in my view.  And jittery. Тако, caching. 

I modified the logic thusly:

  • Look for a cookie in the browser that contains the menu as I last read it
    • If found, render it immediately.  Don’t wait for the page to finish loading.  (You need to make sure your HTML is strategically placed here, but it’s not hard to do).
  • Wait for the page to finish loading and make an async call to load up menu items from a list using REST or lists.asmx or whatever
  • Compare what I got against the cookie
    • If it matches, STOP
    • Иначе, using jQuery, dynamically populate a bunch if <Ли>’s in a <Ул>
  • Use CSS to do all the formatting
  • Profit!

Some of you are going to say, “hey! there’s no real caching going on here since you’re reading the menu anyway every single time."  And you’re right – I’m not giving the server any kind of break.  But because the call is async and happens after the page’s initial HTML payload fully renders, it “feels” more responsive to the user.  The menu renders pretty much as the page draws.  If the menu happens to the change, the user is subjected to a jittery re-draw of the menu, but only that one time.

There are some ways to make this caching more effective and help out the server at the same time:

  • Put in a rule that the “cookie cache” is valid for a minimum of 24 hours or some other timeframe. As long as there is no expired cookie, use the cookie’s menu snapshot and never hit the server.

Well … that’s all that come to mind right now :). 

If anyone has any clever ideas here I’d love to know them.

And lastly – this technique can be used for other stuff.  This client’s page has a number of data-driven things on various pages, many of them changing relatively rarely (like once a week or once a month).  If you target specific areas of functionality, you can give a more responsive UI by pulling content from the local cookie store and rendering immediately.  It feels faster to the user even if you’re not saving the server any cycles.  You can save the server cycles by deciding on some conditions and triggers to invalidate this local cookie cache.  That’s all situational and artsy stuff and really the most fun :). 

</крај>

undefinedПретплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

КССЛТ и јКуери Узорци

Ја сам радио много од КССЛТ и јКуери и помислио бих поделим неколико исечака које други могу бити од користи у будућности.

Пример 1: Емит једноставан ЈаваСцрипт / јКуери у КССЛТ:

<клс:template match="something" КСМЛ:space="preserve">

  <!– Празнина се упита пријатељски филтери скривено поље –>
  <script type="text/javascript">
    $(документ).спреман(функција(){
      $("#QueryFriendlyFilters").val("empty");
    });
  </скрипта>

</клс:шаблон>

That bit emits some JavaScript that waits for the page to finish loading (because of the $(документ).спреман(...)) and then sets the value of a hidden field named QueryFriendlyFilters to the literal value “empty”.

Пример 2: Коришћење <клс:ако> to check “greater than”“less than”, итд.

<клс:template match="something" КСМЛ:space="preserve">

  <div id="fdcAllFilters">
 
    <клс:if test="@Count>0">
      <span class="fdcFilterLabel">Current filters:</распон>
    </клс:ако>

    <!– more stuff happens here. –>

</клс:шаблон>

The above snippet checks to see if an attribute named “Count” of the “something” element is greater than zero.  The XML behind this would be something like:"

<something Count=”5” />

Пример 3: Iterate through all elements, interspersing jQuery calls.

<!– Iterate through all the filters and display the correct  линкови. –>
<клс:for-each select="UserFilter">

  <a class="FilterHref" href="javascript:mySubmitPage(‘RemoveUserFilter’,'{@ ИД}’)">[X]</a>

  <span class="fdcFilterLabel"><клс:value-of select="@FilterValue"/></распон>

  <script type="text/javascript">

    $(документ).спреман(функција(){
        <клс:текст><![ЦДАТА[$("#QueryFriendlyFilters").val( ($("#QueryFriendlyFilters").val() + " ]]></клс:текст>\"<клс:value-of select="@FilterValue"/>\"<клс:текст><![ЦДАТА["));]]></клс:текст>
    });

  </скрипта>

</клс:-за сваки>

The above snippet is the most complex and there may be easier ways to do it.

The XML behind this looks roughly like this:

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

This snippet is iterating through <UserFilter> nodes. 

It first emits an anchor tag that when clicked invokes a JavaScript function that is already on the page, “mySubmitPage” and passes the value of an attribute on the <UserFilter> node named “ID”. 

It then emits some jQuery that waits for the page to load.  That jQuery updates a hidden field named “QueryFriendlyFilters” by adding the value of the FilterValue attribute.  Note all the crazy <клс:текст> и <![ЦДАТА[ ... ]]> stuff.

That’s it, Надам се да помаже!

</крај>

Претплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

Листс.асмк, ГетЛистИтемс и фасцикле

Ја сам истраживао за некога данас око лист.асмк веб услугу као део СхареПоинт 2010 (и раније).  Она је била у стању да ставке листе на основној фасцикли (укључујући и имена субименике), али није могао да ставке у под-директоријумима.  Мало сам гледала около на интернетс и то је изненађујуће често питање.  Још, Нисам могао добити добар одговор на једноставно питање, "Ако ја знам фасциклу, како могу добити ставке у фасцикли?"  Да будем искрен, Нисам пробао све то тешко, јер сам хтео да схватимо ово сама за неко време Осмех.

Да бисте подесили ово, Направио сам сајт под називом "Сценарији блоггинг" и прилагођене листе по имену "Цустом Списак са под фасциклама".  Тада сам створио фолдере именоване:

  • Година 2005
  • Година 2006
  • Година 2007

Додао сам неколико ставки у фасцикли "Година 2006".  То је оно што изгледа:

image

Мој пријатељ не пише Ц # кода, већ користите Јава, па САПУН коверта је оно што је заиста потребно.  Да би се то, Написао сам мало јКуери а затим користи Фиддлер да бисте добили Стварни ХТТП разговор.

Ево релевантно јКуери (Копирао сам код доле испод ако желите да копирате / пасте):

image

Прво су кључ је да се укључе и <куериОптионс> и <КуериОптионс> чвор.  Други кључ је у томе <Фасцикла> чвор је УРЛ адреса на коју клијент има приступ.

Постоје и други начини да се ово, али ово је добро радио за мене када се користи јКуери.

Овде је САПУН коверта за горе:

<соапенв:Коверте КСМЛнс:соапенв =’хттп://сцхемас.кмлсоап.орг / сапун / коверти /’>                
  <соапенв:Тело>
    <ГетЛистИтемс КСМЛнс =’
хттп://сцхемас.мицрософт.цом / СхареПоинт / сапун /’>
      <листнаме>Прилагођену листу са под фасциклама</листнаме>
      <виевФиелдс>  
        <ВиевФиелдс>
          <ФиелдРеф Име = 'Наслов’ />
          <ФиелдРеф Име = 'ЕнцодедАбсУрл’ />
        </ВиевФиелдс>
      </виевФиелдс>
      <куериОптионс>
        <КуериОптионс>
          <Фасцикла>
хттп://демосервер1/Блоггинг Сценарији / спискови / прилагођене листе са под фасциклама / 2006 годину</Фасцикла>
        </КуериОптионс>
      </куериОптионс>
   
</ГетЛистИтемс>
  </соапенв:Тело>
</соапенв:Коверат>

Много примера и дискусија око овог ме је навело да верујем да све што ми треба је <КуериОптионс> и наведите име фасцикле.  За мене, Морам да га замотати у оба <куериОптионс> као и навести потпуно квалификовано УРЛ <Фасцикла> чвор.

Ево јКуери АЈАКС подешавање:

$(документ).спреман(функција() {
       био соапЕнв =
           "<соапенв:Коверте КСМЛнс:соапенв =’хттп://сцхемас.кмлсоап.орг / сапун / коверти /’> \
               <соапенв:Тело> \
                    <ГетЛистИтемс КСМЛнс =’хттп://сцхемас.мицрософт.цом / СхареПоинт / сапун /’> \
                       <листнаме>Прилагођену листу са под фасциклама</листнаме> \
                       <виевФиелдс> \
                           <ВиевФиелдс> \
                              <ФиелдРеф Име = 'Наслов’ /> \
                              <ФиелдРеф Име = 'ЕнцодедАбсУрл’ /> \
                          </ВиевФиелдс> \
                       </виевФиелдс> \
                       <куериОптионс> \
                         <КуериОптионс> \
                           <Фасцикла>http://demoserver1/Blogging Сценарији / спискови / прилагођене листе са под фасциклама / 2006 годину</Фасцикла> \
                         </КуериОптионс> \
                       </куериОптионс> \
                   </ГетЛистИтемс> \
               </соапенв:Тело> \
           </соапенв:Коверат>";

</крај>

Претплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

Листс.асмк, ГетЛист и "Вредност не сме бити нулл”

Открио сам да је данас ГетЛист() метода у листс.асмк веб сервиса мора да се зове веома пажљиво и да је склона да се баци мистериозни "вредност не може бити нулл" изузетак (и под претпоставком да је можете добити прошлости још горе генеричке поруке о грешци, “Exception of type ‘Microsoft.SharePoint.SoapServer.SoapServerException’ бачен. ")  Посебно, Нашао сам да не може да пружи било какав префикс на ГетЛист метода.  Следећи јКуери код илуструје тачку:

image

Ако то урадите, Веб услуга одговара са "Вредност не може бити нула" по ово виолиниста-условом ХТТП транскрипт:

<?xml version="1.0" encoding="utf-8"?>
  <сапун:Коверат
     КСМЛнс:сапун ="
хттп://сцхемас.кмлсоап.орг / сапун / коверти /"    
     КСМЛнс:кси = "
хттп://ввв.в3.орг/2001/КСМЛСцхема-инстанце"
     КСМЛнс:ксд ="
хттп://ввв.в3.орг/2001/КСМЛСцхема">

  <сапун:Тело>
    <сапун:Грешка>
      <фаултцоде>сапун:Сервер</фаултцоде>
      <фаултстринг>
        Exception of type ‘Microsoft.SharePoint.SoapServer.SoapServerException’ је бачена.
      </фаултстринг>
      <детаљ>
        <еррорстринг КСМЛнс ="
хттп://сцхемас.мицрософт.цом / СхареПоинт / сапун /">
Вредност не може бити нула.
        </еррорстринг>
      </детаљ>
    </сапун:Грешка>
  </сапун:Тело>
</сапун:Коверат>

Наравно, вероватно не би додао да "С0" префикс на сопствене, али неки алати су склони да то уради (као Ецлипсе).

То је све више збуњујуће / фрустрирајуће, јер друге методе толерише префикса.  На пример, the ГетЛистЦоллецтион метод не смета ако је прошло префикс, чак и са бесмисленим префиксима попут "киззи":

image

Ова "вредност не може бити нула" изгледа прилично уобичајено са листс.асмк па се надам да ће то помоћи некоме у будућности.

</крај>

Претплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

Бескрајно Гнезде <див> Ознаке и јКуери

Ово изгледа као такав био чудна тему, Нисам сигуран да је то заиста вреди блоговањем о, али то ми никада није престао пре, Дакле, идемо Осмех

Радим на пројекту се где сам вуче неке податке од претраге, паковање га у КСМЛ поруке и да КСМЛ се на крају претвара у ХТМЛ путем КССЛТ.  Има много јКуери укључен, један бит који имплементира неке таббинг функционалност.  Када кликнете на картицу (заиста, a <див>), јКуери позива сакрити.() и шоу.() на разним ДИВС (почетна страница оптерећење преузима сав садржај, па нема постбацкс у овом случају).

Гомила сати, табова логика почео чудно да се понаша, а он не приказује једну од мојих картица.  И на крају га пратио на чињеницу да Интернет Екплорер (најмање) мислили да <див> ознаке угнездио далеко, далеко дубље од интендед.Тхе програмера палети ће показати:

-<див ид = "Таб1Цонтент">
  -<див>
    -<див>
      -<див ид = "Таб2Цонтент">
        -<див>
           ..............................
                   </див>  <-Коначно показује да је затворен скроз доле!

Тако, ако јесам $("# Таб1Цонтент").сакрити(), Такође бих сакрити Таб2 и ја никада не бих могао показати Таб2 ако нисам такође показују Таб1.  Копира и лепи код горе у Висуал Студио и то показује сву облагање див је лепо горе, баш као што је требало да раде, изгледа овако:

-<див ид = "Таб1Цонтент">
  +<див>
  +<див>
-<див ид = "Таб2Цонтент">
  +<див>
  +<див>

Победио сам главом о зид за неко време и приметио да у стварном ХТМЛ код је генерисање много празна <див> ознаке, као:

<тело>

  <див ид = "Таб1Цонтент">

    <див ид = "ров1" />
    <див ид = "ров2" />

  </див>

  <див ид = "Таб2Цонтент">

    <див ид = "ров1" />
    <див ид = "ров2" />

  </див>

</тело>

(Изнад је вааааааааааааи поједностављена.  Празне див ознаке су потпуно важећи. Неки од мојих <див> ознаке су биле пуне садржаја, али многи још нису били.  Дошао сам до закључка да је мој <клс:-за сваки> директиве су се емитује на кратак форма див тагове када клс:за-сваки нису "пронашли никакве податке.  Сам приморан ХТМЛ коментар на излазу, као што је приказано:

image

 

Након што сам то учинио, све див је постројио и лепо ми је пребацивање картица почела да ради.

Као и увек, Надам се да ово помаже некоме у невољи.

</крај>

Претплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

Још више јКуери–Мењање величине пример слике

Наследио сам веб део из старог продавца клијента и има слика, величина проблема.  Слике треба да буду 60×50 али из неког разлога одд, оригинални продавац их присилили 42×42, тако да изгледају згњечено:

 

Добра слика

Лош имиџ

Ево означавање (нешто упрошћена):

<табела ЦЛАСС = 'продуженог Оутлоок'>
  <тхеад>
    <тр>
      <Тх  видтх = '100′>3 Уторак</Тх>
    </тр>
  </тхеад>

  <тд>
    <тр цласс = 'прогноза'>
      <тд видтх = '100′>
        <Ул>
          <ли цласс = 'хигх'>Висок: 72&степени;Ф</Ли>
          <ли цласс = 'мали'>Низак: 44&степени;Ф</Ли>
          <ли цласс = 'стање'>Сунчан
            <имг срц =’
хттп://десквк.веатхербуг.цом/имагес/Форецаст/ицонс/лоцализед/60×50/ен/транс/цонд007.пнг’ видтх = '42’ хеигхт = '42’ алт =” />
          </Ли>
        </Ул>
      </тд>
    </тр>

  </тд>

</табела>

Приметићете да иако Пут до саме слике показује одговарајућу димензију (60×50) оригинални продавац је приморана на 42×42.  Зашто?  Луд.

У сваком случају, Желео сам брзо и једноставно решење за овај проблем, а ја окренуо јКуери.  Трик је био да пронађе све одговарајуће <имг> ознаке.  Ја нисам хтео да ленчарити са другим имг тагова (од којих су многи).  Ово мало јКуери сам успео:

<script type="text/javascript" срц ="хттп://ајак.гооглеапис.цом/ајак/либс/јкуери/1.5/јкуери.мин.јс"></скрипта>

<script type="text/javascript">
     $(документ).спреман(функција () {

         $(‘li.condition > имг ').сваки(функција (индекс, ставка)
           
{
             $(ставка).цс("width", "60"); 
             $(ставка).цс("height", "50");
            });
     }); // документа о оптерећењу
</скрипта>

Тај део кода проналази колекцију <Ли> ознаке чије класе је "стање" и <имг> деца.  Затим понавља кроз све то.  Радила је као шарм.

Вероватно сам могао да унапредите, али никада нисам био од оних који су решили уник момка π на 18 прецизност цифара помоћу сед и авк, а ја нисам такав момак или ако јКуери Осмех.

</крај>

Претплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

Спровести глобалну поп-уп систем обавештавања

Написао сам чланак за ввв.схарепоинт.бриефинг.цом под називом "Спровести глобалну поп-уп систем обавештавања."  Ова функција је реализована на колеџ да комуницирају затварања школе због снега и тако даље. 

Користи прилагођене листе, из кутије СхареПоинт веб сервиси и неки јКуери да раде посао.

Ево теасер:

image

Прочитајте целу ствар овде: http://www.sharepointbriefing.com/features/article.php/3918471/Implement-a-Global-Pop-up-Notification-System.htm

</крај>

Претплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin

Преузмите контролу над својим ОК и Цанцел дугме

Написао сам овај чланак док је повратак, али изгледа да нисам линк на њу са мог блога у то време, па овде иде:

image

Овај чланак описује како да натера невформ.аспк да преусмери на једну страну, када корисник кликне на дугме У реду, а другачије кад она кликне страна отказати.

</крај>

Претплатите се на мој блог.

Следите ме на Туиттер на http://www.twitter.com/pagalvin