Swoje czasu pisałem w jaki sposób zrobić zaawansowane menu kontekstowe w SharePoint. Ostatnio musiałem wykonać taką samą operację na wersji WSS 3.0 SP2 i aż żałuje, że nie robiłem screenshotów ani nie opisywałem każdego kroku. Ale przejdźmy do początku.
Stworzyłem sobie przykładową listę, włączyłem edycję strony, dodałem CEWP i następnie przeszedłem w edycje kodu. Dodałem tag SCRIPT i wymagany mój skrypt:
function Custom_AddListMenuItems(m, ctx) { alert('jupi dziala!'); return false; }
Kliknąłem Apply i boom, wyskoczył mi błąd – którego właśnie żałuje, że nie zapisałem. Po spędzeniu trochę czasu na googlu, okazało się iż jest on spowodowany tym, że IE/SharePoint wykrył cross-site scripting i nie zezwala na dodanie zawartości CEWP. Za nic na świecie tego nie mogłem przejść, do póki nie odpaliłem FireFox. Tam zaś skrypt został dodany i to wszystko :) koniec, żadnej reakcji ani na IE ani na FF.
Zapomniałem o całej sprawie aż do niedzieli, kiedy na nowo spróbowałem całej akcji. Tym razem z innego komputera :) a co, technologię MS są dziwne, więc zaryzykowałem. Operacja zakończyła się sukcesem! Wow, po prostu aż mi szczęka odpadła. Poszedłem do komputera na którym stoi WSS i powtórzyłem operację z poziomu IE i przeszła – czyli tym bardziej żałowałem, że screenshotu nie zrobiłem wcześniej.
No dobrze, to że się dodało jeszcze nic nie oznaczało, gdyż jak najeżdżałem na element by otworzyć menu, mój kod nie był wywoływany – nawet prosty alert jak w przykładzie na górze. Według debugerów, funkcja Custom_AddListMenuItems była undefined. No to zrobiłem jeszcze głupszy test, przed wywołaniem funkcji dodałem alert(‘słowo, które często używamy’); To zaś spowodowało, że przy ładowaniu się strony miałem ten piękny alert ale także miałem swój alert przy menu kontekstowym (sic!). Wykonałem kolejny test, i skasowałem ten piękny alert przed funkcją i mój alert na menu kontekstowym zaczął działać (sic! x 2).
Przeszedłem nad tym do porządku dziennego i dodałem kod, który mnie naprawdę interesował i natrafiłem na kolejny problem. Mój kod znów przestał być wywoływany! Oczywiście już wiedziałem co zrobić, dodałem alert, zapisałem, skasowałem alert i zapisałem i zaczęło działać… prawie :) pojawił się mianowicie problem z następującym kodem:
var contentTypeId = GetAttributeFromItemTable(itemTable, 'CId', 'ContentTypeId');
Mianowicie, itemTable był null, problem polega na tym, że itemTable jest przypisywany i tworzony przez core.js zawartym w WSS. A no to już nic poradzić nie mogłem. Cały mój kod opierał się na tym, że znam szczegóły elementu dla którego mam wyświetlić menu. A teraz już ich nie znałem.
Ktoś ma może pomysł jak to rozwiązać? Albo, dlaczego tak dziwnie się SharePoint zachowuje (tylko nie dawajcie odp. bo to SharePoint ;))