From b340fab3bb71ff146a74ab6066b11539d0d9d534 Mon Sep 17 00:00:00 2001 From: Christian Beeznest Date: Tue, 28 Jan 2025 23:12:29 -0500 Subject: [PATCH] User: Fix settings update, lang filter, profile form --- .../Controller/AccountController.php | 7 ++++ src/CoreBundle/Entity/User.php | 13 +++++++- src/CoreBundle/Form/ProfileType.php | 32 +++++++++++-------- .../Repository/LanguageRepository.php | 10 ++++-- 4 files changed, 45 insertions(+), 17 deletions(-) diff --git a/src/CoreBundle/Controller/AccountController.php b/src/CoreBundle/Controller/AccountController.php index 820fe89b8a9..d4b2c126577 100644 --- a/src/CoreBundle/Controller/AccountController.php +++ b/src/CoreBundle/Controller/AccountController.php @@ -61,6 +61,13 @@ public function edit(Request $request, UserRepository $userRepository, Illustrat } } + if ($form->has('password')) { + $password = $form['password']->getData(); + if ($password) { + $user->setPlainPassword($password); + } + } + $showTermsIfProfileCompleted = ('true' === $settingsManager->getSetting('show_terms_if_profile_completed')); $user->setProfileCompleted($showTermsIfProfileCompleted); diff --git a/src/CoreBundle/Entity/User.php b/src/CoreBundle/Entity/User.php index 1e7f06c9a6d..60d899494aa 100644 --- a/src/CoreBundle/Entity/User.php +++ b/src/CoreBundle/Entity/User.php @@ -1220,7 +1220,7 @@ public function getPlainPassword(): ?string return $this->plainPassword; } - public function setPlainPassword(string $password): self + public function setPlainPassword(?string $password): self { $this->plainPassword = $password; // forces the object to look "dirty" to Doctrine. Avoids @@ -2210,6 +2210,17 @@ public function setSurveyInvitations(Collection $surveyInvitations): self return $this; } + public function getLogin(): string + { + return $this->username; + } + + public function setLogin(string $login): self + { + $this->username = $login; + return $this; + } + /** * @return Collection */ diff --git a/src/CoreBundle/Form/ProfileType.php b/src/CoreBundle/Form/ProfileType.php index 9af8669dba4..8d02affe336 100644 --- a/src/CoreBundle/Form/ProfileType.php +++ b/src/CoreBundle/Form/ProfileType.php @@ -11,8 +11,9 @@ use Chamilo\CoreBundle\Repository\LanguageRepository; use Chamilo\CoreBundle\Settings\SettingsManager; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\EmailType; -use Symfony\Component\Form\Extension\Core\Type\LocaleType; +use Symfony\Component\Form\Extension\Core\Type\PasswordType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TimezoneType; use Symfony\Component\Form\FormBuilderInterface; @@ -23,20 +24,16 @@ */ class ProfileType extends AbstractType { - private LanguageRepository $languageRepository; - public function __construct( - LanguageRepository $languageRepository, - private readonly SettingsManager $settingsManager - ) { - $this->languageRepository = $languageRepository; - } + private readonly LanguageRepository $languageRepository, + private readonly SettingsManager $settingsManager, + ) {} public function buildForm(FormBuilderInterface $builder, array $options): void { - $changeableOptions = $this->settingsManager->getSetting('profile.changeable_options') ?? []; - $visibleOptions = $this->settingsManager->getSetting('profile.visible_options') ?? []; - $languages = array_flip($this->languageRepository->getAllAvailableToArray()); + $changeableOptions = $this->settingsManager->getSetting('profile.changeable_options', true) ?? []; + $visibleOptions = $this->settingsManager->getSetting('profile.visible_options', true) ?? []; + $languages = array_flip($this->languageRepository->getAllAvailableToArray(true)); $fieldsMap = [ 'name' => ['field' => 'firstname', 'type' => TextType::class, 'label' => 'Firstname'], @@ -49,10 +46,16 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'mapped' => false, ], 'login' => ['field' => 'login', 'type' => TextType::class, 'label' => 'Login'], - 'password' => ['field' => 'password', 'type' => TextType::class, 'label' => 'Password'], + 'password' => [ + 'field' => 'password', + 'type' => PasswordType::class, + 'label' => 'Password', + 'mapped' => false, + 'required' => false, + ], 'language' => [ 'field' => 'locale', - 'type' => LocaleType::class, + 'type' => ChoiceType::class, 'label' => 'Language', 'choices' => $languages, ], @@ -69,7 +72,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void array_merge( [ 'label' => $fieldConfig['label'], - 'required' => false, + 'required' => $fieldConfig['required'] ?? false, + 'mapped' => $fieldConfig['mapped'] ?? true, 'attr' => !$isEditable ? ['readonly' => true] : [], ], isset($fieldConfig['choices']) ? ['choices' => $fieldConfig['choices']] : [] diff --git a/src/CoreBundle/Repository/LanguageRepository.php b/src/CoreBundle/Repository/LanguageRepository.php index 3850ef48b3a..17d223d90ca 100644 --- a/src/CoreBundle/Repository/LanguageRepository.php +++ b/src/CoreBundle/Repository/LanguageRepository.php @@ -44,9 +44,15 @@ public function getAllAvailable($excludeDefaultLocale = false): QueryBuilder return $qb; } - public function getAllAvailableToArray(): array + public function getAllAvailableToArray(bool $onlyActive = false): array { - $languages = $this->getAllAvailable()->getQuery()->getResult(); + $queryBuilder = $this->getAllAvailable(); + + if (!$onlyActive) { + $queryBuilder->resetDQLPart('where'); + } + + $languages = $queryBuilder->getQuery()->getResult(); $list = [];