Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1174 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7  8  9  10  11  12
Auteur Sujet :

Symfony : questions

n°2055447
smaragdus
whores, drugs & J.S. Bach
Posté le 09-02-2011 à 15:14:57  profilanswer
 

Reprise du message précédent :
Bon les gars, faut qu'on parle sérieusement :
 
Vous utilisez quoi comme outil de SVN avec symfony et qui soit STABLE ?
 
Notre infrastructure :
- un serveur SVN sous ubuntu
- les checkout se font sur un disque partagé en samba sous un autre ubuntu
- on utilise Tortoise sous Windows en client
 
Bilan : régulièrement (1 fois par semaine sur les 4 dev), les check-out sont bloqués avec des messages d'erreurs abscons, voire le dépot est corrompu et on peut plus commiter quoi que soit.
 
Ca intervient souvent quand on regenère des modules ou ce genre de truc. Je milite pour utilisation du CLI sous linux mais je suis le 1er à admettre que c'est lourdingue.

Message cité 1 fois
Message édité par smaragdus le 09-02-2011 à 15:16:26
mood
Publicité
Posté le 09-02-2011 à 15:14:57  profilanswer
 

n°2055507
theredled
● REC
Posté le 09-02-2011 à 16:02:40  profilanswer
 

Sous mac je reste en CLI... Relou pour les svn add et les analyses de logs mais c'est supportable je trouve.


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°2077076
smaragdus
whores, drugs & J.S. Bach
Posté le 19-05-2011 à 12:51:50  profilanswer
 

Salut,
 
Aujourd'hui, je viens vous emmerder avec un problème de routing  :wahoo:  
 
En fait c'est en codant intensivement des tests functionnels (note : à propos c'est ultime) que j'en suis arrivé à me poser quelques questions fondamentales sur le routing. Il faut dire que je n'ai jamais abordé sérieusement cette partie de symfony et que j'ai toujours fait des modifs mineures sans m'interoger sur le fonctionnement interne. En fait tout a commencé par  
 

Code :
  1. public function getAndCheck($module, $action, $url = null, $code = 200)
  2.   {
  3.     return $this->
  4.       get(null !== $url ? $url : sprintf('/%s/%s', $module, $action))->
  5.       with('request')->begin()->
  6.         isParameter('module', $module)->
  7.         isParameter('action', $action)->
  8.       end()->
  9.       with('response')->isStatusCode($code)
  10.     ;
  11.   }


 
Et là je me dis : "Mais que diantre, si j'ai un prefix d'url différent pour ce module, ça plante !"
 
Un exemple que j'ai (en propel) :
model : MpDateSejour
nom de table: mp_date_sejour
nom de la route : mp_date_sejour  (accessible avec le @ dans url_for, si j'ai bien compris)
nom du module : dateSejour (le nom du répertoire sur le disque)
nom du préfixe url de la route : date-sejour
 
Et non ça plantait pas. Parce que routing.yml finit par

Code :
  1. default:
  2.   url:   /:module/:action/*


 
Non ? (enfin j'ai la confirmation en CLI mais je préfère être 100% sûr)
 
De là ma question :  
 
Peut-on, ou même, faut-il jarter ce comportement par défaut du routing, pour des raisons de sécurité par exemple ou pour deceler plus facilement des bugs aussi ?  
 
Ou bien est-ce que beaucoup de composants symfony comme sfTestFunctionalBase citée plus haut assume ce comportement par défaut ?
 

n°2078838
syr01
Hystérie connective
Posté le 28-05-2011 à 05:22:14  profilanswer
 
n°2083735
the_bigboo
Posté le 21-06-2011 à 22:27:12  profilanswer
 

smaragdus a écrit :

Bon les gars, faut qu'on parle sérieusement :
 
Vous utilisez quoi comme outil de SVN avec symfony et qui soit STABLE ?
 
Notre infrastructure :
- un serveur SVN sous ubuntu
- les checkout se font sur un disque partagé en samba sous un autre ubuntu
- on utilise Tortoise sous Windows en client
 
Bilan : régulièrement (1 fois par semaine sur les 4 dev), les check-out sont bloqués avec des messages d'erreurs abscons, voire le dépot est corrompu et on peut plus commiter quoi que soit.
 
Ca intervient souvent quand on regenère des modules ou ce genre de truc. Je milite pour utilisation du CLI sous linux mais je suis le 1er à admettre que c'est lourdingue.


Dans ma boite on a la même infrastructure, et on est nous aussi avec tortoise et on n'a jamais aucun souci :spamafote:

n°2084280
Tirkyth
Posté le 23-06-2011 à 15:48:32  profilanswer
 

smaragdus a écrit :

De là ma question :  
 
Peut-on, ou même, faut-il jarter ce comportement par défaut du routing, pour des raisons de sécurité par exemple ou pour deceler plus facilement des bugs aussi ?  
 
Ou bien est-ce que beaucoup de composants symfony comme sfTestFunctionalBase citée plus haut assume ce comportement par défaut ?
 


Je ne sais pas sur quelle version tu travailles, ni même si tu as encore le problème car il y a eu pas mal de temps depuis ton post, mais voici quelques informations.
En Symfony 1.4, quand tu installes un projet, le fichier de routing contient par défaut :

Code :
  1. # generic rules
  2. # please, remove them by adding more specific rules
  3. default_index:
  4.  url:   /:module
  5.  param: { action: index }
  6. default:
  7.  url:   /:module/:action/*


Donc pour répondre à ta question, je te conseille très fortement de supprimer ces règles par défaut et de ne te servir que de tes propres règles, comme c'est indiqué à la ligne n° 2
Ensuite, depuis symfony 1.2 il me semble, tu ne devrais plus utiliser la syntaxe avec le '@' pour le routing.
Les helpers url_for et associé sont capable de le comprendre, mais seulement pour assûrer une certaine rétro-compatibilité. Le mieux si tu es sur une version supérieure ou égale à 1.2, c'est de ne plus utiliser le '@'.
 
Pour terminer, aucun composant de symfony n'assume comme tu dis ce "comportement par défaut".
 
La seule chose à savoir c'est que lorsqu'une requête entre, le système de routing cherche à matcher l'url demandée par rapport aux règles que tu as définis.
Si tu as défini une route /toto paramétrée pour atteindre l'action index du module test, alors si tu laisses les routes par défaut, tu peux accéder à la même action via /test/index et /test.


---------------
Mon Feedback !
n°2084959
smaragdus
whores, drugs & J.S. Bach
Posté le 26-06-2011 à 11:45:06  profilanswer
 

Tirkyth a écrit :


Donc pour répondre à ta question, je te conseille très fortement de supprimer ces règles par défaut et de ne te servir que de tes propres règles, comme c'est indiqué à la ligne n° 2


 
Ok faut que je change de lunettes :D
 
En effet ma question était toujours ouverte. (Le projet est en symfony 1.2).
Ok donc pour la suppression des règles par défaut.  
 
En fait ces 2 dernieres semaines j'ai du coder un webservice en symfony 1.4 (pour un autre projet) et je ne devais pas laisser les règles par défaut (par exemple tous les appels étaient en POST), je les ai justement supprimées. J'ai même sous-classé ma propre route pour checker certaines règles répétitives sur les paramètres. C'est vraiment puissant. Je me rends compte que y a toute une mécanique qu'on peut déporter de l'action vers la route. Ca et les sfFilter pour la sécurité, y avait quasiment plus rien dans mes actions executeXXXX  :)  
 

Citation :

Ensuite, depuis symfony 1.2 il me semble, tu ne devrais plus utiliser la syntaxe avec le '@' pour le routing.
Les helpers url_for et associé sont capable de le comprendre, mais seulement pour assûrer une certaine rétro-compatibilité. Le mieux si tu es sur une version supérieure ou égale à 1.2, c'est de ne plus utiliser le '@'.


 
Ok ça je savais pas. C'est noté  :jap:  
 
C'est toujours bon de pêcher des recommandations à la source, merci :jap:


Message édité par smaragdus le 26-06-2011 à 11:49:03
n°2087921
the_bigboo
Posté le 07-07-2011 à 15:23:27  profilanswer
 

Salut :)
 
Je me suis mis il y a pas longtemps à découvrir comment fonctionnait Symfony 2, et après avoir lu la doc, il y a quelque chose qui m'échappe...
 
En fait je trouve ça très sympa comme modèle MVC :)
Cependant, dans tous les exemples présentés, à chaque fois la class des Bundle est presque tout le temps vide...
 
Or ce que je pensais au départ, c'est que le bundle était destiné à stocker toutes les fonctionnalités de ce bundle (Exploiter les différents repository, etc...), mais dans les faits, toute l'intelligence de l'application est faite directement le contrôleur...
 
Voici donc ma question : Le Bundle doit-il nécessairement rester vide (et donc il faut passer par des déclarations de services indépendants), ou peut-on justement l'utiliser pour centraliser les fonctions et dans ce cas je ne vois pas le bout de code à utiliser depuis un contrôleur pour récupérer l'instance d'un Bundle...
 
Par avance merci de vos lumières :)

n°2088760
Tirkyth
Posté le 11-07-2011 à 18:08:41  profilanswer
 

En gros, attention à ne pas confondre le principe du Bundle et la classe de ton Bundle. Ton Bundle dans le sens global contient une ou plusieurs fonctionnalités en effet. Par contre, ce n'est pas la classe Bundle présente à la racine de ton bundle qui doit contenir ces fonctionnalités.

 

Elle, elle est présente pour faire interagir ton bundle avec l'injecteur de dépendances. Elle n'est donc pas nécessairement vide, mais elle ne contient pas d'intelligence. Elle sert juste à pouvoir donner à l'injecteur de dépendance des instructions par rapport aux services de ton bundle.

 

L'intelligence de ton appli elle, est contenue dans les contrôleurs, le modèle, les services, et n'importes quels objets contenus dans un sous répertoire de ton bundle. Tu n'es évidemment pas limité aux répertoires "Entity", "Form", etc. Si ça te chante tu créé un sous répertoire Toto avec un objet qui fait une tâche X comme parser un fichier etc.

 

En résumé :
Dans la classe de base de ton Bundle, tu ne mets du code que lié à l'injecteur de dépendance. (Ne t'inquiète pas si tu n'as pas de code dans cette classe, c'est tout à fait normal).
Dans tes contrôleurs, tu mets le code qui gère les interactions des utilisateurs. Par exemple, affichage/soumission d'un formulaire pour créer/modifier une entité X.
Si tu as des tâches un peu plus globales, tu fais des services. C'est à partir du moment où tu fais des services que tu vas commencer à mettre du code dans ta "classe Bundle", en particulier si ces bundles sont destinés à être distribués.

 

Si je ne suis pas assez clair ou si tu as d'autres questions, fais le moi savoir.


Message édité par Tirkyth le 12-07-2011 à 15:25:47

---------------
Mon Feedback !
n°2091935
Tirkyth
Posté le 28-07-2011 à 13:38:11  profilanswer
 

Un petit post pour vous signaler la sortie en version stable de Symfony2 :)
 
http://symfony.com/blog/symfony-2-0


---------------
Mon Feedback !
mood
Publicité
Posté le 28-07-2011 à 13:38:11  profilanswer
 

n°2091957
flo850
moi je
Posté le 28-07-2011 à 14:50:56  profilanswer
 

:love:


Message édité par flo850 le 28-07-2011 à 14:51:01

---------------

n°2092506
the_bigboo
Posté le 01-08-2011 à 10:19:27  profilanswer
 

Merci Tirkyth pour ton retour :)

Tirkyth a écrit :

Un petit post pour vous signaler la sortie en version stable de Symfony2 :)
 
http://symfony.com/blog/symfony-2-0


J'ai vu ça :) , je pense que ce serait bien qu'il y ait au moins un topic (si ce n'est un forum) pour Symfony 2...

n°2092513
Tirkyth
Posté le 01-08-2011 à 10:52:52  profilanswer
 

Dans ce cas, si les autres participants de ce topic peuvent donner leur avis sur le fait de faire ou non un topic dédié à Symfony2.
 
Si tout le monde pense que ça peut être utile, peut-être que j'en commencerai un. Ou si quelqu'un d'autre s'en charge, je l'aiderai à rédiger un premier post assez clair et précis sur les features importantes du framework.


---------------
Mon Feedback !
n°2092533
flo850
moi je
Posté le 01-08-2011 à 11:28:30  profilanswer
 

Peut être que le plus simple serait de reprendre ce topic, non ? 


---------------

n°2092588
the_bigboo
Posté le 01-08-2011 à 13:36:22  profilanswer
 

Ben tu as des gens qui utilisent la version 1.4, et ceux qui souhaitent utiliser la 2. A partir de là les questions seront différentes, je pense que ça risque d'être assez difficile à suivre si on a pas un topic séparé.

 

Pour ma part, je découvre cette version 2, et la doc n'étant pas encore assez exhaustive, j'ai pas mal de questions, et les forums dédiés à cette nouvelle mouture de Symfony ne sont pas légions...


Message édité par the_bigboo le 01-08-2011 à 13:36:32
n°2092592
flo850
moi je
Posté le 01-08-2011 à 13:54:16  profilanswer
 

Il suffit de le préciser quand on pose une question
 
il n ' y a pas tant d'activité que ça non plus.


---------------

n°2092598
Tirkyth
Posté le 01-08-2011 à 14:04:42  profilanswer
 

En effet l'activité n'est pas énorme sur ce topic, je pense que mêler les deux versions dans un seul topic ne gène pas la lisibilité tant qu'on pense à bien préciser la version utilisée dans les questions.


---------------
Mon Feedback !
n°2092638
the_bigboo
Posté le 01-08-2011 à 15:52:39  profilanswer
 

Très bien dans ce cas, je me lance. Et j'ai une petite question justement :)

 

J'ai souhaité créer un formulaire basé sur l'objet FormBuilder de Symfony 2. Jusque là pas de soucis. Ca s'est compliqué au moment ou j'ai voulu modéliser dans le formulaire un relation de type ManyToMany.

 

De ce que j'ai lu sur la doc, il faut utiliser un FieldType de type CollectionType

 

http://api.symfony.com/2.0/Symfony [...] nType.html

 

Le problème c'est que le rendu donne un truc du genre :

Code :
  1. <div id="nom_du_champ" data-prototype="[ contenu htmlentitisé ]"></div>


Et je ne sais pas trop comment l'exploiter si ce n'est en JS...
Edit : En fait il s'agit de l'une des nouveautés de HTML5 la gestion de ces nouveaux attributs de balises

 

Ensuite, j'ai également lu que l'on pouvait mettre les labels souhaités pour chaque entrée du formulaire (Via la méthode configure de la class qui étends Symfony\Component\Form\AbstractType)
Edit : JE veux dire qu'on passe un tableau d'option du type :

Code :
  1. array('label' => 'Mon label')
 

Seul souci, cette méthode ne prends en paramètre qu'une instance de Symfony\Component\Form\FormBuilder. Et il est impossible d'avoir depuis cette méthode un accès au service de traduction.

 

D’où ma seconde question comment faire, car je ne veux pas déclarer mon formulaire depuis le contrôleur...

 

Merci de votre aide ;)

Message cité 1 fois
Message édité par the_bigboo le 01-08-2011 à 15:57:41
n°2092650
Tirkyth
Posté le 01-08-2011 à 16:12:24  profilanswer
 

the_bigboo a écrit :

Très bien dans ce cas, je me lance. Et j'ai une petite question justement :)
 
J'ai souhaité créer un formulaire basé sur l'objet FormBuilder de Symfony 2. Jusque là pas de soucis. Ca s'est compliqué au moment ou j'ai voulu modéliser dans le formulaire un relation de type ManyToMany.
 
De ce que j'ai lu sur la doc, il faut utiliser un FieldType de type CollectionType
 
http://api.symfony.com/2.0/Symfony [...] nType.html
 
Le problème c'est que le rendu donne un truc du genre :

Code :
  1. <div id="nom_du_champ" data-prototype="[ contenu htmlentitisé ]"></div>


Et je ne sais pas trop comment l'exploiter si ce n'est en JS...
Edit : En fait il s'agit de l'une des nouveautés de HTML5 la gestion de ces nouveaux attributs de balises


En effet, ce ne sont que des ajouts liés au HTML5. Tu n'as pas à les exploiter sauf si tu en as envie/besoin.
Du coup est-ce que tu as toujours une question liée à ça où est-ce que ton formulaire se comporte correctement ?
 

the_bigboo a écrit :

Ensuite, j'ai également lu que l'on pouvait mettre les labels souhaités pour chaque entrée du formulaire (Via la méthode configure de la class qui étends Symfony\Component\Form\AbstractType)
Edit : JE veux dire qu'on passe un tableau d'option du type :

Code :
  1. array('label' => 'Mon label')


 
Seul souci, cette méthode ne prends en paramètre qu'une instance de Symfony\Component\Form\FormBuilder. Et il est impossible d'avoir depuis cette méthode un accès au service de traduction.
 
D’où ma seconde question comment faire, car je ne veux pas déclarer mon formulaire depuis le contrôleur...
 
Merci de votre aide ;)


Si tu fais un rendu de ton formulaire de façon correcte, c'est à dire via les fonctions Twig form_rest, form_row, form_widget, etc, alors tu n'as pas besoin de te soucier d'appeler toi même le service de traduction. Ces fonctions le font pour toi.
Si, pour un champs donné, tu as passé comme options :

Code :
  1. array('label' => 'Mon label')


Alors Twig va faire un rendu d'un tag label, et pour l'affichage de la chaîne de caractère il va faire pour toi :

Code :
  1. {{ label|trans }}


Donc tu as juste a bien configurer ton service de traduction et mettre en place les traductions.


---------------
Mon Feedback !
n°2092686
the_bigboo
Posté le 01-08-2011 à 16:54:07  profilanswer
 

Tirkyth a écrit :

En effet, ce ne sont que des ajouts liés au HTML5. Tu n'as pas à les exploiter sauf si tu en as envie/besoin.
Du coup est-ce que tu as toujours une question liée à ça où est-ce que ton formulaire se comporte correctement ?


Si tu veux, j'ai fait un truc tout con, à savoir, une table d'utilisateurs, et une tables de rôles pour ces utilisateurs, et entre les deux une table de relations ManyToMany.

 

Là je veux juste faire un formulaire ou tu créé un utilisateur, en lui associant des rôles. C'est absurde certes, mais je veux juste voir comment ça tourne j'ai pas de but particulier, si ce n'est voir comment fonctionne en ce qui concerne les relations N <-> N.

 

Si tu veux, le fait que ça me sorte un div avec cette propriété (data-prototype) ne me gène pas mais je suis plutôt surpris, mais je m'attendais plutôt à un liste de checkbox en fait. En l'état je ne vois pas ce que je dois faire avec ce div, qui par ailleurs contient bien les bonnes données, mais htmlentitisé au sein de l'attribut data-prototype.

Message cité 1 fois
Message édité par the_bigboo le 01-08-2011 à 16:57:42
n°2092696
Tirkyth
Posté le 01-08-2011 à 16:59:58  profilanswer
 

the_bigboo a écrit :


Si tu veux, j'ai fait un truc tout con, à savoir, une table d'utilisateurs, et une tables de rôles pour ces utilisateurs, et entre les deux une table de relations ManyToMany.
 
Là je veux juste faire un formulaire ou tu créé un utilisateur, en lui associant des rôles. C'est absurde certes, mais je veux juste voir comment ça tourne j'ai pas de but particulier, si ce n'est voir comment fonctionne en ce qui concerne les relations N <-> N.
 
Si tu veux, le fait que ça me sorte un div avec cette propriété (data-prototype) ne me gène pas mais je suis plutôt surpris, mais je m'attendais plutôt à un liste de checkbox en fait. En l'état je ne vois pas ce que je dois faire avec ce div, qui par ailleurs contient bien les bonnes données, mais htmlentitisé au sein de l'attribut data-prototype.


Je vais donc supposer que tu as correctement fait ta relation dans tes entités.
Est-ce que tu peux poster le code de ta classe de formulaire, ainsi que le template qui l'affiche ?


---------------
Mon Feedback !
n°2092701
the_bigboo
Posté le 01-08-2011 à 17:10:36  profilanswer
 

Bien sur :)

 

Je vais zapper les propriétés qui ne sont pas relatives à cet exemple.

 

Voici le rendu retourné par le widget pour la propriété userRoles, le reste fonctionne à merveille. Je précise que j'ai fait un form_rest classique depuis un template Twig :

Code :
  1. <div id="user_userRoles"
  2.     data-prototype="&lt;div&gt;&lt;label class=&quot; required&quot;&gt;$$name$$&lt;/label&gt;&lt;div id=&quot;user_userRoles_$$name$$&quot;&gt;&lt;div&gt;&lt;label class=&quot; required&quot;&gt;Label&lt;/label&gt;&lt;div id=&quot;user_userRoles_$$name$$_label&quot;&gt;&lt;input type=&quot;checkbox&quot; id=&quot;user_userRoles_$$name$$_label_2&quot; name=&quot;user[userRoles][$$name$$][label][2]&quot; value=&quot;2&quot; /&gt;&lt;label for=&quot;user_userRoles_$$name$$_label_2&quot;&gt;Administrateur&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;user_userRoles_$$name$$_label_1&quot; name=&quot;user[userRoles][$$name$$][label][1]&quot; value=&quot;1&quot; /&gt;&lt;label for=&quot;user_userRoles_$$name$$_label_1&quot;&gt;Super Administrateur&lt;/label&gt;&lt;input type=&quot;checkbox&quot; id=&quot;user_userRoles_$$name$$_label_3&quot; name=&quot;user[userRoles][$$name$$][label][3]&quot; value=&quot;3&quot; /&gt;&lt;label for=&quot;user_userRoles_$$name$$_label_3&quot;&gt;Utilisateur&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;"></div>
 

L'entité User :

Code :
  1. <?php
  2. use Doctrine\ORM\Mapping as ORM;
  3. use Symfony\Component\Security\Core\User\UserInterface;
  4. use Doctrine\Common\Collections\ArrayCollection;
  5. use Symfony\Component\Validator\Mapping\ClassMetadata;
  6. use Symfony\Component\Validator\Constraints\NotBlank;
  7. use Symfony\Component\Validator\Constraints\Type;
  8. /**
  9. * @ORM\Entity
  10. * @ORM\Table(name="hsl_usr_user" )
  11. *
  12. */
  13. class User implements UserInterface {
  14.        /**
  15.      * @ORM\ManyToMany(targetEntity="UserRole" )
  16.      * @ORM\JoinTable(name="hsl_lk_usr_uro_user_roles",
  17.      *     joinColumns={@ORM\JoinColumn(name="usr_id", referencedColumnName="usr_id" )},
  18.      *     inverseJoinColumns={@ORM\JoinColumn(name="uro_id", referencedColumnName="uro_id" )}
  19.      * )
  20.      *
  21.      * @var ArrayCollection $userRoles
  22.      */
  23.     protected $userRoles;
  24.     public function __construct(){
  25.                 $this->userRoles = new ArrayCollection();
  26.     }
  27. }
 

L'entité UserRole:
En gros ca contient les statuts utilisateur, admin, et super admin

Code :
  1. use Symfony\Component\Security\Core\Role\RoleInterface;
  2. use Doctrine\ORM\Mapping as ORM;
  3. /**
  4. * @ORM\Entity
  5. * @ORM\Table(name="hsl_uro_user_role" )
  6. *
  7. */
  8. class UserRole implements RoleInterface {
  9. }
 

Le Form Type UserRole :

Code :
  1. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  2. use Symfony\Component\Form\AbstractType;
  3. use Symfony\Component\Form\FormBuilder;
  4. class UserType extends AbstractType {
  5.        
  6.         public function getDefaultOptions(array $options)
  7.         {
  8.             return array(
  9.                 'data_class' => 'HouseLive\HomeBundle\Entity\User',
  10.                         'csrf_protection' => true,
  11.             'csrf_field_name' => '_token',
  12.             // a unique key to help generate the secret token
  13.             'intention'       => 'user_form'
  14.             );
  15.         }
  16.        
  17.         public function buildForm(FormBuilder $builder, array $options)
  18.     {
  19.         $builder
  20.                 // The login
  21.                 ->add('user_name', 'text')
  22.                
  23.                 // The password
  24.                 ->add('password', 'repeated',array(
  25.                         'type'                          => 'password',
  26.                         'invalid_message'       => '',
  27.                         'options'                       => array(
  28.                                 'label' => 'Password'
  29.                         )
  30.                 ))
  31.            
  32.                 // The first name
  33.                 ->add('first_name', 'text')
  34.            
  35.                 // The last name
  36.                 ->add('last_name', 'text')
  37.            
  38.                 // The email
  39.                 ->add('email', 'email')
  40.                 ->add('userRoles', 'collection', array(
  41.                         'type' => new UserRoleType(),
  42.                         'allow_add' => true,
  43.                 ));
  44.     }
  45.     public function getName()
  46.     {
  47.         return 'user';
  48.     }     
  49. }
 

Et pour finir la class UserRoleType:

Code :
  1. use Doctrine\ORM\EntityRepository;
  2. use Symfony\Component\Form\AbstractType;
  3. use Symfony\Component\Form\FormBuilder;
  4. class UserRoleType extends AbstractType {
  5.        
  6.         public function getDefaultOptions(array $options)
  7.         {
  8.             return array(
  9.                 'data_class' => 'HouseLive\HomeBundle\Entity\UserRole',
  10.                         // a unique key to help generate the secret token
  11.             'intention'                 => 'user_role_form',
  12.                 'error_bubbling'        => true
  13.             );
  14.         }
  15.        
  16.         public function buildForm(FormBuilder $builder, array $options)
  17.     {
  18.         $builder
  19.                 // The login
  20.                 ->add('label', 'entity', array(
  21.                         'class' => 'HouseLive\HomeBundle\Entity\UserRole',
  22.                             'query_builder' => function(EntityRepository $er) use ($options) {
  23.                         return $er
  24.                                 ->createQueryBuilder("r" )
  25.                                 ->orderBy("r.label", "ASC" );
  26.                          },
  27.                         'property' => 'label',
  28.                                 'multiple' => true,
  29.                         'expanded' => true
  30.                 ));
  31.     }
  32.     public function getName()
  33.     {
  34.         return 'role';
  35.     }     
  36. }


Message édité par the_bigboo le 01-08-2011 à 17:12:51
n°2092709
Tirkyth
Posté le 01-08-2011 à 17:39:45  profilanswer
 

Tu es en quelle version ? 2.0.0 ? Moi j'ai un exemple qui fonctionne comme tu le souhaites que j'ai sur une 2.0 RC6, mais je pense qu'il doit fonctionner sur une 2.0.0.
Si tu es sur une version plus ancienne, je te suggère de te mettre à jour.
 
J'ai beaucoup moins de code que toi par contre.
Je n'ai essayé qu'un contexte hors sécurité c'est à dire sans l'implémentation des diverses interfaces.
 
(J'ai enlevé les use et namespaces etc)
 
Les entitiés :

Code :
  1. /**
  2. * @ORM\Entity
  3. * @ORM\Table(name="product" )
  4. */
  5. class Product
  6. {
  7.    /**
  8.     * @ORM\Id
  9.     * @ORM\Column(type="integer" )
  10.     * @ORM\GeneratedValue(strategy="AUTO" )
  11.     */
  12.    private $id;
  13.  
  14.    /**
  15.     * @ORM\Column(name="name", type="string", length=255)
  16.     */
  17.    private $name;
  18.  
  19.    /**
  20.     * @ORM\ManyToMany(targetEntity="ProductCategory" )
  21.     * @ORM\JoinTable(name="product_has_product_category",
  22.     *      joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id" )},
  23.     *      inverseJoinColumns={@ORM\JoinColumn(name="product_category_id", referencedColumnName="id" )}
  24.     * )
  25.     */
  26.    private $categories;
  27.  
  28.    public function __construct()
  29.    {
  30.        $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
  31.    }
  32.  
  33.    // [...] Getters and setters
  34. }


Code :
  1. /**
  2. * @ORM\Table(name="product_category" )
  3. * @ORM\Entity
  4. */
  5. class ProductCategory
  6. {
  7.    /**
  8.     * @var integer $id
  9.     *
  10.     * @ORM\Column(name="id", type="integer" )
  11.     * @ORM\Id
  12.     * @ORM\GeneratedValue(strategy="AUTO" )
  13.     */
  14.    private $id;
  15.  
  16.    /**
  17.     * @var string $name
  18.     *
  19.     * @ORM\Column(name="name", type="string", length=255)
  20.     */
  21.    private $name;
  22.  
  23.    public function __toString()
  24.    {
  25.        return $this->name;
  26.    }
  27.  
  28.    // [...] Getters and setters
  29. }


[/code]
 
Ma classe de formulaire :

Code :
  1. class ProductType extends AbstractType
  2. {
  3.    public function buildForm(FormBuilder $builder, array $options)
  4.    {
  5.        $builder
  6.            ->add('name')
  7.            ->add('categories')
  8.        ;
  9.    }
  10.  
  11.    public function getName()
  12.    {
  13.        return 'storebundle_producttype';
  14.    }
  15. }


 
Tu vois, quasiment rien à faire normalement. Ce que je te suggère : Supprimer la classe UserRoleType car à priori elle ne sert à rien.
Dans UserType: supprimer ta méthode getDefaultOptions pour le moment. No need :)
Dans UserType, remplacer :

Code :
  1. ->add('userRoles', 'collection', array(
  2.        'type' => new UserRoleType(),
  3.        'allow_add' => true,
  4.    )


Par:

Code :
  1. ->add('userRoles')


---------------
Mon Feedback !
n°2092712
the_bigboo
Posté le 01-08-2011 à 17:51:59  profilanswer
 

Je teste ça ce soir, et je te dirai si la magie a opéré :)
Pour te répondre je suis sur la 2.0.0 dernière en date, et vendors à jour.

 

Bien que ta syntaxe soit plus concise et la mienne plus verbeuse, je ne vois pas en quoi elles diffèrent... (Enfin, ca a l'air de faire la même chose)

 

Graphiquement tu obtiens quoi comme rendu, et sous quel navigateur ? (P'tit screenshot inside ? :whistle: )


Message édité par the_bigboo le 01-08-2011 à 19:55:09
n°2092714
Tirkyth
Posté le 01-08-2011 à 18:11:56  profilanswer
 

La différence c'est que moi je lui laisse le soin de "deviner" le type de champ approprié pour gérer mon association many to many, alors que toi tu lui dis "mets-moi un champ collection".
 
Or, quand il va essayer de deviner il ne va pas mettre un champs de type collection mais un champ de type entity en fait.
 
Il va tomber sur ça précisément :

Code :
  1. class ProductType extends AbstractType
  2. {
  3.    public function buildForm(FormBuilder $builder, array $options)
  4.    {
  5.        $builder
  6.            ->add('name')
  7.            ->add('description')
  8.            ->add('isVisible')
  9.            ->add('treemap')
  10.            ->add('categories', 'entity', array(
  11.                'class'     => 'Acme\\StoreBundle\\Entity\\ProductCategory',
  12.                'multiple'  => true,
  13.            ))
  14.        ;
  15.    }
  16.  
  17.    public function getName()
  18.    {
  19.        return 'storebundle_producttype';
  20.    }
  21. }


 
La différence vient de là je pense. Visuellement sur Firefox 5, j'obtiens ça :
http://img405.imageshack.us/img405/4461/sf2select.png
 
Il suffit alors de rajouter un "expanded => true" en option pour obtenir une liste de checkboxes :

Code :
  1. class ProductType extends AbstractType
  2. {
  3.    public function buildForm(FormBuilder $builder, array $options)
  4.    {
  5.        $builder
  6.            ->add('name')
  7.            ->add('description')
  8.            ->add('isVisible')
  9.            ->add('treemap')
  10.            ->add('categories', 'entity', array(
  11.                'class'     => 'Acme\\StoreBundle\\Entity\\ProductCategory',
  12.                'multiple'  => true,
  13.                'expanded'  => true,
  14.            ))
  15.        ;
  16.    }
  17.  
  18.    public function getName()
  19.    {
  20.        return 'storebundle_producttype';
  21.    }
  22. }


 
Et tu obtiens ce que tu souhaitais :
http://img16.imageshack.us/img16/6378/sf2checkboxes.png


---------------
Mon Feedback !
n°2092748
the_bigboo
Posté le 01-08-2011 à 19:52:28  profilanswer
 

J'espère que tu n'as pas fait ça juste pour me montrer :D

 

En fait j'avais vu sur le net qu'on pouvait aussi faire ça de façon moins native en prenant un champ de type entity, mais en fait après j'avais eu une erreur comme quoi il avait reçu un instance de class Doctrine ArrayCollection au lieu d'un objet UserRoles (Logique) quand je le déclarait explicitement.

 

Je crois peut-être à tort, que laisser Symfony gérer à un cout en ressource tout de même, aussi minime soit-il, mais je me dit qu'il n'y a pas de petites économies :)

 

Je viens de tester, et si je laisse Symfony gérer, j'ai bien le même rendu que toi :)

 

Cependant, je suis quand même désireux de savoir comment le faire en le déclarant explicitement, histoire de savoir comment ça doit se configurer :)
Edit: pour le expanded, j'avais vu :) Je me suis quand même farci la doc, mais j'ai juste pas pensé à essayer de laisser Symfony gérer comme un grand :spamafote:

Message cité 1 fois
Message édité par the_bigboo le 01-08-2011 à 19:57:36
n°2092796
Tirkyth
Posté le 01-08-2011 à 23:29:32  profilanswer
 

the_bigboo a écrit :

J'espère que tu n'as pas fait ça juste pour me montrer :D
 
En fait j'avais vu sur le net qu'on pouvait aussi faire ça de façon moins native en prenant un champ de type entity, mais en fait après j'avais eu une erreur comme quoi il avait reçu un instance de class Doctrine ArrayCollection au lieu d'un objet UserRoles (Logique) quand je le déclarait explicitement.
 
Je crois peut-être à tort, que laisser Symfony gérer à un cout en ressource tout de même, aussi minime soit-il, mais je me dit qu'il n'y a pas de petites économies :)
 
Je viens de tester, et si je laisse Symfony gérer, j'ai bien le même rendu que toi :)
 
Cependant, je suis quand même désireux de savoir comment le faire en le déclarant explicitement, histoire de savoir comment ça doit se configurer :)
Edit: pour le expanded, j'avais vu :) Je me suis quand même farci la doc, mais j'ai juste pas pensé à essayer de laisser Symfony gérer comme un grand :spamafote:


Mon dernier exemple justement est une déclaration explicite dans la classe de formulaire. J'ai mis par contre un champs de type "entity", et je ne suis pas tombé sur l'erreur que tu décris.
Je veux bien d'ailleurs que tu explicites le "de façon moins native en prenant un champ type entity".
En quoi est-ce moins natif ?


---------------
Mon Feedback !
n°2092800
the_bigboo
Posté le 01-08-2011 à 23:48:54  profilanswer
 

Par moins natif, je veux parler de gens ayant traité ce cas en ayant recours à un ChoiceType, et en donnant la liste des valeurs dans le tableau options, tout en ayant pris soin de rajouter le nom de la dite option dans la liste des options reconnues pour ne pas bouffer une exception...

n°2093404
the_bigboo
Posté le 04-08-2011 à 22:42:17  profilanswer
 

Je reviens avec une nouvelle question :)

 

Je souhaiterais utiliser les assets, et plus particulièrement les "minify". Mais je ne vois pas ce comment je suis censé afficher le chemin vers une image de mon bundle située dans ProjetTestBundle/Resources/public/images/monimage.png

 

alors j'ai naivement fait le code suivant :

Code :
  1. {{ asset('@ProjetTestBundle/Resources/public/images/monimage.png') }}
 

Mais on dirait que ce n'est pas "interprété"... Et niveau doc pour le moment... :spamafote:

 

Z'auriez une idée ?

Message cité 1 fois
Message édité par the_bigboo le 04-08-2011 à 22:42:35
n°2093407
Dj YeLL
$question = $to_be || !$to_be;
Posté le 04-08-2011 à 23:27:22  profilanswer
 

the_bigboo a écrit :

Je reviens avec une nouvelle question :)

 

Je souhaiterais utiliser les assets, et plus particulièrement les "minify". Mais je ne vois pas ce comment je suis censé afficher le chemin vers une image de mon bundle située dans ProjetTestBundle/Resources/public/images/monimage.png

 

alors j'ai naivement fait le code suivant :

Code :
  1. {{ asset('@ProjetTestBundle/Resources/public/images/monimage.png') }}
 

Mais on dirait que ce n'est pas "interprété"... Et niveau doc pour le moment... :spamafote:

 

Z'auriez une idée ?

 
Code :
  1. {% image '@ProjetTestBundle/Resources/public/images/monimage.png' output="/images/monimage.png" %}
  2. <img src="{{ asset_url }}" alt="Mon Image"/>
  3. {% endimage %}


Message édité par Dj YeLL le 04-08-2011 à 23:27:41

---------------
Gamertag: CoteBlack YeLL
n°2093447
the_bigboo
Posté le 05-08-2011 à 10:56:31  profilanswer
 

Merci, j'avais vu cette syntaxe, mais je la trouve autrement plus verbeuse qu'utiliser un bon vieux :

Code :
  1. {{ asset('@ProjetTestBundle/Resources/public/images/monimage.png') }}


Mais bon, si c'est la façon la plus clean de faire, merci de la confirmation.
 
Autre chose, avant d'utiliser les assectics pour la gestion des JS et CSS, j'avais pas de soucis pour les images qui étaient utilisées depuis les CSS :
 
Par exemple dans mon CSS @ProjetTestBundle/Resources/public/css/style.css:
 

Code :
  1. body {
  2.   background-image:url('../images/monimage.png')
  3. }


 
L'image étant dans @ProjetTestBundle/Resources/public/images/monimage.png.
 
Hors, désormais ces images ne sont plus affichées puisque le path du CSS généré par les assetics utilise les réécritures d'URL...
 
Ma question est donc, y a t-il quelque chose que j'ai oublié d'implémenter ?
 
Ou bien dois-je utiliser un template CSS twig, et déclarer mes images avec une balise {% image %} ?
 
Si je suis pas clair dites le moi :)

n°2095717
smaragdus
whores, drugs & J.S. Bach
Posté le 17-08-2011 à 17:10:35  profilanswer
 

Salut, j'ai une question symfony 1.4 :
 
Je suis dans un Task, destinée à être appelé en CRON, je passe en param l'application et l'environnement mais j'ai pas de contexte.
 
j'obtiens le fameux :  

The "default" context does not exist.


 
J'ai donc fait un :
 

Code :
  1. protected function execute($arguments = array(), $options = array()) {
  2.         // initialize the database connection
  3.         $databaseManager = new sfDatabaseManager($this->configuration);
  4.         // init manuelle du contexte : (bien ou mal)
  5.         sfContext::createInstance($this->configuration); 
  6. ...


 
C'est le Bien ou c'est le Mal ?
 
En effet, j'ai besoin d'accéder au Dispatcher et aussi au Logger dans une classe dans un plugin (qui hérite de sfWebBrowser).
 
Que faire de mieux et comment contourner les sfContext::getInstance()->getLogger() et autre sfContext::getInstance()->getEventDispatcher()
 
Pour l'event dispatcher, je crois avoir trouvé qu'on peut le choper dans l'objet appli mais pour le logger, je trouve pas.
 
Thanx


Message édité par smaragdus le 17-08-2011 à 17:36:41
n°2095774
theredled
● REC
Posté le 17-08-2011 à 18:35:59  profilanswer
 

L'objet task a un logger il me semble.

 

Ou alors c'est le dispatcher qui en a un.

 

Sinon initialiser le contexte globalement c'est mal mais ça m'arrive des fois :o

 

En fait c'est surtout le côté Singleton qui est mal à la base.

Message cité 1 fois
Message édité par theredled le 17-08-2011 à 18:37:27

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°2095798
the_bigboo
Posté le 17-08-2011 à 19:38:33  profilanswer
 

theredled a écrit :

En fait c'est surtout le côté Singleton qui est mal à la base.


Disons que ça a ses avantages, et ses inconvénients, ça te permet  d'accéder à peut prêt tout et de n'importe où, tout en étant assez libre (si j'ose dire) dans l'architecture du dev, prenant un minimum de RAM.
 
La contrepartie, et c'est le cas dans ma boite, c'est que tu n'as plus de contrôle sur qui modifie quoi et quand... Et que quand tu veux faire évoluer un truc, et bien comme tu n'as pas de contrôle sur tes objets parce que plutôt que de passer les objets en arguments, ce qui est fait est un appel a une bonne grosse fonction globale...
 
C'est une des raisons pour lesquelles j'apprécie la façon dont Symfony 2 a été modélisé :)

n°2095806
theredled
● REC
Posté le 17-08-2011 à 20:18:48  profilanswer
 

the_bigboo a écrit :


Disons que ça a ses avantages, et ses inconvénients, ça te permet  d'accéder à peut prêt tout et de n'importe où, tout en étant assez libre (si j'ose dire) dans l'architecture du dev, prenant un minimum de RAM.


Tous les trucs crades ont leurs avantages :D
 
Et le même inconvénient, qui est que tu t'en mords souvent les doigts au bout de quelques mois :o


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
n°2095865
smaragdus
whores, drugs & J.S. Bach
Posté le 18-08-2011 à 08:57:21  profilanswer
 

Oui je suis bien d'accord avec le côté obscur du singleton :o
 
En fait, c'est le rôle/définition même du sfContext où j'ai du mal.  Autant pour la sfAppli, l'env, la config ou la route je vois bien, autant le contexte, je vois pas le rôle technique d'un tel objet et pourquoi il ne serait pas instancié en CLI quand on spécifie une appli.  
 
Y a une subtilité qui m'échappe.
 
Sinon, l'objet task n'a pas de logger mais une méthode (qui dispatche un "command.log" )
 
Je pense que je vais virer les log de mon plugin (ou checker hasInstance() avant) et récupérer le dispatcher par un ProjectConfig::getActive()->getEventDispatcher().  
=> Quitte à utiliser un singleton, autant que ça marche même en CLI :)
 
Merci pour ta réponse :jap:
 
Edit : Autre solution qui me vient après coup, vu que je suis dans un plugin, est-ce que je ne peux pas initialiser le context ou passer le dispatcher dans l'init du plugin ?


Message édité par smaragdus le 18-08-2011 à 09:01:45
n°2096789
the_bigboo
Posté le 22-08-2011 à 21:38:49  profilanswer
 

Toujours dans mon tour de découverte Symfony2, la en fait je suis plus sur une problématique Twig, mais je me dis que ceux qui se mettent sur Symfony 2 se mettrons probablement à Twig...
 
J'essaye de faire une liste. Basée sur les résultats retourné par un Respository Doctrine. Jusque là, rien de bien compliqué me direz vous.
 
Seulement voilà, dans l'idée de faire les choses bien, je souhaite faire ça via une extension Twig.
 
Le pager aurait pour rôle de gérer et restituer la pagination de la liste, la persistance des filtres dans la session, etc...
 
L'extension existante la plus proche de ce que je veux faire est je pense {% form_theme %}
En effet, cette balise rempli le template en déclarant le contenu de certains blocs (Je fais référence aux blocs de widgets)
 
l'idée ce serait donc de pré remplir des blocs genre "pagination" qui seraient déclarés dans un fichier, et qui serait appelé de la même façon que lorsqu'on appelle {% form_theme from "chemin_du_template" %}
 
Des pistes ? Car je ne crois pas que cette fonctionnalité existe...

n°2096974
Tirkyth
Posté le 23-08-2011 à 16:29:58  profilanswer
 

Est-ce que tu ne peux pas te servir des macros de twig pour arriver à ce résultat ?
 
http://www.twig-project.org/doc/templates.html#macros


---------------
Mon Feedback !
n°2096982
the_bigboo
Posté le 23-08-2011 à 17:08:04  profilanswer
 

Si... Effectivement, ca m'a l'air pas mal, je me demande même pourquoi je n'y ai pas pensé plus tôt :D

 

Le pire c'est que je suis passé dessus quand je me suis fait la doc, mais entre Doctrine, Twig, les Controller, les Firewalls, les Assetics, etc... Je suppose que je l'ai oublié celui-là :D

 

Merci pour ce rappel :D
Effectivement ca sera bien plus simple et à mon avis plus performant ;)


Message édité par the_bigboo le 23-08-2011 à 17:08:46
n°2096984
Tirkyth
Posté le 23-08-2011 à 17:12:31  profilanswer
 

En tout cas, si ça répond au besoin alors il n'est pas nécessaire de se mettre à faire une extension Twig.
 
Si jamais en essayant tu te rend compte que les macros ne sont pas suffisantes, on essayera de trouver une autre solution.


---------------
Mon Feedback !
n°2096989
the_bigboo
Posté le 23-08-2011 à 17:34:16  profilanswer
 

D'après ta signature je lis que tu bosses pour Sensio Labs, ça doit être sympa de bosser sur un truc récent et de ne pas s'encombrer de la maintenance de vieux bousins en PHP 3 ou 4...

 

Pour en revenir à ce dont on parlait, normalement les macros devraient suffire, cependant je découvre toujours comment ça marche, je ne me suis pas encore approprié complètement la logique de fonctionnement de SF2.

 

Après, ce serait plus pour une question de curiosité personnelle, mais c'est toujours intéressant de savoir comment faire une extension Twig...
Et encore, Il y a les extensions, les Nodes, j'ai pas encore tout capté mais ça viendra en temps voulu :D

 

De ton ressenti par rapport à toutes les façons de configurer une application (Kernel, Bundles, etc...), tu es plus sur le PHP, le YAML, le XML ou les annotations ?


Message édité par the_bigboo le 23-08-2011 à 17:43:31
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  9  10  11  12

Aller à :
Ajouter une réponse
 

Sujets relatifs
Symfony, OVH, et PHP_VERDes questions sur php
[C#] Questions de débutant...servlet : pleins de questions :/
Questions utilesQuelques questions
Probleme/questions Graphe de Scene avec Java3Dfpc télécharger un fichier et questions sur win
Questions sur week planner PHP/SQL[AS3 - newbies] Mes questions pour bien débuter
Plus de sujets relatifs à : Symfony : questions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR