2009-09-30 11 views

Odpowiedz

5

Każdy internetowej dodany do strony jest przechowywana w samej strony. Nie ma centralnego sklepu, który rejestruje, gdzie każda część sieci jest używana.

Oznacza to, że niestety trzeba przejrzeć wszystkie strony części strony w witrynie, aby pobrać te informacje. Na każdej stronie należy następnie sprawdzić nazwy zespołów części internetowych. Dodaj wszystkie znalezione części do listy, która jest wyprowadzana po zakończeniu działania aplikacji.

Obiekt SPWeb umożliwia pobranie menedżera części WWW dla każdej strony za pomocą SPWeb.GetLimitedWebPartManager(). Użyj SPLimitedWebPartManager.WebParts property, aby pobrać kolekcję części internetowych.

4

Alex's answer (iterowanie za pośrednictwem stron -> strony> części do stron internetowych) jest dobre i "prawidłowy" sposób to zrobić, ale jest dość drogi na bardzo dużej stronie.

Alternatywą jest zapytanie do bazy danych. Wszystkie zwykłe zastrzeżenia odnoszą się do bezpośredniego dostępu do bazy danych: nie zmieniaj niczego, możesz przerwać w dowolnym momencie z dodatkiem Service Pack itd. Itd., Ale zakładając, że wszyscy jesteśmy dużymi chłopcami: -

Najpierw musisz dowiedzieć się o WebPartTypeId część internetowa zainteresowana:

Następnie uruchom to we wszystkich bazach danych zawartości.

SELECT DISTINCT D.SiteID, D.WebId, W.FullURL as WebURL, D.Id As DocumentId, 
       D.DirName, D.LeafName, tp_ID As WebPartSK 
FROM  dbo.Docs D WITH (nolock) 
INNER JOIN dbo.Webs W WITH (nolock) ON D.WebID = W.Id 
INNER JOIN dbo.WebParts WP WITH (nolock) ON D.Id = WP.tp_PageUrlID 
WHERE WP.tp_ListId Is Null AND WP.tp_Type Is Null AND WP.tp_Flags Is Null 
     AND WP.tp_BaseViewID Is Null AND WP.tp_DisplayName Is Null 
     AND WP.tp_Version Is Null 
AND WP.tp_WebPartTypeId='<your web parts id>' 

Można to zrobić na odwrót (uzyskać listę wszystkich WebPartTypeId użytkowej), ale nie można uzyskać nazwę zespołu z hash WebPartTypeId więc trzeba by zrobić jakieś listy odnośników z części internetowe> typeid's.

+1

@Ryan: Nie wiemy @ Active_t za tło więc należy być ostrożnym o założeniach ;-) Podczas odczytu z bazy danych przy użyciu NOLOCK jest niezbędna, aby zapobiec zakleszczenia i należy przyjąć, że wyniki mogą być niedokładne. Przepraszamy za zwiastowanie nawróconych! –

+0

Edytowałem, aby dodać wskazówkę "brak blokady", ale musimy pamiętać, że nie jest to srebrna kula i wprowadza potencjalne problemy własne (dane w niespójnym stanie). Czy masz jakieś dobre referencje na temat możliwości spowodowania zakleszczenia? Byłoby dobrze, aby uzyskać ostateczne odpowiedzi na ten temat, ale nie jest zaskoczeniem, że oficjalna linia jest ... nie. – Ryan

+0

Powiedziawszy, że problemy, które mogą być spowodowane odczytaniem niespójnych danych w tym przykładzie, są prawdopodobnie dość małe. – Ryan

3

Innym sposobem, aby to zrobić, to użyć rozszerzenia Gary Lapointe stsadm konkretnie enumPageWebParts

stsadm -o gl-enumpagewebparts -url "http://intranet/hr/pages/default.aspx" -verbose

To wyprowadza tylko części internetowych w użyciu na konkretnej stronie, ale można nazwać to dla każdej strony na swojej stronie lub nawet dodać polecenie do iteracji na wszystkich stronach w witrynie.

http://stsadm.codeplex.com/

+1

i to jest open source Wierzę, więc może to być dobre miejsce, aby zacząć szukać przykładowy kod – Colin

1

miałem żadnych sukcesów generujący internetowej typ części id dowolną metodą, ja po prostu nie daje rezultatów, kiedy wykonać zapytanie. Wynikało to z faktu, że identyfikator nigdy nie był poprawny.

Aby obejść ten problem, utworzyłem nową stronę i wstawiłem instancję strony internetowej, którą interesowałem. Następnie wyszukałem przez LeafName, podając jej stronę, którą utworzyłem (najlepiej, aby była wyjątkowa!) . Zwróciło to pojedynczy wynik i mogłem następnie użyć tp_WebPartTypeId, który powrócił do wysłania zapytania do całej bazy danych zawartości.

Jeśli masz problemy z wygenerowaniem identyfikatora, spróbuj zastosować to podejście.

2

W przypadku, gdy ktoś szuka tego samego zapytania dla SharePoint 2013. Oto on. Widok został usunięty w 2013 r., A nazwa tabeli z tymi samymi polami to dbo.AllWebParts.

SELECT DISTINCT D.SiteID, D.WebId, W.FullURL as WebURL, D.Id As DocumentId, 
       D.DirName, D.LeafName, tp_ID As WebPartSK 
FROM  dbo.Docs D WITH (nolock) 
INNER JOIN dbo.Webs W WITH (nolock) ON D.WebID = W.Id 
INNER JOIN dbo.AllWebParts WP WITH (nolock) ON D.Id = WP.tp_PageUrlID 
WHERE WP.tp_ListId Is Null AND WP.tp_Type Is Null AND WP.tp_Flags Is Null 
     AND WP.tp_BaseViewID Is Null AND WP.tp_DisplayName Is Null 
     AND WP.tp_Version Is Null 
AND WP.tp_WebPartTypeId='<your web parts id>' 
Powiązane problemy