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 :

sfForkedDoctrineGuardPlugin - Edition de profil - probleme envoi avatar [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut sfForkedDoctrineGuardPlugin - Edition de profil - probleme envoi avatar
    Bonjour à tous,

    J'utilise le plugin sfForkedDoctrineGuard pour compléter sfGuard et avoir ainsi le profil des utilisateurs.

    Cependant, lorsque j'essaye la partie edition du profil en mmodifiant l'avatar, le nom du fichier est bien transmit à la base de donnée mais le fichier n'est pas sauvegardé dans le dossier correspondant.

    Je vous donne ci-dessous mon code pour configurer le formulaire d'édition:
    Code php : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?php
     
    class sfApplySettingsForm extends sfGuardUserProfileForm
    {
      public function configure()
      {
        parent::configure();
        $this->removeFields();
     
     
     
        $this->widgetSchema['avatar'] = new sfWidgetFormInputFileEditable(array(
              'label'        => 'Avatar ' .$this->getObject()->getFirstName().'',
              'file_src'     => '/bib_uploads/avatars/'.$this->getObject()->getAvatar(),
              'is_image'     => true,
              'edit_mode'    => !$this->isNew(),
              'delete_label' => 'Supprimer l\'image',
              'template'     => '%file%<br /> <span class="avatar">%input%</span> <br />%delete_label%&nbsp;%delete%',
            ),
                                                                               array(
              'width'=>'70'
            ));
     
        $this->validatorSchema['avatar_delete'] = new sfValidatorPass();
     
        // We're editing the user who is logged in. It is not appropriate
        // for the user to get to pick somebody else's userid, or change
        // the validate field which is part of how their account is
        // verified by email. Also, users cannot change their email
        // addresses as they are our only verified connection to the user.
     
        $this->widgetSchema->setLabels(
                array(
                    'firstname' => 'First Name',
                    'lastname' => 'Last name') );
        $this->widgetSchema->moveField('firstname', sfWidgetFormSchema::FIRST);
        $this->widgetSchema->moveField('lastname', sfWidgetFormSchema::AFTER, 'firstname');
     
        $this->widgetSchema->setNameFormat('sfApplySettings[%s]');
        $this->widgetSchema->setFormFormatterName('list');
     
        $this->setValidator( 'firstname' , new sfValidatorApplyFirstname() );
        $this->setValidator( 'lastname', new sfValidatorApplyLastname() );
     
     
     
      }
     
      protected function removeFields()
      {
        unset(
            $this['user_id'],
            $this['validate'],
            $this['email'],
            $this['email_new'],
            $this['validate_at'],
            $this['id'],
            $this['created_at'],
            $this['updated_at']
        );
      }
    }

    Puis la partie du code du fichier sfApplyActionsLibrary.class.php correspondant:
    Code php : 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
      public function executeSettings(sfRequest $request)
      {
        // sfApplySettingsForm inherits from sfApplyApplyForm, which
        // inherits from sfGuardUserProfile. That minimizes the amount
        // of duplication of effort. If you want, you can use a different
        // form class. I suggest inheriting from sfApplySettingsForm and
        // making further changes after calling parent::configure() from
        // your own configure() method.
     
        $profile = $this->getUser()->getProfile();
        // we're getting default or customized settingsForm for the task
        if( !( ($this->form = $this->newForm( 'settingsForm', $profile) ) instanceof sfGuardUserProfileForm) )
        {
          // if the form isn't instance of sfApplySettingsForm, we don't accept it
          throw new InvalidArgumentException( sfContext::getInstance()->
              getI18N()->
              __( 'The custom %action% form should be instance of %form%',
                      array( '%action%' => 'settings',
                          '%form%' => 'sfApplySettingsForm' ), 'sfForkedApply' )
              );
        }
        if ($request->isMethod('post'))
        {
          $formValues = $request->getParameter( $this->form->getName() );
          $formFiles = $request->getFiles( $this->form->getName() );
            //binding request form parameters with form
          $this->form->bind($formValues, $formFiles);
          if ($this->form->isValid())
          {      
            $this->form->save();
            return $this->redirect('@homepage');
          }
        }
      }

    J'ai essayé de modifier ce code en faisant:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /..
          if ($this->form->isValid())
          {
    		$file = $this->form->getValue('avatar');
     
    		$filename = .sha1($file->getOriginalName());
            $extension = $file->getExtension($file->getOriginalExtension());
            $file->save(sfConfig::get('sf_upload_dir').'/avatars/'.$filename.$extension);
     
            $this->form->save();
            return $this->redirect('@homepage');
          }
    ../

    Mais la j'ai une erreur:
    Call to a member function getOriginalName() on a non-object
    Je ne vois pas trop pourquoi puisque mon bind est bien définit pour récupérer aussi les fichiers...

    Merci de votre aide.

    P.S: Je tiens à préciser que lors de la création du compte l'envoi du fichier se fait bien sans problème.
    exctrait sfApplyApplyForm
    Code php : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    class sfApplyApplyForm extends sfGuardUserProfileForm
    {
        private $userId;
     
        public function configure()
        {
            parent::configure();
     
            $this->removeFields();
     
    /..
    ../
     
            $this->widgetSchema['avatar'] = new sfWidgetFormInputFile(array(
          'label' => 'Avatar',
        ));
     
     /..
     
    ../
     
            $this->validatorSchema['avatar'] = new sfValidatorFile(array(
            'required'   => false,
            'path'       => sfConfig::get('sf_upload_dir').'/avatars',
            'mime_types' => 'web_images',
        ));
     
             if( $postValidator )
            {
                $postValidators[] = $postValidator;
            }
     
     
            $this->validatorSchema->setPostValidator( new sfValidatorAnd($postValidators) );
        }
     
        public function doSave($con = null)
        {
            $user = new sfGuardUser();
            $user->setUsername($this->getValue('username'));
            $user->setPassword($this->getValue('password'));
            // They must confirm their account first
            $user->setIsActive(false);
            $user->save();
            $this->userId = $user->getId();
     
            return parent::doSave($con);
        }
     
        public function updateObject($values = null)
        {
            $object = parent::updateObject($values);
            $object->setUserId($this->userId);
     
            // Don't break subclasses!
            return $object;
        }
     
     
        protected function removeFields()
        {
     
            // We're making a new user or editing the user who is
            // logged in. In neither case is it appropriate for
            // the user to get to pick an existing userid. The user
            // also doesn't get to modify the validate field which
            // is part of how their account is verified by email.
     
            unset($this['user_id'], $this['validate'], $this['validate_at'],
                    $this['created_at'], $this['updated_at'], $this['email_new']);
     
        }
     
    }

    et de l'action correspondante dans sfApplyActionsLibrary.class.php:
    Code php : 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
    public function executeApply(sfRequest $request)
      {
     
    /..
    ../
     
        if( $request->isMethod('post') )
        {
          //gathering form request in one array
          $formValues = $request->getParameter( $this->form->getName() );
          $formFiles = $request->getFiles( $this->form->getName() );
     
            //binding request form parameters with form
          $this->form->bind($formValues, $formFiles);
          if ($this->form->isValid())
          {
            $file = $this->form->getValue('avatar');
     
            $guid = "n" . self::createGuid();
            $this->form->getObject()->setValidate( $guid );
            $date = new DateTime();
            $this->form->getObject()->setValidateAt( $date->format( 'Y-m-d H:i:s' ) );
            $this->form->save();
     
    /..
    ../
          }

  2. #2
    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
    As-tu testé de plutôt récupérer la valeur de l'objet associé à ton formulaire ?
    A la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $file = $this->form->getValue('avatar');
    essayer de faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $file = $this->form->getObject()->getAvatar();

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    Toujours la même erreur:
    Fatal error: Call to a member function getOriginalName() on a non-object in ...\plugins\sfForkedDoctrineApplyPlugin\lib\action\sfApplyActionsLibrary.class.php on line 279
    la ligne 279 correspond à:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $filename = sha1($file->getOriginalName());

  4. #4
    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
    Oui, problème classique d'un objet NULL sur lequel tu fais un appel de méthode.

    Si tu as XDebug (ou sinon de faire quelques echo / die), je te conseillerais d'observer le contenu de ton $this->form avant que tu n'initialises $file.

    Là tout de suite, je n'ai pas plus d'idée à te soumettre ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    Oui j'ai XDebug!! Mais comment je peux faire correctement??

  6. #6
    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
    Si tu as une erreur, c'est parce que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $file = $this->form->getValue('avatar');
    et
    $file = $this->form->getObject()->getAvatar();
    te retournent NULL.

    Du coup, mets-y un point d'arrêt et observe le contenu de $form. Comme dit plus haut, je n'ai aucune solution à te proposer, juste une piste de débuggage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mail] probleme envoie mail
    Par phoeniix07 dans le forum Langage
    Réponses: 7
    Dernier message: 21/06/2006, 14h35
  2. probleme envoi SendBuf()
    Par Syl91 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2006, 12h55
  3. [MySQL] probleme envoi avec POST
    Par Tr@nkill dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 24/04/2006, 09h11
  4. Probleme envoi multicast sur XP
    Par BattlingJM dans le forum Windows
    Réponses: 6
    Dernier message: 16/03/2006, 17h13

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