View source
<?php
namespace Drupal\social_demo;
use Drupal\profile\Entity\ProfileInterface;
use Drupal\profile\ProfileStorageInterface;
use Drupal\file\FileStorageInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\profile\Entity\ProfileType;
use Drupal\taxonomy\TermStorageInterface;
use Drush\Log\LogLevel;
abstract class DemoUser extends DemoContent {
protected $profileStorage;
protected $fileStorage;
protected $termStorage;
public function __construct(array $configuration, $plugin_id, $plugin_definition, DemoContentParserInterface $parser, ProfileStorageInterface $profile_storage, FileStorageInterface $file_storage, TermStorageInterface $term_storage) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->parser = $parser;
$this->profileStorage = $profile_storage;
$this->fileStorage = $file_storage;
$this->termStorage = $term_storage;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('social_demo.yaml_parser'), $container
->get('entity.manager')
->getStorage('profile'), $container
->get('entity.manager')
->getStorage('file'), $container
->get('entity.manager')
->getStorage('taxonomy_term'));
}
public function createContent() {
$data = $this
->fetchData();
foreach ($data as $uuid => $item) {
if ($uuid !== $item['uuid']) {
drush_log(dt("User with uuid: {$uuid} has a different uuid in content."), LogLevel::ERROR);
continue;
}
$accounts = $this->entityStorage
->loadByProperties([
'uuid' => $uuid,
]);
if ($accounts) {
drush_log(dt("User with uuid: {$uuid} already exists."), LogLevel::WARNING);
continue;
}
if (!empty($item['image'])) {
$item['image'] = $this
->prepareImage($item['image'], $item['image_alt']);
}
else {
$item['image'] = NULL;
}
if (!empty($item['expertise'])) {
$item['expertise'] = $this
->prepareTerms($item['expertise']);
}
if (!empty($item['interests'])) {
$item['interests'] = $this
->prepareTerms($item['interests']);
}
if (!empty($item['roles'])) {
$item['roles'] = array_filter($item['roles']);
}
if (empty($item['roles'])) {
$item['roles'] = [
AccountInterface::AUTHENTICATED_ROLE,
];
}
$entry = $this
->getEntry($item);
$account = $this->entityStorage
->create($entry);
$account
->setPassword($item['name']);
$account
->enforceIsNew();
$account
->save();
if (!$account
->id()) {
continue;
}
$this->content[$account
->id()] = $account;
$profiles = $this->profileStorage
->loadByProperties([
'uid' => $account
->id(),
'type' => ProfileType::load('profile')
->id(),
]);
$profile = array_pop($profiles);
if ($profile instanceof ProfileInterface) {
$this
->fillProfile($profile, $item);
$profile
->save();
}
}
return $this->content;
}
protected function getEntry(array $item) {
$entry = [
'uuid' => $item['uuid'],
'name' => $item['name'],
'mail' => $item['mail'],
'init' => $item['mail'],
'timezone' => $item['timezone'],
'status' => $item['status'],
'created' => \Drupal::time()
->getRequestTime(),
'changed' => \Drupal::time()
->getRequestTime(),
'roles' => array_values($item['roles']),
];
return $entry;
}
protected function prepareTerms(array $values) {
$terms = [];
foreach ($values as $uuid) {
$term = $this->termStorage
->loadByProperties([
'uuid' => $uuid,
]);
$term = reset($term);
if (!empty($term)) {
$terms[] = [
'target_id' => $term
->id(),
];
}
}
return $terms;
}
protected function fillProfile(ProfileInterface $profile, array $item) {
$profile->field_profile_image = $item['image'];
$profile->field_profile_first_name = $item['first_name'];
$profile->field_profile_last_name = $item['last_name'];
$profile->field_profile_organization = $item['organization'];
$profile->field_profile_function = $item['function'];
$profile->field_profile_phone_number = $item['phone_number'];
$profile->field_profile_self_introduction = $item['self_introduction'];
$profile->field_profile_address = $item['address'];
$profile->field_profile_expertise = $item['expertise'];
$profile->field_profile_interests = $item['interests'];
}
}