Ejemplo n.º 1
0
 /**
  * Create a new user. The created user is published by this method
  *
  * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreateStruct the data used for creating the user
  * @param \eZ\Publish\API\Repository\Values\User\UserGroup[] $parentGroups the groups which are assigned to the user after creation
  *
  * @return \eZ\Publish\API\Repository\Values\User\User
  *
  * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group
  * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userCreateStruct is not valid
  * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or set to an empty value
  * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a user with provided login already exists
  */
 public function createUser(APIUserCreateStruct $userCreateStruct, array $parentGroups)
 {
     if (empty($parentGroups)) {
         throw new InvalidArgumentValue("parentGroups", $parentGroups);
     }
     if (!is_string($userCreateStruct->login) || empty($userCreateStruct->login)) {
         throw new InvalidArgumentValue("login", $userCreateStruct->login, "UserCreateStruct");
     }
     if (!is_string($userCreateStruct->email) || empty($userCreateStruct->email)) {
         throw new InvalidArgumentValue("email", $userCreateStruct->email, "UserCreateStruct");
     }
     if (!ezcMailTools::validateEmailAddress($userCreateStruct->email)) {
         throw new InvalidArgumentValue("email", $userCreateStruct->email, "UserCreateStruct");
     }
     if (!is_string($userCreateStruct->password) || empty($userCreateStruct->password)) {
         throw new InvalidArgumentValue("password", $userCreateStruct->password, "UserCreateStruct");
     }
     if (!is_bool($userCreateStruct->enabled)) {
         throw new InvalidArgumentValue("enabled", $userCreateStruct->enabled, "UserCreateStruct");
     }
     try {
         $this->userHandler->loadByLogin($userCreateStruct->login);
         throw new InvalidArgumentException("userCreateStruct", "User with provided login already exists");
     } catch (NotFoundException $e) {
         // Do nothing
     }
     $contentService = $this->repository->getContentService();
     $locationService = $this->repository->getLocationService();
     $contentTypeService = $this->repository->getContentTypeService();
     if ($userCreateStruct->contentType === null) {
         $userContentType = $contentTypeService->loadContentType($this->settings['userClassID']);
         $userCreateStruct->contentType = $userContentType;
     }
     $locationCreateStructs = array();
     foreach ($parentGroups as $parentGroup) {
         $parentGroup = $this->loadUserGroup($parentGroup->id);
         if ($parentGroup->getVersionInfo()->getContentInfo()->mainLocationId !== null) {
             $locationCreateStructs[] = $locationService->newLocationCreateStruct($parentGroup->getVersionInfo()->getContentInfo()->mainLocationId);
         }
     }
     // Search for the first ezuser field type in content type
     $userFieldDefinition = null;
     foreach ($userCreateStruct->contentType->getFieldDefinitions() as $fieldDefinition) {
         if ($fieldDefinition->fieldTypeIdentifier == 'ezuser') {
             $userFieldDefinition = $fieldDefinition;
             break;
         }
     }
     if ($userFieldDefinition === null) {
         throw new ContentValidationException("Provided content type does not contain ezuser field type");
     }
     $fixUserFieldType = true;
     foreach ($userCreateStruct->fields as $index => $field) {
         if ($field->fieldDefIdentifier == $userFieldDefinition->identifier) {
             if ($field->value instanceof UserValue) {
                 $userCreateStruct->fields[$index]->value->login = $userCreateStruct->login;
             } else {
                 $userCreateStruct->fields[$index]->value = new UserValue(array('login' => $userCreateStruct->login));
             }
             $fixUserFieldType = false;
         }
     }
     if ($fixUserFieldType) {
         $userCreateStruct->setField($userFieldDefinition->identifier, new UserValue(array('login' => $userCreateStruct->login)));
     }
     $this->repository->beginTransaction();
     try {
         $contentDraft = $contentService->createContent($userCreateStruct, $locationCreateStructs);
         // Create user before publishing, so that external data can be returned
         $spiUser = $this->userHandler->create(new SPIUser(array('id' => $contentDraft->id, 'login' => $userCreateStruct->login, 'email' => $userCreateStruct->email, 'passwordHash' => $this->createPasswordHash($userCreateStruct->login, $userCreateStruct->password, $this->settings['siteName'], $this->settings['hashType']), 'hashAlgorithm' => $this->settings['hashType'], 'isEnabled' => $userCreateStruct->enabled, 'maxLogin' => 0)));
         $publishedContent = $contentService->publishVersion($contentDraft->getVersionInfo());
         $this->repository->commit();
     } catch (Exception $e) {
         $this->repository->rollback();
         throw $e;
     }
     return $this->buildDomainUserObject($spiUser, $publishedContent);
 }