/** * Imports the given user * @param int $id Old ID * @param bool|true $flush Should be true if the entity should get flushed * @return null|User Newly imported user * @throws \Doctrine\DBAL\DBALException */ public function importUser($id, $flush = true) { $this->consoleOutput->writeln("Reading user #" . $id . "... ", true); $sql = "SELECT * FROM users WHERE users.user_id = :id " . ImportHelper::spamUsersFilterSql(); $statement = $this->dbalConnection->prepare($sql); $statement->bindValue('id', $id); $statement->execute(); $faker = Factory::create(); $pkpUser = $statement->fetch(); $user = null; if ($pkpUser) { if (!empty($pkpUser['username'])) { $user = $this->em->getRepository('OjsUserBundle:User')->findOneBy(['username' => $pkpUser['username']]); if (!$user) { $user = $this->em->getRepository('OjsUserBundle:User')->findOneBy(['email' => $pkpUser['email']]); } } if (is_null($user)) { $user = new User(); !empty($pkpUser['username']) ? $user->setUsername($pkpUser['username']) : $user->setUsername($faker->userName); !empty($pkpUser['email']) ? $user->setEmail($pkpUser['email']) : $user->setEmail($faker->companyEmail); !empty($pkpUser['disabled']) ? $user->setEnabled(!$pkpUser['disabled']) : $user->setEnabled(1); // Set a random password $password = mb_substr($this->tokenGenerator->generateToken(), 0, 8); $user->setPlainPassword($password); // Fields which can't be blank !empty($pkpUser['first_name']) ? $user->setFirstName($pkpUser['first_name']) : $user->setFirstName('Anonymous'); !empty($pkpUser['last_name']) ? $user->setLastName($pkpUser['last_name']) : $user->setLastName('Anonymous'); // Optional fields !empty($pkpUser['billing_address']) && $user->setBillingAddress($pkpUser['billing_address']); !empty($pkpUser['mailing_address']) && $user->setAddress($pkpUser['mailing_address']); !empty($pkpUser['gender']) && $user->setGender($pkpUser['gender']); !empty($pkpUser['phone']) && $user->setPhone($pkpUser['phone']); !empty($pkpUser['fax']) && $user->setFax($pkpUser['fax']); !empty($pkpUser['url']) && $user->setUrl($pkpUser['url']); $this->em->persist($user); if ($flush) { $this->em->flush(); } } return $user; } return null; }
/** * Imports users of the given journal * @param int $newJournalId New journal's ID * @param int $oldJournalId Old journal's ID * @param UserImporter $userImporter User importer class * @throws \Doctrine\DBAL\DBALException */ public function importJournalUsers($newJournalId, $oldJournalId, $userImporter) { $this->em->clear(); $journal = $this->em->getRepository('OjsJournalBundle:Journal')->find($newJournalId); $roleMap = ['1' => "ROLE_ADMIN", '2' => "ROLE_USER", '10' => "ROLE_JOURNAL_MANAGER", '100' => "ROLE_EDITOR", '200' => 'ROLE_SECTION_EDITOR', '300' => 'ROLE_LAYOUT_EDITOR', '1000' => "ROLE_REVIEWER", '2000' => 'ROLE_COPYEDITOR', '3000' => "ROLE_PROOFREADER", '10000' => "ROLE_AUTHOR", '100000' => 'ROLE_READER', '200000' => "ROLE_SUBSCRIPTION_MANAGER"]; // Replace role names with role entities foreach ($roleMap as $id => $name) { $role = $this->em->getRepository('OjsUserBundle:Role')->findOneBy(['role' => $name]); if (!$role) { $role = new Role(); $role->setName($name); $role->setRole($name); } $roleMap[$id] = $role; } $roleStatement = $this->dbalConnection->prepare("SELECT roles.journal_id, roles.user_id, roles.role_id, users.email FROM " . "roles JOIN users ON roles.user_id = users.user_id WHERE roles.journal_id" . "= :id " . ImportHelper::spamUsersFilterSql()); $roleStatement->bindValue('id', $oldJournalId); $roleStatement->execute(); $roles = $roleStatement->fetchAll(); $cache = array(); foreach ($roles as $role) { $email = $role['email']; // Put the user from DB to cache if (empty($cache[$email]['user'])) { $cache[$email]['user'] = $this->em->getRepository('OjsUserBundle:User')->findOneBy(['email' => $email]); } // Create the user and put it to cache if (empty($cache[$email]['user'])) { $cache[$email]['user'] = $userImporter->importUser($role['user_id'], false); } /** @var JournalUser $journalUser */ $journalUser = $this->getJournalUser($cache, $email, $journal); $journalUser->addRole($roleMap[dechex($role['role_id'])]); } $this->consoleOutput->writeln("Writing data..."); $this->em->flush(); $this->consoleOutput->writeln("Imported users."); }