wtorek, 30 sierpnia 2011

Funkcje witryny, a tworzenie witryny na podstawie szablonu z innego środowiska

Od czasu do czasu (zwłaszcza kiedy pracujemy jako support SharePointa) potrzebujemy na podstawie szablonu witryny stworzyć nową witrynę. Jest to przydatne zwłaszcza, kiedy zrobimy jakieś rozwiązanie i chcemy je przenieść do klienta albo kiedy klient ma problem i chce nam przesłać swoje rozwiązanie do debugowania. Samo przenoszenie jest proste, możemy jednak przy tworzeniu witryny dostać uciążliwy do zwalczenia błąd spowodowany brakiem funkcji na witrynie. Dotyczy to zarówno pełnego SharePoint Serwera jaki i SharePoint Foundation.

Żeby przenieść witrynę w szablonie wchodzimy w ustawienia witryny, w grupie "Akcje witryny" wybieramy "Zapisywanie witryny jako szablonu" (zaznaczając lub nie opcję zapisywania zawartości, co ma wpływ na to czy przeniosą się nam również wpisy na listach i biblioteki w dokumentach, ale również i przepływy) i po pomyślnym zapisaniu witryny przechodzimy do galerii rozwiązań za pomocą miłego linka ("galeria rozwiązań") dostarczonego przez twórców SP. Z galerii zapisujemy sobie nasz plik WSP (warto pamiętać, pod jaką nazwą go zapisujemy, zwłaszcza jak to robimy po raz 10 danego dnia) na dysku.
Następnie przechodzimy na środowisko docelowe - na główną witrynę kolekcji witryn (a nie np. podwitrynę pod którą chcemy stworzyć witrynę). Tam ponownie wchodzimy na ustawienia witryny i w grupie "Galerie" wybieramy "Rozwiązania" (niezbyt oczywiste miejsce do szukania szablonów witryn dla osób przechodzących z SP2007). Teraz musimy zrobić następujące kroki:
  1. Klikamy na zakładkę "Rozwiązania" (mimo iż wygląda jakby była już wybrana)
  2. Klikamy "Przekaż rozwiązanie"
  3. Wgrywamy plik WSP, który zapisaliśmy uprzednio na dysku
  4. Aktywujemy rozwiązanie
Możemy już stworzyć nową witrynę na podstawie wgranego szablonu. Wchodzimy na witrynę pod którą chcemy stworzyć nową witrynę i wybieramy z akcji witryny (menu w górnym lewym rogu) "Utwórz witrynę". W menu po lewej wybieramy kategorię "Puste i niestandardowe", wybieramy nasz szablon, wpisujemy tytuł i URL i klikamy "Utwórz".
I tu dochodzimy do "klu programu": jeżeli na środowisku były zainstalowane/włączone funkcje, które były włączone na środowisku źródłowym, które nie są dostępne na docelowym to dostaniemy piękny błąd "Szablon witryny wymaga aktywowania funkcji {długi GUID} w zbiorze witryn. Identyfikator korelacji: {kolejny GUID}" (ang: "The site template requires that the Feature {GUID} be installed in the farm or site collection. Corelation ID: {GUID}").
 
Rozwiązaniem tego błędu jest zainstalowanie/włączenie brakującej funkcji. Problem polega na tym, że mamy piękny GUID, który nam nie mówi którą funkcję powinniśmy włączyć. Możemy oczywiście otworzyć stronę zarządzania funkcjami na witrynie źródłowej i docelowej i posprawdzać, które funkcje były włączone na źródle i włączyć je na witrynie docelowej. Jeżeli jednak mamy dużo funkcji to może to być trudne i czasochłonne, ponadto czasami nie mamy dostępu do środowiska źródłowego. Dodatkowo są funkcje, których nie widać na stronie zarządzania funkcjami i konieczne jest włączenie ich z konsoli. Identyfikacja funkcji po GUIDzie jest żmudna, zwłaszcza, że zespół, który robił funkcjonalność tworzenia witryny uniemożliwił skopiowanie GUIDu brakujących funkcji zmuszając nas do przepisywania go ręcznie.
Wypracowałem metodę, która bardzo przyspieszy cały proces. Do jej wykonania potrzebujemy dostępu RDP do maszyny z SharePointem. Będziemy korzystali z PowerShella i narzędzia ULS Log viewer (darmowe, z CodePleksu).
Oto scenariusz:
  1.  Włączamy logowanie dla "Infrastruktura funkcji" ("Feature infrastructure") na poziom "Podlegający monitorowaniu" ("Monitorable").
  2. Uruchamiamy LogViewera, włączamy logowanie na żywo i wpisujemy "szablon witryny wymaga" do okna filtrowania. W przypadku angielskich witryn wpisujemy "site template requires".
  3. Próbujemy utworzyć witrynę.
  4. Dostajemy błąd, który złapie LogViewer. W komunikacie błędu będzie GUID funkcji, który możemy skopiować.
  5. Uruchamiamy konsolę PowerShella i wpisujemy komendę:
    Enable-SPFeature -url {adres witryny, pod którą tworzymy witrynę} -Identity {GUID funkcji}
    np. Enable-SPFeature -url http://intranet -Identity 861b0621-3ab9-46ec-859e-112c04535099
  6. Powtarzamy punkty 3-5 aż uda nam się stworzyć witrynę. 2 porady przyspieszające pracę: 
  • Po pierwszym otrzymaniu błędu, gdy zamkniemy okno z błędem guzik "utwórz" będzie wyszarzony. Jeżeli klikniemy "Więcej opcji" to będziemy mogli ponawiać tworzenie witryny
  • Wciskając F3 w konsoli PowerShell otrzymujemy ostatnią komendę. Wystarczy usunąć GUIDa poprzedniej funkcji i wkleić kolejnej.
Czasami może się okazać, że funkcja nie jest zainstalowana/wdrożona na wyższym poziomie i nie da się jej włączyć. Wtedy z pomocą przyjdzie nam przetłumaczenie GUIDa na nazwę funkcji. Na dole tego postu znajduje się listę większości GUIDów standardowych funkcji SharePointa, ale możemy po prostu wpisać GUID funkcji w wyszukiwarkę WWW i prawdopodobnie znajdziemy nazwę brakującej funkcji.
Jeżeli GUIDu funkcji nie ma na tej stronie, to jest duża szansa, że jest to jakaś funkcja rozwiązania firmy trzeciej. Jeżeli po wpisaniu GUIDu w Googla (lub Binga) nie dowiemy się jakiej funkcji brakuje to musimy na środowisku źródłowym odpalić następujący kod PowerShella:
Get-SPFeature {GUID}
np. Get-SPFeature 00bfea71-7e6d-4186-9ba8-c047ac750105
Dzięki temu dowiemy się co musimy zainstalować/wdrożyć.
Tak na marginesie - wystarczyłoby, żeby przy tworzeniu witryny nastąpiło sprawdzenie jakie funkcje są potrzebne używanemu szablonowi (bo jest to wpisane w manifeście) i udostępniono guzik "Włącz brakujące funkcje". Może ktoś z deweloperów zrobi takie małe narzędzie?
Powodzenia i cierpliwości! Dużo cierpliwości!
Lista funkcji i ich GUIDy:

Funkcja
GUID
AccSrvSolutionGallery
744b5fd3-3b09-4da6-9bd1-de18315b045d
AnnouncementsList
00bfea71-d1ce-42de-9c63-a44004ce0104
AssetLibrary
4bcccd62-dcaf-46dc-a7d4-e38277ef33f4
BaseSite
b21b090c-c796-4b0f-ac0f-7ef1659c20ae
BasicWebParts
00bfea71-1c5e-4a24-b310-ba51c3eb7a57
BizAppsCTypes
43f41342-1a37-4372-8ca0-b44d881e4434
BizAppsFields
5a979115-6b71-45a5-9881-cdc872051a69
BizAppsSiteTemplates
4248e21f-a816-4c88-8cab-79d82201da7b
ContactsList
00bfea71-7e6d-4186-9ba8-c047ac750105
CTypes
695b6570-a48b-4a8e-8ea5-26ea7fc1d162
CustomList
00bfea71-de22-43b2-a848-c05709900100
DataConnectionLibrary
00bfea71-dbd7-4f72-b8cb-da7ac0440130
DataSourceLibrary
00bfea71-f381-423d-b9d1-da7a54c50110
DiscussionsList
00bfea71-6a49-43fa-b535-d15c05500108
DocumentLibrary
00bfea71-e717-4e80-aa17-d0c71b360101
DocumentRoutingResources
0c8a9a47-22a9-4798-82f1-00e62a96006e
EnhancedTheming
068bc832-4951-11dc-8314-0800200c9a66
EnterpriseWikiLayouts
a942a218-fa43-4d11-9d85-c01e3e3a37cb
EventsList
00bfea71-ec85-4903-972d-ebe475780106
ExcelServerEdit
b3da33d0-5e51-4694-99ce-705a3ac80dc5
ExcelServerSite
3cb475e7-4e87-45eb-a1f3-db96ad7cf313
ExcelServerWebPart
4c42ab64-55af-4c7c-986a-ac216a6e0c0e
ExpirationWorkflow
c85e5759-f323-4efb-b548-443d2216efb5
ExternalList
00bfea71-9549-43f8-b978-e47e54a10600
FastEndUserHelpCollection
6e8f2b8d-d765-4e69-84ea-5702574c11d6
Fields
ca7bd552-10b1-4563-85b9-5ed1d39c962a
GanttTasksList
00bfea71-513d-4ca0-96c2-6a47775c0119
GridList
00bfea71-3a1d-41d3-a0ee-651d11570120
ICMSv2_Assests
07bb8c5f-4e8e-47ed-8ac9-a8e38f328d80
IPFSSiteFeatures
c88c4ff1-dbf5-4649-ad9f-c6c426ebcbf5
IssuesList
00bfea71-5932-4f9c-ad71-1557e5751100
IssueTrackingWorkflow
fde5d850-671e-4143-950a-87b473922dc7
LinksList
00bfea71-2062-426c-90bf-714c59600103
LocalSiteDirectoryControl
14aafd3a-fcb9-4bb7-9ad7-d8e36b663bbd
LocationBasedPolicy
063c26fa-3ccc-4180-8a84-b6f98e991df3
MobileExcelWebAccess
e995e28b-9ba8-4668-9933-cf5c146d7a9f
MobilePowerPointViewer
893627d9-b5ef-482d-a3bf-2a605175ac36
MobileWordViewer
8dfaf93d-e23c-4471-9347-07368668ddaf
MobilityRedirect
f41cc668-37e5-4743-b4a8-74d1db3fd8a4
MossChart
875d1044-c0cf-4244-8865-d2a0039c2a49
Navigation
89e0306d-453b-4ec5-8d68-42067cdbf98e
NoCodeWorkflowLibrary
00bfea71-f600-43f6-a895-40c0de7b0117
ObaSimpleSolution
d250636f-0a26-4019-8425-a5232d592c01
OfficeWebApps
0c504a5c-bcea-4376-b05e-cbca5ced7b4f
OffWFCommon
c9c9515d-e4e2-4001-9050-74f980f93160
OneNote
3d433d02-cf49-4975-81b4-aede31e16edf
PictureLibrary
00bfea71-52d4-45b3-b544-b1c71b620109
PortalLayouts
5f3b0127-2f1d-4cfd-8dd2-85ad1fb00bfc
PowerPointEditServer
738250ba-9327-4dc0-813a-a76928ba1842
PowerPointServer
5709298b-1876-4686-b257-f101a923f58d
PremiumSite
8581a8a7-cf16-4770-ac54-260265ddb0b2
PublishingLayouts
d3f51be2-38a8-4e44-ba84-940d35be1566
PublishingPrerequisites
a392da98-270b-4e85-9769-04c0fde267aa
PublishingResources
aebc918d-b20f-4a11-a1db-9ed84d79c87e
PublishingSite
f6924d36-2fa8-4f0b-b16d-06b7250180fa
Ratings
915c240e-a6cc-49b8-8b2c-0bff8b553ed3
RecordResources
5bccb9a4-b903-4fd1-8620-b795fa33c9ba
Reporting
7094bd89-2cfe-490a-8c7e-fbace37b4a34
ReportServer
e8389ec7-70fd-4179-a1c4-6fcb4342d7a0
ReviewWorkflowsSPD
b5934f65-a844-4e67-82e5-92f66aafe912
SearchExtensions
5eac763d-fbf5-4d6f-a76b-eded7dd7b0a5
SignaturesWorkflowSPD
c4773de6-ba70-4583-b751-2a7b1dc67e3a
SurveysList
00bfea71-eb8a-40b1-80c7-506be7590102
TasksList
00bfea71-a83e-497e-9ba0-7a5c597d0107
TaxonomyFieldAdded
73ef14b1-13a9-416b-a9b5-ececa2b0604c
TeamCollab
00bfea71-4ea5-48d4-a4ad-7ea5c011abe5
TranslationWorkflow
c6561405-ea03-40a9-a57f-f25472942a22
VisioWebAccess
9fec40ea-a949-407d-be09-6cba26470a0c
WACustomReports
af6d9aec-7c38-4dda-997f-cc1ddbb87c92
WAMaster
c04234f4-13b8-4462-9108-b4f5159beae6
WAReports
2acf27a5-f703-4277-9f5d-24d70110b18b
WAWhatsPopularWebPart
8e947bf0-fe40-4dff-be3d-a8b88112ade6
WebPageLibrary
00bfea71-c796-4402-9f2f-0eb9a6e71b18
WebPartAdderGroups
2ed1c45e-a73b-4779-ae81-1524e4de467a
WordViewer
1663ee19-e6ab-4d47-be1b-adeb27cfd9d2
WorkflowHistoryList
00bfea71-4ea5-48d4-a4ad-305cf7030140
workflowProcessList
00bfea71-2d77-4a75-9fca-76516689e21a
Workflows
0af5989a-3aea-4519-8ab0-85d91abe39ff
XmlFormLibrary
00bfea71-1e1d-4562-b56a-f05371bb0115


 

O blogu i o mnie

Zacząłem pisać tego bloga, bo czuję, że brakuje informacji po polsku o możliwościach zrobienia cudów w Sharepoincie bez kodowania. Mam nadzieję wypełnić tę lukę i dzielić się różnymi moimi spostrzeżeniami i odkryciami tak, żebyście mogli łatwiej używać SharePointa w Waszych organizacjach. Będę pisał głównie o konfigurowaniu SharePointa, dodatkach do SharePointa, customizacji SharePoint Designerem i InfoPathem oraz workflowach.

Zajmuję się SharePointem od 2003 roku, kiedy uczyłem się go w ekstrymalny sposób stawiając na nim w tydzień intranet dla Microsoft Polska. Mimo iż na początku czułem, że mózg wypływa mi uszami i kląłem na twórców SP, to witrynę udało się postawić, a ja zrozumiałem jak działa SharePoint i zakochałem się w nim. Wtedy byłem początkującym programistą, ale szybko zrozumiałem, że wolę być kimś, co obecnie nazywa sie IT Pro. Nie potrafię za bardzo programować, ale rozumiem jak działa SharePoint, wiem jak go skonfigurować i dostosować do moich potrzeb. Często grzebię w bebechach SharePointa i konfiguruję go z każdej możliwej strony, która nie wymaga uruchomienia Visual Studio.

Przez 11 lat współpracowałem z warszawską firmą Datapolis, która oprócz tego, że robi wdrożenia SharePointa i aplikacje na zamówienie to tworzy narzędzie do definicji workflowów - Workbox. Dołączyłem do zespołu, który robi Workboksa w 2008 i od tej pory przepływy na SharePoincie są moim konikiem. Przy Workboksie byłem odpowiedzialny za definiowanie funkcjonalności więc jego działanie jest w pewnej mierze moim dziełem. Lubię Workboksa za to samo za co lubię SharePointa - możliwość dość łatwego i szybkiego osiągnięcia wymaganej funkcjonalności.

Obecnie pracuję w Microsoft Polska na stanowisku Partner Technical Consultant, gdzie wspieram partnerów Microsoftu w lepszym wykorzystywaniu produktów MS.