O co chodzi? Pierwsza część nazwy jest chyba zrozumiała, zwykłe pole lookup, które umożliwia pobieranie danych z listy umiejscowionej na innej stronie. Tutaj należą się wyjaśnienia. Jako stronę mam namyśli SPSite, nie SPWeb ani SPWebApplication. W jednym SPSite może być wiele SPWeb, zaś SPSite należy do jakiegoś SPWebApplication. Więc cross-site to nie lookup po wielu SPSite, tylko lookup po wszystkich SPWeb należących do danego SPSite. Nie zależnie od tego czy SPWeb zawiera pod-stronę czy jej nie zawiera.
No dobrze, ale samo cross-site to nie taka nowość, jednak PickerDialog, to już nowość :) Na pewno korzystaliście z pola People And Groups, umożliwiającego przeszukiwania osób w danym SPWeb. To wyobraźcie sobie takie samo okno, ale z możliwością wybierania elementów z listy :)
Zdecydowałem się stworzyć ten przykład, gdyż w sieci na ten temat nie ma wielu artykułów, tak naprawdę to nie ma żadnego wartościowego, te artykułu na które ja natrafiłem można znaleźć poniżej:
Osobiście polecam zapoznania się z tymi artykułami, są krótkie ale i dość treściwe.
No więc, jak już mniej więcej wiecie o co chodzi. To wygląda to tak:
Samo tworzenie takiego pola, nie jest ciężkie, trzeba podać tylko kilka parametrów:
A jego wygląd na stronie edycji elementu też zbytnio się nie różni od pola People And Groups:
Oczywiście, użytkownik nie tylko może przeszukiwać po wartości Imię, ale także w zależności od wartości stworzonego pola, także po innych wartościach:
No dobrze, to tyle prezentacji pola, pora przejść do konkretów.
Chciałem dokładnie opisać sposób tworzenia takiego pola, jednak po tym jak zakończyłem kod stwierdziłem iż samo opisanie tego spowoduje stworzenie kolejnego 30/40 stronnicowego wpisu. Dlatego też zmieniłem zdanie, zamiast dokładnego opisywania, stworzyłem przykład z (sądzę) bardzo dokładnymi opisami, które posłużą wam w kwestii wyjaśnienia pewnych zachować kontrolki, oraz sposobu jej tworzenia.
To co jest najważniejsze przy tworzeniu pola z wykorzystaniem PickerDialog, to przeciążenie trzech klas:
- EntityEditorWithPicker – Klasa odpowiedzialna za pole wyszukiwania oraz pole edycji wartości naszego lookup – chodzi o ten prosty input. To co tu jest bardzo ważne i należy to zrobić to należy przeciążyć metodę OnInit, w której należy ustawić własność bazowąPickerDialogType na nasze okno dialogowe, reszta metod i wartość nie jest konieczna oraz przymusowa;
- PickerDialog – Klasa odpowiedzialna za wyświetlenie okna dialogowego i jego obsługę. W klasie najważniejszy jest konstruktor (który może być bezparametrowy). To co jest tutaj ważne to, aby w konstruktorze lub w metodzie OnLoad tworzyć kolumny w oknie dialogowym, które będą służyć wyświetlaniu wyników, oraz by nasz konstruktor wywoływał konstruktor bazowy z trzema parametrami:
- Nową klasą dziedziczącą po SimpleQueryControls;
- Klasą odpowiedzialną za wyświetlanie wyników (domyślnie można zastosować TableResultControl);
- Nową klasą dziedziczącą po EntityEditorWithPicker.
- SimpleQueryControl – Przeciążona klasa musi udostępniać metodę umożliwiającą przeszukiwanie danych po ciągu znaków wprowadzonym w oknie dialogowym. W tym celu ważne jest przeciążenie metody IssueQuery.
I to tak w skrócie :) Naprawdę starałem się zawrzeć jak najdokładniejsze komentarze w kodzie byście mogli z samego kodu wyciągnąć więcej niż na z samego opisu w postcie.
Dlatego zapraszam do korzystania (sposób instalacji w pliku Readme.txt).
Cały kod można pobrać z stąd: Pole Cross-Site Lookup Field With PickerDialog.
Jeżeli macie jakiekolwiek pytania, lub coś jest niejasnego w komentarzach do kodu, stwórzcie komentarz do postu, postaram się na wszystkie pytania odpowiedzieć.
Stworzylem kontrolke, ale wycialem z niej cala funkcjonalnosc zwiazana z konfigurowaniem, tzn. potrzebuje ja tylko dla jednej listy i jednego pola. Nie dodalem plikow .aspx oraz edytora fielda.
Wszystko działa oprocz zapisywania lookup’a… Wiesz moze gdzie lezy problem i jak go ominac? :)
@blbu
Co masz na mysli mowiac “zapisywanie lookup” w sensie dane nie widnieja na liscie po tym jak wybierzesz wartosc? czy to ze lookup traci swoja konfiguracje (odwolanie do jednej listy i jednego pola)? Czy to iz nie mozna stworzyc lookup za pomoca create column?
Gutek
dane nie widnieja na liscie po tym jak wybiore wartosc.
Probowalem tez dodac id listy i id pola powiazanego do konstruktora mojej klasy dziedziczacej po SPFieldLookup ale nie pomoglo…
@blbu
Chyba najprosciej bedzie jak spakujesz to swoje pole i przeslesz mi je: jakubDOTgutkowskiATgmailDOTcom
zmianiec slowa na znaki. Bo tak to ciezko mi jest cokolwiek powiedzieciec. Mam kilka przypuszczen jednak lepiej to przeniesc na maila niz tworzyc 100 komentarzy :)
Gutek
Gutek
To tak na wszeki wypadek. Zrobilismy wczoraj analize pola, i wyszlo na to iz edytor pola jest potrzebny by ustawic wartosci lookup, w przeciwnym wypadku wartosc nie bedzie zapisywana. Dlaczego, ciezko powiedziec. BaseFieldControl w trakcie ladowania wywoluje metody get i set na Value i w tym konkretnym przypadku metoda set nigdy nie byla wywolana.
Wiec, ku przestrodze, warto stworzyc wlasny edytor nawet jezeli ma on nie zawierac zadnych kontrolek i tam inicjowac swoje pola! :)
Gutek
Polecam to
http://cglessner.blogspot.com/2008/07/lookup-field-with-picker.html
Wraz z kodem na CODEPLEX
http://www.codeplex.com/iLoveSharePoint/Release/ProjectReleases.aspx?ReleaseId=15381
Sam sie troche namordowałem z tym :|
Czy tego MOSS’a nie mozna było jakos po ludzku udokumentować ;P a nie szukac wszystkiego po blogach ;) kto to widzial ;) :P
@woro
Bawilem sie tym, ma duzo bledow :( nie waliduje sie i tam jeszcze pare rzeczy wylapalem (nie spisalem ich ale byly wkurzajace jak np.: przeszukiwanie tylko po glownym kontenerze a nie zaglebianie sie w podfoldery, mimo iz w PickerDialog przeszukuje podfoldery).
ale fajny bajer ma z kodem do PowerShell, fajnie iz podmienia on Lookupy na to jego pole.
Witam.
Czy bedzie Pan mogl odpisac na miala na weekendzie?
Modyfikuje Pana przyklad i mam kilka pytan
Z powazaniem
Marcin Migdal
[email protected]
@Marcin
Jasne, wysalem Ci juz maila
Gutek
Comments are closed.