как заблокировать поля формбилдера в symfony 3.4 - PullRequest
0 голосов
/ 17 сентября 2018

Кстати, я хотел бы изменить поля администратора, начиная с того факта, что администратор является пользователем.

Но я хочу, чтобы администратор изменял только определенные поля, а не все поля, которые может иметь пользователь. Я хочу, чтобы админ изменил только свое имя пользователя, пароль и номер телефона.

Но при отображении появляются все поля, даже те, которые не нужны. Вот мой formbuilder:

<?php

namespace Doctix\AdminBundle\Form;


use Doctix\UserBundle\Form\UserType;
use Doctix\UserBundle\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TelType;
   class AdminType extends AbstractType
  {
   /**
   * @param FormBuilderInterface $builder
   * @param array $options
   */
   public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $builder->add('user', UserType::class);

  }

   /**
   * @param OptionsResolver $resolver
   */
    public function configureOptions(OptionsResolver $resolver)
   {
      $resolver->setDefaults(array(
         'data_class' => 'Doctix\AdminBundle\Entity\Admin'
       ));
   }
      } 

И мой взгляд:

   <div class="box_general padding_bottom">

               {{ form_start(form,{'attr': {'id': 'form1'}}) }}


               {% if form.user.username is defined %}
                    <div class="form-group">
                        <label for="inputEmail" class="col-md-2 control-label">Email</label>
                        <div class="col-md-10">
                            {{ form_widget(form.user.username, {'attr': {'class': 'form-control','placeholder':'Email'}}) }}
                        </div>
                    </div>
                    {% endif %}
                    {% if form.user.password is defined %}
                    <div class="form-group">
                        <label for="inputPassword" class="col-md-5 control-label">Mot de passe</label>
                        <div class="col-md-10">
                            {{ form_widget(form.user.password, {'attr': {'class': 'form-control','placeholder':'Password'}}) }}
                        </div>
                    </div>
                    {% endif %}
                   {% if form.user.numTel is defined %}
                    <div class="form-group">
                        <label for="inputPassword" class="col-md-5 control-label">N° Téléphone</label>
                        <div class="col-md-10">
                            {{ form_widget(form.user.numTel, {'attr': {'class': 'form-control','placeholder':'N° Téléphone'}}) }}
                        </div>
                    </div>
                    {% endif %}

                          {{ form_end(form) }}
                </div>


                 <div class="panel-footer">
                    <div class="row">
                        <div class="col-md-offset-3 col-md-3">
                            <button class="btn btn-success btn-lg" form="form1"> Valider</button>
                        </div>
                        <div class="col-md-3">
                            <a  href="{{ path('doctix_admin_users_parametre') }}" class=" btn btn-danger btn-lg">Annuler </a>
                        </div>
                    </div>
                </div>

А вот изображение моего дисплея: визуализация моей страницы

На картинке я хочу только первые 3 строки, а не следующие внизу. И что изменение при нажатии кнопки «Подтвердить» вступает в силу.

Наконец-то мой контроллер:

 public function editprofilAction(Request $request){
       $user = $this->getUser();
    if($user===null){
        throw new NotFoundHttpException('Utilisateur Inexistant');
    }

    else {
        $em = $this->getDoctrine()->getManager();
        $repo = $em->getRepository('DoctixAdminBundle:Admin');
        $admin = $repo->findOneBy(array(
            'user' => $user,
        ));
        $form = $this->createForm('Doctix\AdminBundle\Form\AdminType', $admin);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {

            $admin->getUser()->setSalt('');
            $factory = $this->get('security.encoder_factory');
            $encoder = $factory->getEncoder($admin->getUser());
            $password_encoder = $encoder->encodePassword($admin->getUser()->getPassword(), $admin->getUser()->getSalt());
            $admin->getUser()->setPassword($password_encoder);
            $admin->getUser()->setRoles(array('ROLE_ADMIN'));
            $em->flush();
            // creation d'un flash bag pour une notification flash
            $request->getSession()->getFlashBag()->add('Notice', 'Profil Modifié avec succés');
            // redirection
            $url = $this->generateUrl('doctix_admin_users_parametre');
            // redirection permanente avec le status http 301 ::)))))
            return $this->redirect($url,301);

        }else{
            return $this->render('DoctixAdminBundle:User:editprofil.html.twig', array(
                'form' => $form->createView()
            ));
        }


    }

 }

Большое спасибо.

1 Ответ

0 голосов
/ 17 сентября 2018

По умолчанию функция Twig form_end() отображает все оставшиеся поля при вызове. Вы также можете избежать этой опции render_rest, например false

{{ form_end(form, {'render_rest': false}) }}

Однако, если UserType::class определяет некоторые ограничения для других полей, которые не отображаются, проверка формы может завершиться неудачно при вызове $form->isValid(). В этом случае вы должны рассмотреть ручную проверку в вашем контроллере.

Если вы сохраняете текущую реализацию Twig, вам также нужно явно загрузить токен CSRF (активный по умолчанию для каждой формы), вызвав {{ form_widget(form._token) }} в вашем шаблоне.

...