farm-2.x-dev/modules/core/l10n/src/Form/L10nSettingsForm.php
modules/core/l10n/src/Form/L10nSettingsForm.php
<?php
namespace Drupal\farm_l10n\Form;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\language\Form\NegotiationSelectedForm;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Configure the selected language negotiation method for this site.
*
* @phpstan-ignore-next-line
*/
class L10nSettingsForm extends NegotiationSelectedForm {
/**
* The entity type manager service.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* Constructor for L10nSettingsForm.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The factory for configuration objects.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager service.
*/
public function __construct(ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($config_factory);
$this->entityTypeManager = $entity_type_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('config.factory'),
$container->get('entity_type.manager'),
);
}
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'farm_l10n_settings_form';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$form = parent::buildForm($form, $form_state);
// Provide an option to update the default language of existing users.
$form['update_existing_users'] = [
'#type' => 'checkbox',
'#title' => $this->t('Update existing users'),
'#description' => $this->t('Update the language of all existing users to match the default language.'),
'#default_value' => FALSE,
];
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
// Initiate a batch operation to update the default language of all users
// (except user 1).
if ($form_state->getValue('update_existing_users')) {
$operations = [];
$query = $this->entityTypeManager->getStorage('user')->getQuery()->accessCheck(FALSE);
$uids = $query->condition('uid', '1', '!=')->execute();
foreach ($uids as $uid) {
$operations[] = [
[__CLASS__, 'updateUserLanguage'],
[$uid, $form_state->getValue('selected_langcode')],
];
}
batch_set([
'operations' => $operations,
'title' => $this->t('Updating user languages'),
'error_message' => $this->t('The user language update has encountered an error.'),
]);
}
}
/**
* Update the language for a user.
*
* @param int $uid
* The user ID.
* @param string $langcode
* The new langcode to assign.
*/
public static function updateUserLanguage(int $uid, string $langcode) {
/** @var \Drupal\user\UserInterface $user */
$user = \Drupal::entityTypeManager()->getStorage('user')->load($uid);
$user->set('preferred_langcode', $langcode);
$user->set('preferred_admin_langcode', $langcode);
$user->save();
}
}
