function social_profile_privacy_update_8001 in Open Social 10.2.x
Same name and namespace in other branches
- 10.3.x modules/social_features/social_profile/modules/social_profile_privacy/social_profile_privacy.install \social_profile_privacy_update_8001()
- 10.0.x modules/social_features/social_profile/modules/social_profile_privacy/social_profile_privacy.install \social_profile_privacy_update_8001()
- 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;
}