IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

associé image pictos à un input radio (sfWidgetFormChoice) [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut associé image pictos à un input radio (sfWidgetFormChoice)
    Bonjour Le forum

    J'ai un problème, que je commence à me prendre la tête avec ..

    J'ai un button radio, que je voudrai associé à chacune de ses valeurs une image.

    J'aurai tendance à ajouter un widget dans mon formulaire de type image .. et après je cherche à associé par rapport à chaque valeur? ce n'est pas lourd?

    Mais je me dis s'il y a bien une option dans le sfWidgetFormChoice , qui prend comme option une image ??

    Une piste ça me débloquera bien.

    Merci beaucoup

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Le truc est que la notion de bouton radio seul n'existe pas dans les widgets. En effet, tu as rarement un bouton radio seul, mais associé à une série de possibilités (aussi non, c'est des case à cocher...)

    Donc, les boutons radios sont des éléments d'un sfWidgetFormSelect.

    Plus de doc ici : http://www.symfony-project.org/gentl...b_list_widgets

    Maintenant, est-ce que dans le tableau choice tu peux mettre en deuxième argument un tag img... a essayer. Dans le pire des cas, cela va marcher.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Tu voudrais remplacer le texte du bouton radio par une image ?
    J'aurais tendance dans ce cas à tester :
    - lors du configure() de ton formulaire, inclure des tags img à la place du texte de tes boutons radios ;
    - ou bien directement dans tes templates, remplacer tes renderLabel() pour convertir ton texte en une image (méthode assez légère si tu utilises l'admin generator puisque tu n'as qu'un partial à créer pour ton widget spécifique).

    Pour le premier cas, créer un sfWidgetFormImageChoice qui t'implémente le travail supplémentaire pourrait être utile pour ensuite réutiliser ton objet ultérieurement.

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Mreci pour votre réponse,

    Je ne sais pas si j'ai bien compris.

    Mais je ne trouve pas le sfWidgetFormImageChoice , est ce que c'est à moi de le faire ou c'est un widget symfony qui existe?


    à préciser : en effet, je veux remplacer le text de mon input radio par l'image correspondante.


    Merci beaucoup

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Je parlais du fait de créer cette classe (réutilisable), comme étendant de sfWidgetFormChoice.

    Lors du configure() de cet objet, chaque paramètre "choices" est converti en un tag d'image.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Où et comment sont stocké les nom (et éventuellement les fichiers) images ?

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Je les stock dans une table en relation avec Matable, en foreignKey.

    Mais j'avoue que je ne sais pas comment rendre les choices en tag Image..

    Merci

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Lorsque tu crées un nouveau Widget, tu as la possibilité de définir une nouvelle implémentation de la méthode render(). Elle a la forme suivante (cf. le code des Widgets Symfony) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      /**
       * @param  string $name        The element name
       * @param  string $value       The date displayed in this widget
       * @param  array  $attributes  An array of HTML attributes to be merged with the default HTML attributes
       * @param  array  $errors      An array of errors for the field
       *
       * @return string An HTML tag string
       *
       * @see sfWidgetForm
       */
      public function render($name, $value = null, $attributes = array(), $errors = array())
    Cette méthode te retourne un String : la chaîne qui sera affichée dans ta page HTML.

    Donc à toi de définir tout ce que tu veux comme rendu. Tu as notamment des helpers (renderTag, renderImg ou ce genre) qui te permette de retourner des tags img ou autres.

    Je te conseille de regarder le code des Widgets déjà existants pour voir comment ça fonctionne.

  9. #9
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Donc physiquement, les images sont des fichiers accessibles.

    Je pense que la solution de bilbonec est la meilleur. Mais, vu le type d'objet, elle est loin d'être simple à mettre en œuvre.

    Je pense que le code te ton objet pourrait être (non tests) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class myWidgetFormSelectImageRadio  extends sfWidgetFormSelectRadio
    {
       public function getChoices()
       {
          $results = parent::getChoices()
          foreach ($results as $result)
          {
             $result = '<img href="' . $result . '" />'
          }
          return $results
       }
    }
    La méthode getChoices récupères les options possibles pour la liste (de boutons ici), on va surtout y rajouter de quoi afficher les images. Non testé, c'est plus une inspiration qu'un code à prendre comme argent comptant.

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Merci beaucoup pour votre réponse,

    Je vous montre ce que j'ai fait en suivant la solution de Michel Rotta :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $this->widgetSchema['modelChoice'] = new sfWidgetFormImageChoice(
     		array('expanded' => true, 
     		'multiple' => false, 
     		'model' => $modeleValeur,
     		'query' => Doctrine::getTable($modeleValeur)->getQueryForItemForm($this->getModelUser()) ));
    Comme les input radio, prennent leurs valeurs d'un autre modèl en relation.

    et j'ai crée sfWidgetFormImageChoice dans le Frontend/lib
    contenant le code du widget :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class sfWidgetFormImageChoice extends sfWidgetFormDoctrineChoice
    {
       public function getChoices()
       {
          $results = parent::getChoices();
          foreach ($results as $result)
          {
             $result = '<img href="' . $result . '" />';
          }
          return $results;
       }
    }
    Explications :

    quand je test le resultat $results , je trouves bien mon contenu html comme je veux avec les noms des images, mais je n'arrive pas à avoir le même code dans ma page, parceque je ne passe le paramètre choices?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    A priori oui. Mais je ne vois même pas comment tu arrives à obtenir un résultat dans $results en ne passant pas un array de tes choices. Normalement tu es obligé de le définir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      protected function configure($options = array(), $attributes = array())
      {
        $this->addRequiredOption('choices');
        $this->addOption('translate_choices', true);
      }
    (cf. classe sfWidgetFormChoiceBase)

    Et je ne vois pas non plus ce qu'est 'query', je ne l'ai pas trouvé dans les options des sfWidgetFormChoice* ?

    Tu pourrais également donner le code de ton template ?

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Ce n'est pas sfWidgetFormChoice mais sfWidgetFormDoctrineChoice
    Et, pour le resultat, je voulai juste voir le contenu de $resultat, mais je n'arrive pas à afficher les images.


    sinon pour le template, j'ai juste un echo $from;, qui contient les formulaires imbriqués.


    Si tu veux je le met, si ça peut changer ou résoudre mon problème.

    Mais je ne vois même pas comment tu arrives à obtenir un résultat dans $results en ne passant pas un array de tes choices. Normalement tu es obligé de le définir
    Je ne sais pas ou est ce que je dois le définir est comment, quand je passe mes paramètres, expanded multiple model query ?

    Merci beaucoup

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Ok pour le sfWidgetDoctrineFormChoice, ceci explique qu'il peut y avoir un intérêt à définir la "query" de recherche de tes éléments.

    De mon côté (vu que le besoin peut facilement se poser pour moi aussi !), j'ai essayé en partant de la redéfinition du render(). Le problème est qu'il est dépendant d'un $this->getRenderer()->render().

    D'autre part, ce qui permet l'affichage de tes choix, ceci se passe dans les sfWidgetFormSelectRadio/Checkbox.

    Du coup, j'en suis arrivé à définir deux nouveaux objets : myWidgetFormChoice et sfWidgetFormSelectMyRadio, afin de personnaliser ton affichage de boutons radios. Cela donne le code suivant :
    (j'ai mis en gras les lignes de code changées ou ajoutées, par rapport au code initial de Symfony des classes héritées)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class myWidgetFormChoice extends sfWidgetFormChoice
    {
      /**
       * @desc Redéfinition de la méthode parente getRenderer
       * 
       * @see sfWidgetFormChoice
       */
      public function getRenderer()
      {
        if ($this->getOption('renderer'))
        {
          return $this->getOption('renderer');
        }
    
        if (!$class = $this->getOption('renderer_class'))
        {
          $type = !$this->getOption('expanded') ? '' : ($this->getOption('multiple') ? 'checkbox' : 'myRadio');
          $class = sprintf('sfWidgetFormSelect%s', ucfirst($type));
        }
    
        return new $class(array_merge(array('choices' => new sfCallable(array($this, 'getChoices'))), $this->options['renderer_options']), $this->getAttributes());
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    class sfWidgetFormSelectMyRadio extends sfWidgetFormSelectRadio
    {
        /**
         * @desc Redéfinition de la méthode parente formatChoices
         * 
         * @see sfWidgetFormSelectRadio
         */
      protected function formatChoices($name, $value, $choices, $attributes)
      {
        $inputs = array();
        foreach ($choices as $key => $option)
        {
          $baseAttributes = array(
            'name'  => substr($name, 0, -2),
            'type'  => 'radio',
            'value' => self::escapeOnce($key),
            'id'    => $id = $this->generateId($name, self::escapeOnce($key)),
          );
    
          if (strval($key) == strval($value === false ? 0 : $value))
          {
            $baseAttributes['checked'] = 'checked';
          }
    
          $inputs[$id] = array(
            'input' => $this->renderTag('input', array_merge($baseAttributes, $attributes)),
            'label' => $this->renderTag("img", array('value' => "path_to_img")),
          );
        }
    
        return call_user_func($this->getOption('formatter'), $this, $inputs);
      }
    }
    La méthode semble un peu lourde mais elle marche
    Peut-être qu'avec un peu de refactoring on peut l'alléger.

    Pour le renderTag "img", je n'ai pas pris le temps de faire quelque chose de correct. Il faudra sûrement d'autres arguments que value.

  14. #14
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Merci pour le code :

    Mais je n'arrive toujours pas à comprendre je passe quoi dans le paramètre choices ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->widgetSchema['modelChoice'] = new sfWidgetFormSelectMyRadio(array('choices' => ???? 																));
    Je ne peux pas passer un array en dur

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Non effectivement (enfin, tu peux, mais ce n'est pas du tout conseillé d'un point de vue maintenance et débugguage). Et c'est d'ailleurs l'avantage de disposer du sfWidgetFormDoctrineChoice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'author_id'   => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('Author'), 'add_empty' => true)),
    Préciser le relatedModelName va permettre de préciser quelle relation suivre pour obtenir les entrées à afficher dans ton widget.

    Tu parles plus haut de "query" (que je n'ai pas encore utilisé dans ce contexte) : j'imagine que cela permet une recherche personnalisée des entrées de ton choices.

    C'est ton "model" qui va permettre de connaître tes "choices". En regardant le code de getChoices() dans sfWidgetFormDoctrineChoice, tu peux voir comment ça marche.

  16. #16
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Je vous remercie beaucoup pour votre aide

    J'arrive à avoir mes images avec les input ...Donc ça marche

    Je précise pour toutes personne qui aura le même problème :

    En gras ce que j'ai ajouté sur le code de bilbonec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class myWidgetFormChoice extends sfWidgetFormDoctrineChoice
    {
      /**
       * @desc Redéfinition de la méthode parente getRenderer
       * 
       * @see sfWidgetFormChoice
       */
      public function getRenderer()
      {
        if ($this->getOption('renderer'))
        {
          return $this->getOption('renderer');
        }
    
        if (!$class = $this->getOption('renderer_class'))
        {
          $type = !$this->getOption('expanded') ? '' : ($this->getOption('multiple') ? 'checkbox' : 'myRadio');
          $class = sprintf('sfWidgetFormSelect%s', ucfirst($type));
        }
    
        return new $class(array_merge(array('choices' => new sfCallable(array($this, 'getChoices'))), $this->options['renderer_options']), $this->getAttributes());
      }
    }
    Juste j'ai perdu ma selection que j'avais avant, alors j'ai pas un input coché.

    Mais ça je saurai le reglé.

    Je vous remercie encore une fois

  17. #17
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Et si vous partez sur un enfant de sfWidgetFormDoctrineChoice.php, avec, en gros, la même modification que celle proposée avant ?

    Le getChoice vat retourner le lien et le render vient de sfWidgetFormChoice et me semble un peu trop élaboré pour être modifié simplement, alors que lui donner un tableau choice qui nous convient me semble plus simple.

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    En fait, j'ai essayé de juste surcharger le getChoices, ce qui faisait presque le résultat attendu. C'est à dire que j'obtenais :
    - <img>choix 1</img>
    - <img>choix 2</img>
    - <img>choix 3</img>

    Avec les balises IMG en clair (c'est le code HTML des < et > qui était passé au template). J'ai pas trouvé comment résoudre ce point, du coup j'ai passé sur cette autre solution.

    Ceci dit, si tu y arrives, je veux bien savoir comment. Ca serait quand même plus léger de ne changer que le getChoices()

  19. #19
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Je proffite pour dire que j'ai reglé mon problème de ma valeur sélectionnée.

    Maintenant

    Ce que je vous demande maintenant n'est pas aussi compliqué que la première question.

    Sur une étape de ma création de formulaire, Je voudrai mettre mon input en lecture seule.

    j'ai essayé le basique

    $form->widgetSchema['MonModelChoices']->setAttribute('readOnly','readOnly');

    Curieusement, il me le met en grisonnant, mais j'ai toujours la main pour le séléctionner ou déséléctionner ? ce n'est pas comme les champs inputText?

    Mais , pour organiser mieux le forum; vous me dites si je peux mettre ça sur un autre sujet indépendant, sachant que je vais essayer de le résoudre de mon coté.

    Merci

  20. #20
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 131
    Par défaut
    Désolé, je n'ai pas vu ton message bilbonec, ma solution, ne t'interesserai pas, car justement, j'ai du coché la dernière valeur, comme dans le select, on a la première ou la dernière valeur sélectionnée.

    Donc, en effet j'ai ajouté une option checked sur le dernier élément.

    Mais j'ai fait ça, parceque le besoin correspond à cette solution, du moment ou je vais bloqué la séléction dans cette étape , mais juste l'afficher.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Style different entre un input.text et un input.radio
    Par titan_33 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 18/09/2007, 21h02
  2. [Upload] upload d'image dans un input text
    Par visqueu dans le forum Langage
    Réponses: 11
    Dernier message: 18/04/2007, 16h21
  3. Agir sur les input radio et text
    Par jerome38000 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 10/01/2007, 12h00
  4. Taille d'un input radio
    Par messa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/08/2006, 14h58
  5. Activer boutons checkbox SEULEMENT si un input radio est coché
    Par bobic dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 28/04/2006, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo