People Picker 라는 것은 SharePoint 내에 특정 사용자나 그룹 등을 등록할 때 사용하는 UI용 웹컨트롤을 의미한다. SharePoint를 사용하다 보면, 사용자 등록 할 때 보이는 부분(아래 그림 참조)가 있는데 그 것이 바로 People Picker 이다.




이 기능은 설치된 SharePoint의 기본 인증 형태에 따라 사용자 검색하는 방법이 알아서 적절히 바뀌어 적용된다. 로그인 이름이로도 되고, 한글 이름도 되고, 이메일도 가능하다.
물론 사용자 프로필을 어떻게 엮어 놓았냐에 따라 잘 될 수도 안될 수도 있다.
일단, AD를 이용하여 구성했다면, 큰 문제  없이 이용할 수 있다.
아래의 설명도 최소한 AD로 구성된 시스템에서는 문제 없이 사용할 수 있을 것이다.
그리고 설명을 위해 ASPX 페이지 구성을 기준으로 설명할 것이다.

1. Web Control 붙이기.
이 웹컨트롤을 붙이기 위해서는 ASPX 페이지 소스 상에 WSS에 대한 Name Space를 정의해 준다.

<%@ Register Tagprefix="wssawc" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<%@ Register ..... %>라는 지시어를 이용해서 Microsoft.SharePoint.Webcontrols를 정의해준다. 여기서는 wssawc 라는 이름으로 구성한다.

2. 붙이고 싶은 위치에 웹컨트롤 붙이기.
Table이 되었던, 날 페이지위에 되었던 간에 원하는 위치에 아래와 같은 형식으로 Web Control 코드 부분을 붙인다.
<wssawc:PeopleEditor
        AllowEmpty=false
        ValidatorEnabled="true"
        id="userPicker"
        runat="server"
        ShowCreateButtonInActiveDirectoryAccountCreationMode=true
        SelectionSet="User,SecGroup,SPGroup"
        />

일단 각 옵션들에 대한 자세한 설명이나 추가 옵션에 대해서는 WSS 도움말(WSS SDK)에서 PeopleEditor를 참조한다.

3. PeoplePicker에서 선택한 내용 읽어 오기.
1~2 까지 해서 ASPX 페이지를 구성한 뒤 띄워보면, 맨 위의 그림과 같은 PeoplePicker를 볼 수 있다. 그 안에서 사람이름을 치거나, 로그인 이름을 치고 사람 아이콘에 체크 모양이 있는 버튼을 클릭하면,  자동으로 이름으로 변경되면서 밑줄이 그어짐을 볼 수 있다.



이렇게 입력한 내용을 읽어오는 부분을 소스로 구성하면 아래와 같다.

ArrayList aryAccounts = userPicker.Accounts;
if (aryAccounts.Count == 0)
      return string.Empty;
StringBuilder sb = new StringBuilder();
foreach (string sKey in aryAccounts)
{
      sb.Append(sKey);
      sb.Append(";");
}
return sb.ToString();

위의 소스 중 핵심적인 부분은 바로 굵은 줄 부분인데, Picker 컨트롤의 Member 중 Account를 열면 ArrayList가 나오게 된다. 일단 이 ArrayList를 꺼내서 보게 되면, 문자열로 로그인 이름이 나오게 되는데, 그 로그인 이름을 이용하여 원하는 조작을 수행하면 된다.
위의 소스에서는 Picker로 선택한 사용자의 모든 로그인 이름을 ";"으로 구분하여 하나의 문자열로 만드는 것이다.

4. PeoplePicker에 특정 데이터 넣기.
이번에서는 소스에서 PeoplePicker 내에 특정 값을 넣는 작업이다. 처음에는 추가하고자 하는 값을 넣는 메소드나 콜랙션 프로퍼티가 없어서 난감했다. 더욱이 위의 Accounts 라는 콜랙션에 직접적으로 ADD 할 수 없었다. 이에 Method를 더 확인해 본 결과, ArrayList를 통채로 넣는 UpdateEntities 라는 함수를 이용해야 했다.
그런데, 이 ArrayList 라는게 값을 넣는 방법이 Object 라서 로그인 이름을 그냥 넣어서 추가했더니 이번에는 단순 문자열은 받아 줄 수 없다는 오류가 발생하면서 넣어지지 않는 것이다. 그래서 이래저래 짱구를 굴린 결과 아래와 같은 형태의 소스를 구성할 수 있었다.
ArrayList aryAccounts = userPicker.Accounts;
aryAccounts.Clear();
if (string.IsNullOrEmpty(sAdminList) == false)
{
    string[] aryAdminList = sAdminList.Split(';');
    foreach (string sAdminID in aryAdminList)
    {
        Microsoft.SharePoint.WebControls.PickerEntity newEntity = new Microsoft.SharePoint.WebControls.PickerEntity();
        newEntity.Key = sAdminID;
        newEntity = userPicker.ValidateEntity(newEntity);
        aryAccounts.Add(newEntity);
    }
}
userPicker.UpdateEntities(aryAccounts);

핵심적인 부분은 저 굵은 글자가 된 부분이다.
일단 Accounts를 이용해서 ArrayList를 가져온다.
그리고 난뒤 PickerEntity 라는 클래스를 이용해 새로운 PickerEntity를 만든다.
이 새로 만든 PickerEntity의 속성 값에 로그인 이름이나, 이메일 등 검색 단서에 해당하는 값을 넣어준다. 여기서는 제일 만만한 로그인 이름을 넣었다.
그리고 난뒤, PeoplePicker를 이용해서 ValidateEntity 함수를 실행해준다. 이렇게 실행하면 PeopleEntity가 새롭게 돌려주는데, 이 안에 Key 값외의 다양한 속성 값들을 채워 준다.
이 새롭게 채운 PeopleEntity를 ArrayList에 추가한다.
그리고 난 뒤 업데이트 된 ArrayList를 UpdateEntities라는 메소드를 이용해 추가해 준다.

--- 이미지업데이트 : 고객사 사이트에서 자료를 캡쳐해 오다가 보니, 실수로 고객사 분 성함과 이메일이 그대로 노출되 버렸더군요... 다행히 회사의 김진 과장님이 가르쳐 주셔서 잽싸게 모자이크 처리를....-_-;;; 이런 실수 안해야 되는데, 큰일 날뻔 했습니다.


728x90

+ Recent posts

728x90