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:

gutek_moss_0701

Samo tworzenie takiego pola, nie jest ciężkie, trzeba podać tylko kilka parametrów:

gutek_moss_0702

A jego wygląd na stronie edycji elementu też zbytnio się nie różni od pola People And Groups:

gutek_moss_0703

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:

gutek_moss_0704

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ć.

10 KOMENTARZE

  1. 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? :)

  2. @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

  3. Probowalem tez dodac id listy i id pola powiazanego do konstruktora mojej klasy dziedziczacej po SPFieldLookup ale nie pomoglo…

  4. @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

  5. 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

  6. @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.

Comments are closed.