2017-07-15 41 views
1

J'essaye de construire un WebPart de SPFX avec le tissu d'interface de bureau de React. J'ai une liste SharePoint avec un champ People appelé AssignedTo. Les valeurs d'ID sont comme 12, 20 et ainsi de suite. Lorsque je sélectionne une personne avec le PeoplePicker, j'obtiens AccountName comme i:0#.f|membership|[email protected] et un GUID comme ff53b41e-d11a-435c-9cd1-d708e71ee7c7. Comment puis-je "convertir" les informations du PeoplePicker en ID, le champ Personnes dans la liste utilise?SPFx comment définir un champ de personnes dans une liste, par ex. "Convert" NomCompte à ID de recherche?

Le Peoplepicker récupère le peuple comme suit:

private searchPeople(terms: string, results: IPersonaProps[]): IPersonaProps[] | Promise<IPersonaProps[]> { 
    return new Promise<IPersonaProps[]>((resolve, reject) => 
    this.props.spHttpClient.get(`${this.props.siteUrl}/_api/search/query?querytext='*${terms}*'&rowlimit=20&sourceid='b09a7990-05ea-4af9-81ef-edfab16c4e31'`, 
    SPHttpClient.configurations.v1, 
    { 
     headers: { 
     'Accept': 'application/json;odata=nometadata', 
     'odata-version': '' 
     } 
    }) 
    .then((response: SPHttpClientResponse): Promise<{ PrimaryQueryResult: IPeopleDataResult }> => { 
     return response.json(); 
    }) 
    .then((response: { PrimaryQueryResult: IPeopleDataResult }): void => { 
     let relevantResults: any = response.PrimaryQueryResult.RelevantResults; 
     let resultCount: number = relevantResults.TotalRows; 
     let people = []; 
     if (resultCount > 0) { 
     relevantResults.Table.Rows.forEach((row) => { 
      let persona: IPersonaProps = {}; 
      row.Cells.forEach((cell) => { 

      if (cell.Key === 'PictureURL') 
      { 
       persona.imageUrl = cell.Value; 
      } 
      else if (cell.Key === 'PreferredName') 
      {     
       persona.primaryText = cell.Value; 
       persona.imageInitials = cell.Value.charAt(0) + (cell.Value.lastIndexOf(" ") > 0 ? cell.Value.charAt(cell.Value.lastIndexOf(" ") + 1) : ""); 
      } 
      else if (cell.Key === 'AccountName') 
      {     
       persona.itemID = cell.Value; // e.g.: "i:0#.f|membership|[email protected]" 
      } 
      else if (cell.Key === 'UserProfile_GUID') 
      {     
       persona.itemID = cell.Value; // e.g.: "ff53b41e-d11a-435c-9cd1-d708e71ee7c7" 
      } 
      }); 
      people.push(persona); 
     }); 
     } 
     resolve(people); 
    }, (error: any): void => { 
     reject(this._peopleList = []); 
    })); 
} 

-je obtenir la liste des articles comme suit:

private _getItems(requester: SPHttpClient): Promise<IInteractionLogItem[]> { 
    const queryString: string = `?$select=Id,Title,Client/Id,Client/Title,Client/EMail,Client/MobilePhone,` + 
    `$expand=Client`; 
const queryUrl: string = this._listItemsUrl + queryString; 

return requester.get(queryUrl, SPHttpClient.configurations.v1) 
    .then((response: SPHttpClientResponse) => { 
    return response.json(); 
    }) 
    .then((json: { value: IInteractionLogItem[] }) => { 
    return json.value.map((interactionLog: IInteractionLogItem) => { 
     const returnItem: IInteractionLogItem = 
     { 
     Id: interactionLog.Id, 
     Title: interactionLog.Title, 
     Client: interactionLog.Client, 
     }; 

     returnItem.CreatedBy.Picture = this._getPictureUrl(returnItem.CreatedBy.EMail); 

     if(returnItem.Client) 
     { 
     returnItem.Client.Picture = this._getPictureUrl(returnItem.Client.EMail); 
     } 

     return returnItem; 
    }); 
    }); 
} 

Toute aide est très appréciée :-)

Répondre

1

Un appel à api/web/ensureuser en utilisant le SPHttpClient est nécessaire. Il s'assure que l'utilisateur demandé est chargé dans le userinfo du site SharePoint. En utilisant le donné AccountName comme i:0#.f|membership|[email protected] de la recherche en tant que paramètre. Le SPUser renvoyé contient le champ Id pour la colonne Recherche. Je mis en œuvre la méthode suivante:

public EnsureUser(userName: string): Promise<ISPUser> { 
    console.log("SharePointDataProvider.EnsureUser(\"" + userName + "\")"); 
    var data = {logonName: userName}; 

    return this._webPartContext.spHttpClient.post(
    this._ensureUserUrl, 
    SPHttpClient.configurations.v1, 
    { body: JSON.stringify(data) }).then(
     (value: SPHttpClientResponse) => { 
     console.log("SharePointDataProvider.EnsureUser FullFill: statusText:\"" + value.statusText + "\""); 
     return value.json(); 
     }, 
     (error: any) => console.log("SharePointDataProvider.EnsureUser Rejected: " + error) 
    ).then((json: ISPUser) => { 
     console.log("SharePointDataProvider.EnsureUser FullFill: Id:" + json.Id +" LoginName:\"" + json.LoginName + "\""); 
     return json; 
    }); 
} 

Mon interface mini ISPUser:

interface ISPUser 
{ 
    Email: string; 
    Id: number; 
    LoginName: string; 
    Title: string; 
}