You are here

function social_profile_privacy_update_8001 in Open Social 10.2.x

Same name and namespace in other branches
  1. 10.3.x modules/social_features/social_profile/modules/social_profile_privacy/social_profile_privacy.install \social_profile_privacy_update_8001()
  2. 10.0.x modules/social_features/social_profile/modules/social_profile_privacy/social_profile_privacy.install \social_profile_privacy_update_8001()
  3. 10.1.x modules/social_features/social_profile/modules/social_profile_privacy/social_profile_privacy.install \social_profile_privacy_update_8001()

Define visibility options of separate fields per user.

File

modules/social_features/social_profile/modules/social_profile_privacy/social_profile_privacy.install, line 72
The social profile privacy install file.

Code

function social_profile_privacy_update_8001(&$sandbox) {
  if (!isset($sandbox['total'])) {
    $sandbox['users'] = \Drupal::database()
      ->select('users_data', 'ud')
      ->fields('ud', [
      'uid',
    ])
      ->condition('module', 'social_profile_privacy')
      ->condition('name', 'fields')
      ->execute()
      ->fetchCol();
    $query = \Drupal::database()
      ->select('users_data', 'ud')
      ->fields('ud')
      ->condition('module', 'social_profile_privacy')
      ->condition('name', 'private_info');
    if ($sandbox['users']) {
      $query
        ->condition('uid', $sandbox['users'], 'NOT IN');
    }
    if (!($sandbox['total'] = $query
      ->countQuery()
      ->execute()
      ->fetchField())) {
      $output = t('User profiles privacy data not found.');
      return $output;
    }

    /** @var \Drupal\Core\Entity\Display\EntityFormDisplayInterface $display */
    $display = \Drupal::entityTypeManager()
      ->getStorage('entity_form_display')
      ->load('profile.profile.default');
    foreach ($display
      ->getThirdPartySettings('field_group') as $fields_group => $settings) {
      $sandbox['fields'][$fields_group] = $settings['children'];
    }
    $sandbox['uid'] = $sandbox['processed'] = 0;
    $sandbox['limit'] = Settings::get('entity_update_batch_size', 50);
  }
  $query = \Drupal::database()
    ->select('users_data', 'ud')
    ->fields('ud', [
    'uid',
    'value',
  ])
    ->condition('uid', $sandbox['uid'], '>')
    ->condition('module', 'social_profile_privacy')
    ->condition('name', 'private_info');
  if ($sandbox['users']) {
    $query
      ->condition('uid', $sandbox['users'], 'NOT IN');
  }
  $items = $query
    ->orderBy('uid')
    ->range(0, $sandbox['limit'])
    ->execute()
    ->fetchAllKeyed();

  /** @var \Drupal\Component\Serialization\SerializationInterface $serialization */
  $serialization = \Drupal::service('serialization.phpserialize');
  $user_fields = [];
  foreach ($items as $uid => $value) {
    if ($fields_groups = $serialization
      ->decode($value)) {
      $fields = [];
      foreach ($fields_groups as $fields_group => $visible) {
        foreach ($sandbox['fields'][$fields_group] as $field) {
          $fields[$field] = $visible;
        }
      }
      $user_fields[$uid] = $serialization
        ->encode($fields);
    }
  }
  $sandbox['uid'] = $uid;
  if ($user_fields) {
    $query = \Drupal::database()
      ->insert('users_data')
      ->fields([
      'uid',
      'module',
      'name',
      'value',
      'serialized',
    ]);
    foreach ($user_fields as $uid => $fields) {
      $query
        ->values([
        $uid,
        'social_profile_privacy',
        'fields',
        $fields,
        1,
      ]);
    }
    $query
      ->execute();
  }
  $sandbox['processed'] += count($items);
  if ($sandbox['processed'] < $sandbox['total']) {
    $sandbox['#finished'] = $sandbox['processed'] / $sandbox['total'];
  }
  else {
    \Drupal::database()
      ->delete('users_data')
      ->condition('module', 'social_profile_privacy')
      ->condition('name', 'private_info')
      ->execute();
  }
  $output = t('Profile privacy data has been processed for the following users: @list', [
    '@list' => implode(', ', array_keys($items)),
  ]);
  return $output;
}