2017-08-04 39 views
2

我試圖與vich_upload文件的上傳,但我不明白爲什麼沒有更新的圖像:/上傳文件不工作 - vich_uploader

形式返回沒有錯誤,但圖像不會被保存。我不明白爲什麼,雖然它不會返回任何錯誤..

我可以告訴我在我的代碼中哪裏出錯了嗎?

我感謝你在

config.yml:

imports: 
       - { resource: parameters.yml } 
       - { resource: security.yml } 
       - { resource: services.yml } 

      # Put parameters here that don't need to change on each machine where the app is deployed 
      # http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 
      parameters: 
       locale: fr 
       app.path.partenaire_dir : /images/partenaires 

      framework: 
       #esi:    ~ 
       translator:  { fallbacks: ["%locale%"] } 
       secret:   "%secret%" 
       router: 
        resource: "%kernel.root_dir%/config/routing.yml" 
        strict_requirements: ~ 
       form:   ~ 
       csrf_protection: ~ 
       validation:  { enable_annotations: true } 
       #serializer:  { enable_annotations: true } 
       templating: 
        engines: ['twig'] 
       default_locale: "%locale%" 
       trusted_hosts: ~ 
       trusted_proxies: ~ 
       session: 
        # http://symfony.com/doc/current/reference/configuration/framework.html#handler-id 
        handler_id: session.handler.native_file 
        save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%" 
       fragments:  ~ 
       http_method_override: true 
       assets: ~ 

      # Twig Configuration 
      twig: 
       debug:   "%kernel.debug%" 
       strict_variables: "%kernel.debug%" 
       form_themes: 
        - 'SonataFormatterBundle:Form:formatter.html.twig' 
        - 'VichUploaderBundle:Form:fields.html.twig' 
      # Doctrine Configuration 
      doctrine: 
       dbal: 
        driver: pdo_mysql 
        host:  "%database_host%" 
        port:  "%database_port%" 
        dbname: "%database_name%" 
        user:  "%database_user%" 
        password: "%database_password%" 
        charset: UTF8 
        # if using pdo_sqlite as your database driver: 
        # 1. add the path in parameters.yml 
        #  e.g. database_path: "%kernel.root_dir%/data/data.db3" 
        # 2. Uncomment database_path in parameters.yml.dist 
        # 3. Uncomment next line: 
        #  path:  "%database_path%" 

       orm: 
        auto_generate_proxy_classes: "%kernel.debug%" 
        naming_strategy: doctrine.orm.naming_strategy.underscore 
        auto_mapping: true 

      # Swiftmailer Configuration 
      swiftmailer: 
       transport: "%mailer_transport%" 
       encryption: ssl 
       auth_mode: login 
       host:  "%mailer_host%" 
       username: "%mailer_user%" 
       password: "%mailer_password%" 
       spool:  { type: memory } 

      sonata_block: 
       default_contexts: [cms] 
       blocks: 
        # enable the SonataAdminBundle block 
        sonata.admin.block.admin_list: 
         contexts: [admin] 
        sonata.admin.block.search_result: 
         contexts: [admin] 
        sonata.block.service.text: 
        sonata.block.service.rss: 

      fos_user: 
       db_driver: orm # other valid values are 'mongodb' and 'couchdb' 
       firewall_name: main 
       user_class: AppBundle\Entity\User 

      gregwar_captcha: 
       width: 200 
       height: 50 
       length: 6 
       quality: 90 
       distortion: true 
       background_color: [41, 145, 214] 
       max_front_lines: 0 
       reload: true 
       as_url: true 
       interpolation: true 

      ivory_ck_editor: 
       default_config: default 
       configs: 
         default: 
          toolbar: standard 

      sonata_formatter: 
       default_formatter: text 
       formatters: 
        markdown: 
         service: sonata.formatter.text.markdown 
         extensions: 
          - sonata.formatter.twig.control_flow 
          - sonata.formatter.twig.gist 
        #  - sonata.media.formatter.twig #keep this commented unless you are using media bundle. 


        text: 
         service: sonata.formatter.text.text 
         extensions: 
          - sonata.formatter.twig.control_flow 
          - sonata.formatter.twig.gist 
        #  - sonata.media.formatter.twig 


        rawhtml: 
         service: sonata.formatter.text.raw 
         extensions: 
          - sonata.formatter.twig.control_flow 
          - sonata.formatter.twig.gist 
        #  - sonata.media.formatter.twig 


        richhtml: 
         service: sonata.formatter.text.raw 
         extensions: 
          - sonata.formatter.twig.control_flow 
          - sonata.formatter.twig.gist 
        #  - sonata.media.formatter.twig 


        twig: 
         service: sonata.formatter.text.twigengine 
         extensions: [] # Twig formatter cannot have extensions 

      sonata_admin: 
       security: 
        handler:    sonata.admin.security.handler.noop 
        acl_user_manager:  null 
       title:    'Futurs' 
       title_logo:   images/favicon.ico 
       templates: 
        # default global templates 
        layout: SonataAdminBundle::standard_layout.html.twig 
        ajax: SonataAdminBundle::ajax_layout.html.twig 
        dashboard: SonataAdminBundle:Core:dashboard.html.twig 
       dashboard: 
        blocks: 
         - 
          position: left 
          type: sonata.admin.block.admin_list 
         - 
          position: right 
          type: sonata.block.service.text 
          settings: 
           content: > 
            <h2 style="text-align:center;">Administration du site FUTURS</h2> 
      # CONFIGURATION DE VICH UPLOADER 
      vich_uploader: 
       db_driver: orm 
       mappings: 
        partenaire_dir: 
         uri_prefix: %app.path.partenaire_dir% 
         upload_destination: %kernel.root_dir%/../web/images/partenaires 
         namer: vich_uploader.namer_uniqid 
         inject_on_load:  true 
         delete_on_update: true 
         delete_on_remove: true 

實體:

<?php 

    namespace AppBundle\Entity; 

    use Doctrine\ORM\Mapping as ORM; 
    use Symfony\Component\HttpFoundation\File\UploadedFile; 
    use Symfony\Component\HttpFoundation\File\File; 
    use Vich\UploaderBundle\Mapping\Annotation as Vich; 

    /** 
    * Partenaire 
    * 
    * @ORM\Table(name="partenaire") 
    * @ORM\Entity(repositoryClass="AppBundle\Repository\PartenaireRepository") 
    * @Vich\Uploadable 
    */ 
    class Partenaire 
    { 
     /** 
     * @var int 
     * 
     * @ORM\Column(name="id", type="integer") 
     * @ORM\Id 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     private $id; 

     /** 
     * @var string 
     * 
     * @ORM\Column(name="logo", type="string", length=255) 
     */ 
     private $logo; 

     /** 
     * @Vich\UploadableField(mapping="partenaire_dir", fileNameProperty="logo") 
     * 
     * @var File 
     */ 
     private $logoFichier; 

     /** 
     * @ORM\Column(type="datetime") 
     * 
     * @var \DateTime 
     */ 
     private $updatedAt; 


     /** 
     * Get id 
     * 
     * @return integer 
     */ 
     public function getId() 
     { 
      return $this->id; 
     } 

     /** 
     * Set logo 
     * 
     * @param string $logo 
     * 
     * @return Partenaire 
     */ 
     public function setLogo($logo) 
     { 
      $this->logo = $logo; 

      return $this; 
     } 

     /** 
     * Get logo 
     * 
     * @return string 
     */ 
     public function getLogo() 
     { 
      return $this->logo; 
     } 


     public function setLogoFichier(File $logo = null) 
     { 
      $this->logoFichier = $logo; 
      if ($logo) { 
        $this->updatedAt = new \DateTime('now'); 
      } 
      return $this; 
     } 

     public function getWebPath() 
     { 
      $val = $this->logo; 
      return $val;    
     } 

     /** 
      * @return File 
      */ 
     public function getLogoFichier() 
     { 
      return $this->logoFichier; 
     } 

     /** 
     * Set updatedAt 
     * 
     * @param \DateTime $updatedAt 
     * 
     * @return Partenaire 
     */ 
     public function setUpdatedAt($updatedAt) 
     { 
      $this->updatedAt = $updatedAt; 

      return $this; 
     } 

     /** 
     * Get updatedAt 
     * 
     * @return \DateTime 
     */ 
     public function getUpdatedAt() 
     { 
      return $this->updatedAt; 
     } 
    } 

PartenaireAdmin:

<?php 
    namespace AppBundle\Admin; 

    use Sonata\AdminBundle\Admin\AbstractAdmin; 
    use Sonata\AdminBundle\Datagrid\ListMapper; 
    use Sonata\AdminBundle\Datagrid\DatagridMapper; 
    use Sonata\AdminBundle\Form\FormMapper; 
    use Vich\UploaderBundle\Form\Type\VichImageType; 
    use Ivory\CKEditorBundle\Form\Type\CKEditorType; 

    class PartenaireAdmin extends AbstractAdmin 
    { 
     protected function configureFormFields(FormMapper $formMapper) 
     { 
      $image = $this->getSubject();  
      $fileFieldOptions = array('required' => false); 
      if ($image && ($webPath = $image->getWebPath())) { 

       $fullPath = '/images/partenaires/'.$webPath; 

       // add a 'help' option containing the preview's img tag 
       $fileFieldOptions['help'] = '<img src="'.$fullPath.'" class="admin-preview" />'; 
      } 
      else 
      { 
       $fileFieldOptions['help'] = 'Ajouter une Image (4Mo max) (1100x700)'; 
      } 

      // $container = $this->getConfigurationPool()->getContainer(); 
      $formMapper 
      ->add('nom', 'text') 
      ->add('description', CKEditorType::class, array(
       'config' => array('toolbar' => 'full'), 
       )) 
      ->add('logoFichier', 'file', $fileFieldOptions); 
     } 

     protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
     { 
      $datagridMapper 
      ->add('nom'); 
     } 

     protected function configureListFields(ListMapper $listMapper) 
     { 
      $listMapper 
      ->addIdentifier('nom') 
      ->add('description', 'text') 
      ->add('logo','text'); 
     } 
    } 

回答

1

在你的配置中你有兩次「vich_uploader」刪除第一個並且會工作

0
  1. 第一件事 - 您使用VichUploaderBundle。該包的開發人員爲我們創建了稱爲VichImageType的FormType。因此,你應該在configureFormFields方法logoFichier聲明中使用它:

    use Vich\UploaderBundle\Form\Type\VichImageType; 
    use Vich\UploaderBundle\Templating\Helper\UploaderHelper as VichUploaderManager; 
    
    class PartenaireAdmin extends AbstractAdmin 
    { 
    
        protected function configureFormFields(FormMapper $formMapper) 
        { 
        // ... 
    
        ->add('logoFichier', VichImageType::class, $fileFieldOptions) 
    
  2. 關於幫助。我可以建議使用

    'help' => '<img src="'.$this->getVichUploaderManager()->asset($image, 'logoFichier').'" class="admin-preview" />' 
    
  3. 另外關於列表視圖。至於我 - 查看圖像的最簡單和最快的解決方案是爲圖像領域創建自定義模板。是的,我知道,這是不正確的做法,但我只是建議...

    ->add('imageFile', VichImageType::class, [ 
         'template' => 'AppBundle::Admin\..here_your_path..\name_of_your_template.html.twig', 
         'required'  => false, 
         'download_link' => false, 
        ]) 
    

    而且模板name_of_your_template.html.twig你可以把接下來的幾行內:

    {% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %} 
    
    {% block field %} 
        <div> 
          <img src="{{ vich_uploader_asset(object, 'logoFichier') }}" alt="" style=""/> 
        </div> 
    {% endblock %}