Symfony 6 — персонализируйте флажок с помощью MyCheckboxType

#symfony

#symfony

Вопрос:

Я хотел бы персонализировать флажок. Я создаю файл MyCheckboxType.php в форме/Введите с кодом :

 lt;?php  namespace AppFormType;  use SymfonyComponentFormAbstractType; use SymfonyComponentFormExtensionCoreTypeCheckboxType; use SymfonyComponentOptionsResolverOptionsResolver;  class MyCheckboxType extends AbstractType {  public function configureOptions(OptionsResolver $resolver): void  {  // Les [] equivaut à array()  $resolver-gt;setDefaults(array(  'attr' =gt; ['class' =gt; 'cPerso'],  'label_attr' =gt; ['class'=gt;'cEtiquette']  ));  }   public function getParent(): string  {  return CheckboxType::class;  } }  

Это работает для «label_attr», но не для «attr» ( Я протестировал с помощью «attr», «row_attr» и «widget_attr» … 🙂 ), класс метки изменился, но не для класса ввода :

введите описание изображения здесь

Спасибо за вашу помощь.

Спасибо вам за ваши ответы

прикрепил запрошенные части кода, которые ссылаются на флажок :

Прут :

 lt;div class="form-group"gt;  {{ form_label(my_form.rupture) }}  {{ form_widget(my_form.rupture, {'attr': {'class':'form-control'}}) }}  {{ form_errors(my_form.rupture) }} lt;/divgt;  

Контроллер :

 public function insert(Request $request, EntityManagerInterface $em): Response {  $produit = new Produit;  $formProduit = $this-gt;createForm(ProduitType::class,$produit);  // Ajout d'un groupe d'enregistrement pour cibler la contrainte de validation sur certains formulaire  // quand on ajoute un groupe de contrainte à un form il faut que toutes les contraintes appartiennent à  // un groupe et l'associer au form ici on ajoute all pour la contrainte de longueur du nom ( on l'ajoute  // également à update)  $formProduit-gt;add('creer', SubmitType::class, array('label'=gt;'Insertion d'un produit',  'validation_groups'=gt;array('registration','all')));   // Récupère les données dans l'entité  $formProduit-gt;handleRequest($request);   // Teste l'existence de la méthode Post dans l'objet Request et teste la méthode isValid() qui contrôle  // que toutes les données du formulaire vérifient les contraintes de validation.  if($request-gt;isMethod('post') amp;amp; $formProduit-gt;isValid()){    $file = $formProduit['lienImage']-gt;getData();   // Tests le type de valeur retournée, si la valeur est de type string (pas d'image ) il faut rediriger l'action de nouveauvers l'action insert()  if(!is_string($file)){  $filename = $file-gt;getClientOriginalName();   // Déplace le fichier image  $file-gt;move(  $this-gt;getParameter('images_directory'), $filename  );   $produit-gt;setLienImage($filename);   } else {   //Affiche un message d'erreur si pas d'image choisi, pour cela il faut 2 paramètres  // - une variable FlashBag : 'message' pour le message d'erreur,  // - une variable de session 'statut' met en évidence le statut de l'erreur  // dans le composant 'alert' de Bootstrap  $session = $request-gt;getSession();  $session-gt;getFlashBag()-gt;add('message', 'Vous devez choisir une image pour le produit');  $session-gt;set('statut','danger');   return $this-gt;redirect($this-gt;generateUrl('insert'));  }  // Récupère l'Entity Manager pour pouvoir insérer les données dans l'entité    //Si tout se passe bien il faut persister l'objet $produit  $em-gt;persist($produit);  // mise à jour de la base de données  $em-gt;flush();   // Affiche un message pour confirmer l'insertion d'un produit  $session=$request-gt;getSession();  $session-gt;getFlashBag()-gt;add('message','Un nouveau produit a été ajouté !');  $session-gt;set('statut','success');   return $this-gt;redirect($this-gt;generateUrl('liste'));   }   return $this-gt;render('Admin/create.html.twig',  array('my_form'=gt;$formProduit-gt;createView())); }  

Сущность :

 class ProduitType extends AbstractType {  public function buildForm(FormBuilderInterface $builder, array $options): void  {  $builder  -gt;add('nom',TextType::class,array('label' =gt; 'Nom produit :'))  -gt;add('prix',NumberType::class,array('label' =gt; 'Prix :'))  -gt;add('quantite',NumberType::class,array('label' =gt; 'Quantité :'))  -gt;add('rupture',MyCheckboxType::class,array('label' =gt; 'Rupture de stock ?','required'=gt;false))  -gt;add('lienImage',FileType::class,array('label' =gt; 'Image :','required'=gt;false, 'data_class'=gt;null,  'empty_data'=gt;'aucune image'))  -gt;add('reference',ReferenceType::class, array('label'=gt;'Référence du produit',"required"=gt;false))  // IMBRIQUER UN FORMULAIRE DANS UN FORMULAIRE  // entry_type : précise le nom du formulaire à imbrique  // allow_add : autorise l'ajout d'autant de formulaires imbriqués  // allow_delete : autorise la suppression de formulaire imbriqués  //-gt;add('distributeurs',CollectionType::class, array('entry_type'=gt;DistributeurType::class,   // 'allow_add'=gt;true,'allow_delete'=gt;true ));  -gt;add('distributeurs', EntityType::class,  array ('class' =gt; Distributeur::class,  'choice_label'=gt;'nom',  'label'=gt;'Selection des distributeurs',  'multiple'=gt;true,  'required'=gt;false,  ));  }      public function configureOptions(OptionsResolver $resolver): void  {  $resolver-gt;setDefaults([  'data_class' =gt; Produit::class,  ]);  } }  

Комментарии:

1. Вероятно, вы переопределяете атрибут класса где-то в своих файлах twig.

2. Как сказал @Hast, у вас должно быть что-то, переопределяющее ваш атрибут. Можете ли вы добавить свой файл twig и часть контроллера, в которой вы создаете форму ?

3. Как уже упоминалось, setDefaults работает только в том случае, если опция не задана другим способом, но вы передаете ее form_widget . Кроме того, вам может потребоваться слиться attr с родительским входом buildView() .