我創建了一個表單以允許用戶注冊。然后,我使用相同的表單來允許用戶編輯他的資訊。我在 login.html.twig 上創建了他的個人資料頁面,我希望允許他訪問一個按鈕,以便當他點擊它時,我可以上傳他的圖片,而無需點擊提交按鈕,他的圖片將被發送到資料。
該檔案未存盤,其名稱未發送到我的資料庫,并以此錯誤結束也顯示在用戶可以編輯所有其他資訊的頁面上,并且將密碼輸入保持為空沒有問題。
怎樣才能讓它發揮作用?
如果您能幫助我找到解決方案,我將不勝感激。
login.html.twig
{% block body %}
{% if app.user %}
{{ form_start(form, {'attr' : {'class' : 'position-absolute top-50 start-50 translate-middle'}} ) }}
{{ form_widget(form.photo, {'attr' : {'onChange' : 'this.form.submit();'}} ) }}
{{ form_widget(form.gender, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.lastname, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.firstname, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.birthdate, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.occupation, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.nationality, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.nativelanguage, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.email, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.password.first, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.password.second, {'attr' : {'class' : 'd-none'}}) }}
{{ form_widget(form.save, {'attr' : {'class' : 'd-none'}}) }}
{{ form_end(form) }}
{% endif %}
{% endblock %}
用戶控制器.php
<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\UserType;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class UserController extends AbstractController
{
#[Route('/', name: 'app_user_index', methods: ['GET'])]
public function index(UserRepository $userRepository): Response
{
return $this->render('user/index.html.twig', [
'users' => $userRepository->findAll(),
]);
}
#[Route('/register', name: 'register', methods: ['GET', 'POST'])]
public function createUser(
Request $request,
EntityManagerInterface $entityManagerInterface,
UserPasswordHasherInterface $userPasswordHasherInterface
){
$user = new User();
$userform = $this->createForm(UserType::class, $user);
$userform->handleRequest($request);
if ($userform->isSubmitted() && $userform->isValid()) {
$user->setRoles(["ROLE_USER"]);
$plainPassword = $userform->get('password')->getData();
$hashedPassword = $userPasswordHasherInterface->hashPassword($user, $plainPassword);
$user->setPassword($hashedPassword);
$entityManagerInterface->persist($user);
$entityManagerInterface->flush();
return $this->redirectToRoute('home');
}
return $this->render('front/register.html.twig', [
'userform' => $userform->createView()
]);
}
#[Route('/user/{id}', name: 'app_user_show', methods: ['GET'])]
public function show(User $user): Response
{
return $this->render('user/show.html.twig', [
'user' => $user,
]);
}
#[Route('/profile', name: 'profile')]
public function addPhoto(
Request $request,
UserRepository $userRepository,
SluggerInterface $sluggerInterface,
EntityManagerInterface $entityManagerInterface
){
$connected = $this->getUser();
$useremail = $connected->getUserIdentifier();
$user = $userRepository->findOneBy(['email' => $useremail]);
$userform = $this->createForm(UserType::class, $user);
$userform->handleRequest($request);
if ($userform->isSubmitted() && $userform->isValid()) {
$imagefile = $userform->get('photo')->getData();
if ($imagefile){
$originalFileName = pathinfo($imagefile->getClientOriginalName(), PATHINFO_FILENAME);
$safeFileName = $sluggerInterface->slug($originalFileName);
$newFileName = $safeFileName . '-' . uniqid() . '.' . $imagefile->guessExtension();
$imagefile->move(
$this->getParameter('images_directory'),
$newFileName
);
$user->setPhoto($newFileName);
}
$entityManagerInterface->persist($user);
$entityManagerInterface->flush();
return $this->redirectToRoute('login');
}
return $this->renderForm('security/login.html.twig', [
'user' => $user,
'form' => $userform,
]);
}
#[Route('/update', name: 'update')]
public function updateUser(
Request $request,
UserRepository $userRepository,
EntityManagerInterface $entityManagerInterface,
UserPasswordHasherInterface $userPasswordHasherInterface
){
$connected = $this->getUser();
$useremail = $connected->getUserIdentifier();
$user = $userRepository->findOneBy(['email' => $useremail]);
$userform = $this->createForm(UserType::class, $user);
$userform->handleRequest($request);
if ($userform->isSubmitted() && $userform->isValid()) {
$plainPassword = $userform->get('password')->getData();
$hashedPassword = $userPasswordHasherInterface->hashPassword($user, $plainPassword);
$user->setPassword($hashedPassword);
$entityManagerInterface->persist($user);
$entityManagerInterface->flush();
return $this->redirectToRoute('home');
}
return $this->renderForm('front/edituser.html.twig', [
'user' => $user,
'form' => $userform,
]);
}
#[Route('/delete', name: 'delete')]
public function deleteUser(
UserRepository $userRepository,
EntityManagerInterface $entityManagerInterface
){
$connected = $this->getUser();
$useremail = $connected->getUserIdentifier();
$user = $userRepository->findOneBy(['email' => $useremail]);
$entityManagerInterface->remove($user);
$entityManagerInterface->flush();
return $this->redirectToRoute('home');
}
}
用戶型別.php
<?php
namespace App\Form;
use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\CountryType;
use Symfony\Component\Form\Extension\Core\Type\BirthdayType;
use Symfony\Component\Form\Extension\Core\Type\LanguageType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('gender', ChoiceType::class, [
'choices' => [
'Je suis ...' => '',
'un homme' => 'male',
'une femme' =>'female',
'non-binaire' => 'non-binary'
]
])
->add('lastname')
->add('firstname')
->add('birthdate', BirthdayType::class, [
'placeholder' => [
'year' => 'Année', 'month' => 'Mois', 'day' => 'Jour',
],
'choice_translation_domain' => true
])
->add('occupation')
->add('nationality', CountryType::class, [
'placeholder' => 'Je choisis un pays',
])
->add('nativelanguage', LanguageType::class, [
'placeholder' => 'Je choisis ta langue maternelle',
])
->add('email')
->add('password', PasswordType::class, [
'mapped' => false,
'empty_data' => ''
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'Les deux mots de passe doivent être identiques.',
'options' => ['attr' => ['class' => 'password-field']],
'required' => true,
'first_options' => ['label' => 'Password'],
'second_options' => ['label' => 'Repeat Password'],
'empty_data' => ''
])
->add('photo', FileType::class, [
'mapped' => false,
])
->add('save', SubmitType::class, [
'attr' => ['class' => 'save'],
])
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => User::class,
'translation_domain' => 'forms'
]);
}
}
uj5u.com熱心網友回復:
在使用 symfony 多年之后——我也會(就像@Cerad 已經做過的那樣)建議你為不同的場景創建多個表單類。*Type.php
在您的src/Form
目錄中有幾十個沒有錯。
- 創建一個僅
UserRegisterationType
用于注冊。 - 創建一個
UserDataEditType
以更新用戶資料(例如,從某種/admin
所有欄位都可編輯的地方。或者可能是一些其他欄位,例如用于向該用戶重新發送激活電子郵件的復選框。) - 創建一個
UserProfileEditType
讓用戶僅更新一些資料(如果它是組態檔)。
我想你應該已經明白了。
關于用戶的個人資料頁面。(我知道這有點不對勁——但只是為了證明我的觀點)
我個人的經驗法則 - 為“更改密碼”或/和“更改電子郵件”或/和“洗掉帳戶/個人資料”等“特殊情況”創建許多“小”表格。使用這種方法,您可以更精確地對特定操作做出反應。擁有一個大表單并不方便(而且更容易出錯),用戶可以在其中更改密碼和更改電子郵件,然后只單擊一個提交按鈕,以便將其全部保存。
在UserProfileController.php
/**
* PSEUDO_CODE. UNTESTED.
*
*
* @param Request $reuqest
* @return Response
*/
public function editProfile(Request $reuqest): Response
{
// some mandatory stuff for user-profile page...
$user = $this->getUser();
$this->denyAccessUnlessGranted('ROLE_USER');
$changePwdForm = $this->createForm(UserProfileChangePasswordType::class, $user);
$changeEmailForm = $this->createForm(UserProfileChangeEmailType::class, $user);
$deleteAccountForm = $this->createForm(UserProfileDeleteAccountType::class, $user);
if ($reuqest->isMethod(Request::METHOD_POST)) {
$changePwdForm->handleRequest($reuqest);
if ($changePwdForm->isSubmitted() && $changePwdForm->isValid()) {
// apply your user-changed-pwd logic, save, add flash-message and redirect (e.g. to profile-edit page)
// maybe you want to force user to re-login with new pwd after this... or log out user on all _other_ devices...
}
$changeEmailForm->handleRequest($reuqest);
if ($changeEmailForm->isSubmitted() && $changeEmailForm->isValid()) {
// same here.. apply your logic, save, maybe send confirmation-email to new address and so on...
// redirect.
}
$deleteAccountForm->handleRequest($reuqest);
if ($deleteAccountForm->isSubmitted() && $deleteAccountForm->isValid()) {
// double-check if user sure about this and, maybe, perform some additional checks...
// save, logout and redirect to homepage..
}
}
return $this->render('user_profile/edit_profile.html.twig', [
'changePasswordForm' => $changePwdForm->createView(),
'changeEmailForm' => $changeEmailForm->createView(),
'deleteAccountForm' => $deleteAccountForm->createView(),
]);
}
user_profile/edit_profile.html.twig
模板中的某處
{% if changePasswordForm is defined and changePasswordForm|default %}
{{ form_start(changePasswordForm) }}
<fieldset>
<legend>
Change Password ...
</legend>
{{ form_rest(changePasswordForm) }}
</fieldset>
{{ form_end(changePasswordForm) }}
{% endif %}
{% if changeEmailForm is defined and changeEmailForm|default %}
{{ form_start(changeEmailForm) }}
<fieldset>
<legend>
Change E-mail ...
</legend>
{{ form_rest(changeEmailForm) }}
</fieldset>
{{ form_end(changeEmailForm) }}
{% endif %}
{% if deleteAccountForm is defined and deleteAccountForm|default %}
{{ form_start(deleteAccountForm) }}
<fieldset>
<legend>
Delete your account ...
</legend>
{{ form_rest(deleteAccountForm) }}
</fieldset>
{{ form_end(deleteAccountForm) }}
{% endif %}
uj5u.com熱心網友回復:
我使用 {{form_end(form, {'render_rest': false}) }} 而不是 {{form_end(form)}},如Symfony Twig 檔案中所述。
它運作良好。:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/507146.html
下一篇:如何按屬性對嵌套物件進行排序?