How to: Use the client-side People Picker control in apps for SharePoint
Published: October 11, 2012
Learn how to use the client-side People Picker control in apps for SharePoint.
Applies to: SharePoint Foundation 2013 | SharePoint Server 2013
The client-side People Picker control lets users quickly search for and select valid user accounts for people, groups, and claims in their organization. The picker is an HTML and JavaScript control that provides cross-browser support. Adding the picker to your app is easy: In your markup, add a container element for the control and references for the control and its dependencies. Then in your script, call the SPClientPeoplePicker_InitStandaloneControlWrapper global function to render and initialize the picker.
The picker is represented by the SPClientPeoplePicker object, which provides methods that other client-side controls can use to get information from the picker or to perform other operations. You can use SPClientPeoplePicker properties to configure the picker with control-specific settings, such as allowing multiple users or specifying caching options. The picker also uses web application configuration settings such as Active Directory Domain Services parameters or targeted forests. Web application configuration settings are picked up automatically (from the SPWebApplication.PeoplePickerSettings property).
The picker has the following components:
-
An input text box to enter names for users, groups, and claims.
-
A span control that shows the names of resolved users, groups, and claims.
-
A hidden div element that autofills a drop-down box with matching query results.
-
An autofill control.
Note
|
|---|
|
The picker and its functionality are defined in the clientforms.js, clientpeoplepicker.js, and autofill.js script files, which are located in the %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\15\TEMPLATE\LAYOUTS folder on the server. |
This article assumes that you create the app for SharePoint by using "Napa" Office 365 Development Tools on an Office 365 Developer Site. If you're using this development environment, you've already met the prerequisites.
Note
|
|---|
|
Go to Sign up for an Office 365 Developer Site to find out how to sign up for a Developer Site and start using "Napa" Office 365 Development Tools. |
If you're not using "Napa" Office 365 Development Tools on a Developer Site, you'll need the following:
-
SharePoint 2013 with at least one target user
-
Visual Studio 2012
-
Office Developer Tools for Visual Studio 2012
Note
|
|---|
|
For guidance about how to set up a development environment that fits your needs, see Start building apps for Office and SharePoint. |
The following steps describe the high-level steps for adding the picker to your app and then getting its user information from another client-side control. See Code example: Using the client-side People Picker for the corresponding code.
In your page markup
-
Add references to the client-side People Picker control's script dependencies.
-
Add the HTML tags for the page UI. The app in this example defines two div elements: one for the picker to render in and one for the button that invokes script to query the picker.
In your script
-
Create a JSON dictionary to use as a schema that stores picker-specific properties, such as AllowMultipleValues and MaximumEntitySuggestions.
-
Call the SPClientPeoplePicker_InitStandaloneControlWrapper global function.
-
Get the picker object from the page.
-
Query the picker. The app in this example calls the GetAllUserInfo method to get all user information for the resolved users and the GetAllUserKeys method to just get the keys for the resolved users.
Rendering, initializing, and other functionality for the picker are handled by the server, including searching and resolving user input against the SharePoint authentication providers.
The following HTML and JavaScript code examples add a client-side People Picker control to an app for SharePoint.
The first example shows the page markup for the PlaceHolderMain asp:Content tags in the Default.aspx page. This code references the picker's script dependencies, gives a unique ID to the DOM element where the picker will render, and defines the app's UI.
<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server"> <SharePoint:ScriptLink name="clienttemplates.js" runat="server" LoadAfterUI="true" Localizable="false" /> <SharePoint:ScriptLink name="clientforms.js" runat="server" LoadAfterUI="true" Localizable="false" /> <SharePoint:ScriptLink name="clientpeoplepicker.js" runat="server" LoadAfterUI="true" Localizable="false" /> <SharePoint:ScriptLink name="autofill.js" runat="server" LoadAfterUI="true" Localizable="false" /> <SharePoint:ScriptLink name="sp.js" runat="server" LoadAfterUI="true" Localizable="false" /> <SharePoint:ScriptLink name="sp.runtime.js" runat="server" LoadAfterUI="true" Localizable="false" /> <SharePoint:ScriptLink name="sp.core.js" runat="server" LoadAfterUI="true" Localizable="false" /> <div id="peoplePickerDiv"></div> <div> <br/> <input type="button" value="Get User Info" onclick="getUserInfo()"></input> <br/> <h1>User info:</h1> <p id="resolvedUsers"></p> <h1>User keys:</h1> <p id="userKeys"></p> </div> </asp:Content>
Note
|
|---|
|
Depending on your environment, you might not have to explicitly reference all of these dependencies. |
The following example shows the script from the App.js file. This script initializes and renders the picker, and then queries it for user information.
// Run your custom code when the DOM is ready. $(document).ready(function () { // Specify the unique ID of the DOM element where the // picker will render. initializePeoplePicker('peoplePickerDiv'); }); // Render and initialize the client-side People Picker. function initializePeoplePicker(peoplePickerElementId) { // Create a schema to store picker properties, and set the properties. var schema = {}; schema['PrincipalAccountType'] = 'User,DL,SecGroup,SPGroup'; schema['SearchPrincipalSource'] = 15; schema['ResolvePrincipalSource'] = 15; schema['AllowMultipleValues'] = true; schema['MaximumEntitySuggestions'] = 50; schema['Width'] = '280px'; // Render and initialize the picker. // Pass the ID of the DOM element that contains the picker, an array of initial // PickerEntity objects to set the picker value, and a schema that defines // picker properties. this.SPClientPeoplePicker_InitStandaloneControlWrapper(peoplePickerElementId, null, schema); } // Query the picker for user information. function getUserInfo() { // Get the people picker object from the page. var peoplePicker = this.SPClientPeoplePicker.SPClientPeoplePickerDict.peoplePickerDiv_TopSpan; // Get information about all users. var users = peoplePicker.GetAllUserInfo(); var userInfo = ''; for (var i = 0; i < users.length; i++) { var user = users[i]; for (var userProperty in user) { userInfo += userProperty + ': ' + user[userProperty] + '<br>'; } } $('#resolvedUsers').html(userInfo); // Get user keys. var keys = peoplePicker.GetAllUserKeys(); $('#userKeys').html(keys); }
Note