media-bundle icon indicating copy to clipboard operation
media-bundle copied to clipboard

How to link a document to a .pdf file + filter on extension

Open nicolas-bastien opened this issue 10 years ago • 11 comments

Hi,

I spent time reading the doc and looking at the sandbox and right now I found how to link my document to an image with a 'cmf_media_image' form type but nothing for simple file.

When I try to use a file form type i have this error : * The form's view data is expected to be an instance of class Symfony\Component\HttpFoundation\File\File, but is an instance of class PHPCRProxies__CG__\Symfony\Cmf\Bundle\MediaBundle\Doctrine\Phpcr\File. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms an instance of class PHPCRProxies__CG__\Symfony\Cmf\Bundle\MediaBundle\Doctrine\Phpcr\File to an instance of Symfony\Component\HttpFoundation\File\File. *

I need this to have a downloadable pdf file and a video.

I don't understand why there is no 'cmf_media_file' form type ?

And is there a way to limit to a list of file extension ?

Thanks a lot

Nico

nicolas-bastien avatar Apr 14 '14 13:04 nicolas-bastien

indeed i think we miss a cmf media FileType that would look very similar (and probably can share code with) ImageType. do you want to have a look at what we do for the image and try to generalize that to handle plain files?

we already have the FileController with downloadAction - i guess that should have a viewAction that omits the Content-Disposition so the file can be viewed in a browser directly (again without duplicating all the code there)

for the file extensions, that would be a general symfony question. i found nothing here http://symfony.com/doc/current/reference/forms/types/file.html this is a whole can of worms, as you have both the mime type and the extension to worry about, and in general can not trust the client to respect things. but i propose you discuss that in the core symfony channels as its not related specifically to the cmf.

@rmsint do you have inputs for nicolas?

dbu avatar Apr 15 '14 11:04 dbu

Ok David thanks for your answer.

So just to be sure, the first line of the mediabundle doc say :

Media can be images, binary documents (like pdf files), embedded movies, uploaded movies, MP3s, etc.

So you confirm than right now only images works ?

Did somebody already try to use SonataMedia with the CMF ?

Thanks a lot

nicolas-bastien avatar Apr 16 '14 09:04 nicolas-bastien

Hey Nicolas,

Underneath some inputs from my side, hope it helps you further. (It is some time ago I worked with Symfony, so my knowledge may be a bit rusty.)

Form Type For a file upload you can use the symfony file form type. After that persist it to phpcr using the Symfony\Cmf\Bundle\MediaBundle\File\UploadFileHelperDoctrine:handleUploadedFile. See the webtest/demo app for an example: https://github.com/symfony-cmf/MediaBundle/blob/master/Tests/Resources/Controller/PhpcrFileTestController.php#L58

Of course you can make it easier, fe. to use with sonata admin, by creating a form type cmf_media_file that puts the last step in a transformer. Actually, the transformer Symfony\Cmf\Bundle\MediaBundle\Form\DataTransformer\ModelToFileTransformer is already handling files and images, so it is just a matter of creating the form type. You can also control then how an uploaded file is rendered, fe. you maybe want to display the filename and filesize and/or a thumnail for your pdf. If it is that generic, and more people can benefit, you could do a PR?

Here a the steps and links how this is done for the cmf_media_image:

  • the cmf_media_image form type extends the Symfony file type, see https://github.com/symfony-cmf/MediaBundle/blob/master/Form/Type/ImageType.php#L42
    • the ModelToFileTransformer is configured in the buildForm method, it helps you to persist to phpcr. It accepts
    • notice some configuration params, about imagine, being forwarded to the template
  • the ModelToFileTransformer createa a FileInterface object, PR https://github.com/symfony-cmf/MediaBundle/pull/82 adds to also use the Symfony\Cmf\Bundle\MediaBundle\File\UploadFileHelperDoctrine:handleUploadedFile here
  • a custom twig widget does some image rendering, see https://github.com/symfony-cmf/MediaBundle/blob/master/Resources/views/Form/fields.html.twig
    • in this widget an imagine filter is being used, however you can also use fe. a download url in your widget. You can then use the twig function cmf_media_download_url, see Symfony\Cmf\Bundle\MediaBundle\Twig\Extension\CmfMediaExtension and Symfony\Cmf\Bundle\MediaBundle\Templating\Helper\CmfMediaHelper

See also https://github.com/symfony-cmf/symfony-cmf/wiki/Media, it describes some ideas we had before writing this bundle. If I remember correctly there has been some discussion about a PDF having a preview image, there should be a note about this.

File extensions If the file extensions are important to your application you can add some guards to your model. Fe. a PDF file that only accepts the pdf extension. You could use the symfony validation and/or add guards directly in the model for the content setters. Whatever suits your app best I would say. Symfony has already some code to map between mime-types and extensions, see https://github.com/symfony/HttpFoundation/blob/master/File/UploadedFile.php#L173.

rmsint avatar Apr 16 '14 09:04 rmsint

thanks a lot for the inputs roel.

regarding mime-types, see also #77

dbu avatar Apr 16 '14 11:04 dbu

@nicolas-bastien, for me: yes and no. No with the CmfMediaBundle. Yes, before this bundle existed I had an integration working with SonataMedia and the CMF. I think now 70% of the work is done for integrating with SonataMedia. The Gaufrette adapter is created to do the heavy lifting of the integration with SonataMediaBundle. I expect most work needs to be done in the SonataMediaBundle, and maybe some bugfixes in the CmfMediaBundle.

rmsint avatar Apr 16 '14 14:04 rmsint

Hi, thanks so much for your answers.

I will do that next week. I need to make it work on my project before the end of april. Then I'll help improving the bundle.

Thanks again for your help

Nico

On 16 April 2014 16:12, Roel Sint [email protected] wrote:

@nicolas-bastien https://github.com/nicolas-bastien, for me: yes and no. No with the CmfMediaBundle. Yes, before this bundle existed I had an integration working with SonataMedia and the CMF. I think now 70% of the work is done for integrating with SonataMedia. The Gaufrette adapter is created to do the heavy lifting of the integration with SonataMediaBundle. I expect most work needs to be done in the SonataMediaBundle, and maybe some bugfixes in the CmfMediaBundle.

— Reply to this email directly or view it on GitHubhttps://github.com/symfony-cmf/MediaBundle/issues/99#issuecomment-40603208 .

nicolas-bastien avatar Apr 18 '14 07:04 nicolas-bastien

@nicolas-bastien see https://github.com/sonata-project/SonataMediaBundle/issues/509. Another discussion to pickup integration with SonataMediaBundle

rmsint avatar Apr 23 '14 16:04 rmsint

do we need to do anything on the cmf side?

dbu avatar May 08 '14 15:05 dbu

Hi,

So thanks to your help I managed to make a file input field. One problem is that every time I update my document the file (like the image) field is deleted.

To correct that I made a custom admin and use a sonata_type_admin.

So my media solution is not really great, I'll come back when something will be working.

Nico

On 8 May 2014 17:45, David Buchmann [email protected] wrote:

do we need to do anything on the cmf side?

— Reply to this email directly or view it on GitHubhttps://github.com/symfony-cmf/MediaBundle/issues/99#issuecomment-42566259 .

nicolas-bastien avatar May 13 '14 08:05 nicolas-bastien

you did see that our models check if the file is being set to null and in that case do not remove the child?

dbu avatar May 13 '14 11:05 dbu

ping @nicolas-bastien

dbu avatar Oct 21 '14 15:10 dbu