User: Improve profile form, visibility, editability, and extra fields handling - refs BT#22325

pull/6020/head
Christian Beeznest 8 months ago
parent 0311de2615
commit 61ed3ce3c5
  1. 12
      src/CoreBundle/Controller/AccountController.php
  2. 2
      src/CoreBundle/Form/ExtraFieldType.php
  3. 96
      src/CoreBundle/Form/ProfileType.php
  4. 26
      src/CoreBundle/Settings/ProfileSettingsSchema.php

@ -53,10 +53,12 @@ class AccountController extends BaseController
$form->handleRequest($request); $form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) { if ($form->isSubmitted() && $form->isValid()) {
$illustration = $form['illustration']->getData(); if ($form->has('illustration')) {
if ($illustration) { $illustration = $form['illustration']->getData();
$illustrationRepo->deleteIllustration($user); if ($illustration) {
$illustrationRepo->addIllustration($user, $user, $illustration); $illustrationRepo->deleteIllustration($user);
$illustrationRepo->addIllustration($user, $user, $illustration);
}
} }
$showTermsIfProfileCompleted = ('true' === $settingsManager->getSetting('show_terms_if_profile_completed')); $showTermsIfProfileCompleted = ('true' === $settingsManager->getSetting('show_terms_if_profile_completed'));
@ -72,7 +74,7 @@ class AccountController extends BaseController
} }
return $this->render('@ChamiloCore/Account/edit.html.twig', [ return $this->render('@ChamiloCore/Account/edit.html.twig', [
'form' => $form, 'form' => $form->createView(),
'user' => $user, 'user' => $user,
]); ]);
} }

@ -79,12 +79,14 @@ class ExtraFieldType extends AbstractType
$variable = $extraField->getVariable(); $variable = $extraField->getVariable();
$value = $data[$extraField->getVariable()] ?? null; $value = $data[$extraField->getVariable()] ?? null;
$isEditable = $extraField->isChangeable();
$defaultOptions = [ $defaultOptions = [
'label' => $text, 'label' => $text,
'required' => false, 'required' => false,
'by_reference' => false, 'by_reference' => false,
'mapped' => false, 'mapped' => false,
'data' => $value, 'data' => $value,
'attr' => $isEditable ? [] : ['readonly' => true, 'class' => 'readonly-field'],
]; ];
// @todo validate data. // @todo validate data.

@ -11,13 +11,10 @@ use Chamilo\CoreBundle\Form\Type\IllustrationType;
use Chamilo\CoreBundle\Repository\LanguageRepository; use Chamilo\CoreBundle\Repository\LanguageRepository;
use Chamilo\CoreBundle\Settings\SettingsManager; use Chamilo\CoreBundle\Settings\SettingsManager;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\LocaleType; use Symfony\Component\Form\Extension\Core\Type\LocaleType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TimezoneType; use Symfony\Component\Form\Extension\Core\Type\TimezoneType;
use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
@ -37,56 +34,61 @@ class ProfileType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options): void 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()); $languages = array_flip($this->languageRepository->getAllAvailableToArray());
$builder $fieldsMap = [
->add('firstname', TextType::class, ['label' => 'Firstname', 'required' => true]) 'name' => ['field' => 'firstname', 'type' => TextType::class, 'label' => 'Firstname'],
->add('lastname', TextType::class, ['label' => 'Lastname', 'required' => true]) 'officialcode' => ['field' => 'official_code', 'type' => TextType::class, 'label' => 'Official Code'],
->add('email', EmailType::class, ['label' => 'Email', 'required' => true]) 'email' => ['field' => 'email', 'type' => EmailType::class, 'label' => 'Email'],
// ->add('official_code', TextType::class) 'picture' => [
// ->add('groups') 'field' => 'illustration',
->add('locale', LocaleType::class, [ 'type' => IllustrationType::class,
// 'preferred_choices' => ['en', 'fr_FR', 'es_ES', 'pt', 'nl'], 'label' => 'Picture',
'mapped' => false
],
'login' => ['field' => 'login', 'type' => TextType::class, 'label' => 'Login'],
'password' => ['field' => 'password', 'type' => TextType::class, 'label' => 'Password'],
'language' => [
'field' => 'locale',
'type' => LocaleType::class,
'label' => 'Language',
'choices' => $languages, 'choices' => $languages,
'choice_loader' => null, ],
]) 'phone' => ['field' => 'phone', 'type' => TextType::class, 'label' => 'Phone Number'],
/*->add( 'dateOfBirth', 'theme' => ['field' => 'theme', 'type' => TextType::class, 'label' => 'Theme'],
BirthdayType::class, ];
[
'label' => 'form.label_date_of_birth',
'required' => false,
'widget' => 'single_text',
]
)
->add(
'biography',
TextareaType::class,
[
'label' => 'form.label_biography',
'required' => false,
]
)*/
/*->add('locale', 'locale', array(
'label' => 'form.label_locale',
'required' => false,
))*/
;
if ('true' === $this->settingsManager->getSetting('use_users_timezone')) { foreach ($fieldsMap as $key => $fieldConfig) {
$builder if (in_array($key, $visibleOptions)) {
->add('timezone', TimezoneType::class, ['label' => 'Timezone', 'required' => true]) $isEditable = in_array($key, $changeableOptions);
; $builder->add(
$fieldConfig['field'],
$fieldConfig['type'],
array_merge(
[
'label' => $fieldConfig['label'],
'required' => false,
'attr' => !$isEditable ? ['readonly' => true] : [],
],
isset($fieldConfig['choices']) ? ['choices' => $fieldConfig['choices']] : []
)
);
}
} }
$builder if ('true' === $this->settingsManager->getSetting('use_users_timezone') && in_array('timezone', $visibleOptions)) {
->add('phone', TextType::class, ['label' => 'Phone number', 'required' => false]) $builder->add(
->add( 'timezone',
'illustration', TimezoneType::class,
IllustrationType::class, [
['label' => 'Picture', 'required' => false, 'mapped' => false] 'label' => 'Timezone',
) 'required' => true,
// ->add('website', UrlType::class, ['label' => 'Website', 'required' => false]) 'attr' => !in_array('timezone', $changeableOptions) ? ['readonly' => true] : [],
; ]
);
}
$builder->add('extra_fields', ExtraFieldType::class, ['mapped' => false]); $builder->add('extra_fields', ExtraFieldType::class, ['mapped' => false]);
} }

@ -59,15 +59,21 @@ class ProfileSettingsSchema extends AbstractSettingsSchema
'career_diagram_legend' => 'false', 'career_diagram_legend' => 'false',
'career_diagram_disclaimer' => 'false', 'career_diagram_disclaimer' => 'false',
'linkedin_organization_id' => 'false', 'linkedin_organization_id' => 'false',
'visible_options' => [],
] ]
) )
->setTransformer( ->setTransformer(
'changeable_options', 'changeable_options',
new ArrayToIdentifierTransformer() new ArrayToIdentifierTransformer()
) )
->setTransformer(
'visible_options',
new ArrayToIdentifierTransformer()
)
; ;
$allowedTypes = [ $allowedTypes = [
'changeable_options' => ['array'], 'changeable_options' => ['array'],
'visible_options' => ['array'],
'account_valid_duration' => ['string'], 'account_valid_duration' => ['string'],
]; ];
$this->setMultipleAllowedTypes($allowedTypes, $builder); $this->setMultipleAllowedTypes($allowedTypes, $builder);
@ -90,9 +96,25 @@ class ProfileSettingsSchema extends AbstractSettingsSchema
'Password' => 'password', 'Password' => 'password',
'Language' => 'language', 'Language' => 'language',
'Phone' => 'phone', 'Phone' => 'phone',
// 'openid' => 'openid',
'Theme' => 'theme', 'Theme' => 'theme',
// 'apikeys' => 'apikeys', ],
]
)
->add(
'visible_options',
ChoiceType::class,
[
'multiple' => true,
'choices' => [
'Name' => 'name',
'Official code' => 'officialcode',
'E-mail' => 'email',
'Picture' => 'picture',
'Login' => 'login',
'Password' => 'password',
'Language' => 'language',
'Phone' => 'phone',
'Theme' => 'theme',
], ],
] ]
) )

Loading…
Cancel
Save