#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()
.