How to display the current picture above the upload field in SonataAdminBundle?

后端 未结 7 2046
广开言路
广开言路 2021-02-01 20:31

I am using SonataAdminBundle (with Doctrine2 ORM) and I have successfully added a file upload feature to my Picture model.

I would like, on the

相关标签:
7条回答
  • 2021-02-01 20:38

    You can easily do this on show page by template attribute pass on $showmapper

    ->add('picture', NULL, array(
        'template' => 'MyProjectBundle:Project:mytemplate.html.twig'
    );
    

    and inside your template you get current object so u can call get method and pull image path

    <th>{% block name %}{{ admin.trans(field_description.label) }}{% endblock %}</th>
    <td>
        <img src="{{ object.getFile }}" title="{{ object.getTitle }}" />
        </br>
        {% block field %}{{ value|nl2br }}{% endblock %}
    </td>
    

    To show image in edit mode you have to override fileType or you have to create your own customType on top of fileType

    There is also some bundle which is having this kind of functionality check out this GenemuFormBundle

    0 讨论(0)
  • 2021-02-01 20:40

    you can easily do this on edit page by helpers(FormMapper->setHelps) or option "help" pass on FormMapper

    protected function configureFormFields(FormMapper $formMapper) {
        $options = array('required' => false);
        if (($subject = $this->getSubject()) && $subject->getPhoto()) {
            $path = $subject->getPhotoWebPath();
            $options['help'] = '<img src="' . $path . '" />';
        }
    
        $formMapper
            ->add('title')
            ->add('description')
            ->add('createdAt', null, array('data' => new \DateTime()))
            ->add('photoFile', 'file', $options)
        ;
    }
    
    0 讨论(0)
  • 2021-02-01 20:46

    Teo.sk wrote the method of showing images using VichUploader. I found an option which allow you to show images without this bundle.

    First we need to create our form_type. There is tutorial: symfony_tutorial

    In main Admin class:

    namespace Your\Bundle;
    
    //.....//
    
    class ApplicationsAdmin extends Admin {
    
    //...//
    
    public function getFormTheme() {
        return array_merge(
            parent::getFormTheme(),
            array('YourBundle:Form:image_type.html.twig') //your path to form_type template
        );
    
    protected function configureFormFields(FormMapper $formMapper)
    {
         $formMapper->add('file_photo', 'image', array(
                'data_class' => 'Symfony\Component\HttpFoundation\File\File',
                'label' => 'Photo',
                'image_web_path' => $this->getRequest()->getBasePath().'/'.$subject->getWebPathPhoto()// it's a my name of common getWebPath method
            ))
            //....//
            ;
    }
    
    }
    

    Next part is a code from ImageType class.

    namespace Your\Bundle\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use Symfony\Component\OptionsResolver\Options;
    use Symfony\Component\Form\FormView;
    use Symfony\Component\Form\FormInterface;
    use Symfony\Component\Form\FormBuilder;
    use Symfony\Component\Form\FormBuilderInterface;
    
    
    class ImageType extends AbstractType
    {
    
        public function getParent()
        {
            return 'file';
        }
    
        public function getName()
        {
            return 'image';
        } 
    
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'image_web_path'         => ''
            ));
        }
    
        public function buildView(FormView $view, FormInterface $form, array $options)
        {
            $view->vars['image_web_path'] = $options['image_web_path'];
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                 ->setAttribute('image_web_path', $options['image_web_path'])
            ;
        }
    }
    

    And on the end time for image_type twig template.

    {% block image_widget %}
    {% spaceless %}
        {% set type = type|default('file') %}
        <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
        <img src="{{ image_web_path }}" alt="image_photo"/>
    {% endspaceless %}
    {% endblock %}
    

    For me it's working! I'm also using avalanche bundle to resize images.

    0 讨论(0)
  • 2021-02-01 20:47

    There is an easy way - but you will see the picture below the upload button. SonataAdmin lets put raw HTML into the ‘help’ option for any given form field. You can use this functionality to embed an image tag:

    protected function configureFormFields(FormMapper $formMapper) {
    
        $object = $this->getSubject();
    
        $container = $this->getConfigurationPool()->getContainer();
    
        $fullPath =     $container->get('request')->getBasePath().'/'.$object->getWebPath();
    
    
        $formMapper->add('file', 'file', array('help' => is_file($object->getAbsolutePath() . $object->getPlanPath()) ? '<img src="' . $fullPath . $object->getPlanPath() . '" class="admin-preview" />' : 'Picture is not avialable')
    
    }
    
    0 讨论(0)
  • 2021-02-01 20:56

    You can simple do by this way

        $image = $this->getSubject();
        $imageSmall = '';
    
        if($image){
            $container = $this->getConfigurationPool()->getContainer();
            $media = $container->get('sonata.media.twig.extension');
            $format = 'small';
            if($webPath = $image->getImageSmall()){
                $imageSmall = '<img src="'.$media->path($image->getImageSmall(), $format).'" class="admin-preview" />';
            }
        }
    
       $formMapper->add('imageSmall', 'sonata_media_type', array(
          'provider' => 'sonata.media.provider.image',
          'context' => 'default',
          'help' => $imageSmall
       ));
    
    0 讨论(0)
  • 2021-02-01 20:57

    I have managed to put the image above the field in the edit form. But my solution is a little bit specific, because I use Vich Uploader Bundle to handle uploads, so the generation of the image url was a little bit easier thanks to bundle helpers.

    Let's look at my example, a film poster field in a film entity. This is part of my admin class:

    //MyCompany/MyBundle/Admin/FilmAdmin.php
    
    class FilmAdmin extends Admin {
    
    protected function configureFormFields(FormMapper $formMapper)
    {
     $formMapper
         ->add('title')
     ....
         ->add('poster', 'mybundle_admin_image', array(
                    'required' => false,
                    ))
    }
    

    mybundle_admin_image is handled by a custom field type, that is just a child of file type by setting it's getParent method: (don't forget to register your type class as a service)

    //MyCompany/MyBundle/Form/Type/MyBundleAdminImageType.php
    
    public function getParent()
    {
        return 'file';
    }
    

    Then I have a template that extends Sonata's default styling, and I have it included in the admin class:

    //MyCompany/MyBundle/Admin/FilmAdmin.php
    
    public function getFormTheme() {
        return array('MyCompanyMyBundle:Form:mycompany_admin_fields.html.twig');
    }
    

    And finally I have a block for my custom image type that extends the basic file type:

    //MyCompany/MyBundle/Resources/views/Form/mycompany_admin_fields.html.twig
    
    {% block mybundle_admin_image_widget %}
    {% spaceless %}
        {% set subject =  form.parent.vars.value %}
        {% if subject.id and attribute(subject, name) %}
            <a href="{{ asset(vich_uploader_asset(subject, name)) }}" target="_blank">
                <img src="{{ asset(vich_uploader_asset(subject, name)) }}" width="200" />
            </a><br/>
        {% endif %}
        {% set type = type|default('file') %}
        <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %}/>
    {% endspaceless %}
    {% endblock %}
    

    This causes that a 200px wide preview of image (if exists) is shown above the upload field, linked to it's full size version opening in new tab. You can customize it as you want, e.g. adding a lightbox plugin.

    0 讨论(0)
提交回复
热议问题