SonataAdminBundle + AJAX рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб

рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рди рдХрд░рдиреЗ рдХреЗ 2 рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдЕрдкрдиреЗ рдХрд░реНрддрд╡реНрдп рдХреЗ рдХрд╛рд░рдг рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред рдХрд╛рд░реНрдп рдпрд╣ рдерд╛: рд╕рд╛рдЗрдЯ рдХреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднрд╛рдЧ рдореЗрдВ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдЕрдкрд▓реЛрдбрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬреЛ рдлреНрд░реЗрдордлрд╝реЙрд░реНрдХреЗ рд╕рд┐рдореНрдлрдиреА 2.3 рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред * + рд╕реЛрдирд╛рдЯрд╛рдЕрдорд┐рдирдмрдВрдбрд▓ред рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдореИрдВ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЛрдирд╛рдЯрд╛ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реЛрдирд╛рдЯрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрдХрд╛рдИ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдИ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдЗрдП рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ:

// MyFolder / MyBundle / рдЗрдХрд╛рдИ / рдирд╛рдо
<?php namespace MyFolder\MyBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; /** * Table * * @ORM\Table(name="table") * @ORM\Entity */ class Table { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id */ private $id; /** * @var string * * @ORM\Column(name="name", type="string", length=255, nullable=true) */ private $filePath; }     .   /: 


$ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдХрдВрд╕реЛрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд: рдЙрддреНрдкрдиреНрди: рд╕рдВрд╕реНрдерд╛рдПрдБ MyFolder / MyBundle / Entity / Name

рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдЬреЗрдирд░реЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реЛрдирд╛рдЯрд╛ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рддреЛ, рд╣рдорд╛рд░реА рд╕реЛрдирд╛рдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:

// MyFolder / MyBundle / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рдирд╛рдо
 <?php namespace MyFolder\MyBundle\Admin; use Sonata\AdminBundle\Admin\Admin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Show\ShowMapper; class NameAdmin extends Admin { protected function configureFormFields(FormMapper $formMapper) { $formMapper ->add('name'); } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('name') } protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('name') } } 


рд╣рдореЗрдВ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рд╣рдо рдПрдХ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд░реБрдХреЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВрдЧреЗ - github.com/weixiyen/jquery-filedrop ред рдпрд╣рд╛рдВ рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╛рдж рди рдХрд░реЗрдВ :)ред

So. рдордЬрд╝рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдЗрдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо MyBundle / Resources / view / Admin рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ (рдпрджрд┐ рдХреЛрдИ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдирд╛рдПрдВ, рдлрд┐рд░ рднреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдХрдо рд╣реЛрдЧреА) рдПрдХ twig рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ - sonata_admin_bmin_layout.html.twig рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:

// MyBundle / Resources / view / admin / sonata_admin_base_layout.html.twig
 {% extends 'SonataAdminBundle::standard_layout.html.twig' %} {% block stylesheets %} {{ parent() }} <link href="{{ asset('bundles/mybundle/css/admin/style.css') }}" rel="stylesheet" type="text/css" /> {% endblock %} {% block javascripts %} {{ parent() }} <script src="{{ asset('bundles/mybundle/js/admin/jquery.filedrop.js') }}"></script> <script src="{{ asset('bundles/mybundle/js/admin/js.fileDropBlock.js') }}"></script> <script src="{{ asset('bundles/mybundle/js/admin/js.fileLoadByDefault.js') }}"></script> <script src="{{ asset('bundles/mybundle/js/admin/init.js') }}"></script> {% endblock %} 


рдЬрдм рд╣рдо config.yml рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рд╕реЛрдирд╛рдЯрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
// app / config / config.yml
 sonata_admin: title: My Admin Panel templates: ## default global templates layout: MyFolderMyBundle:Admin:sonata_admin_base_layout.html.twig 


рддреЛ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛, рд╣рдордиреЗ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕реЛрдирд╛рдЯрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред рдЖрдк рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрди 4 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 <script src="{{ asset('bundles/mybundle/js/admin/jquery.filedrop.js') }}"></script> <script src="{{ asset('bundles/mybundle/js/admin/js.fileDropBlock.js') }}"></script> <script src="{{ asset('bundles/mybundle/js/admin/js.fileLoadByDefault.js') }}"></script> <script src="{{ asset('bundles/mybundle/js/admin/init.js') }}"></script> 


рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд╛рде рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рд╣рддреА рд╣реИрдВ:

MyBundle / Resources / public / js / admin / jquery.filedrop.js
MyBundle / Resources / public / js / admin / js.fileDropBlock.js
MyBundle / Resources / public / js / admin / js.fileLoadByDefault.js
MyBundle / рд╕рдВрд╕рд╛рдзрди / рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / js / admin / js.init.js.

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реЛрдЧрд╛, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ:

  1. js.fileDropBlock.js
  2. js.fileLoadByDefault.js
  3. init.js.


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ, 4 рдХреА рдкрд╣рд▓реА рдлрд╝рд╛рдЗрд▓ рд╣рдорд╛рд░реА рдкрд╣рд▓реЗ рд╕реЗ рдПрдХ рдЧреАрддрд╛ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╢рд░реНрдорд┐рдВрджрд╛ рди рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕рдВрдкрддреНрддрд┐ рдХрд░рддреЗ рд╣реИрдВред рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ

$ рдРрдк / рдХрдВрд╕реЛрд▓ рдПрд╕реЗрдЯреНрд╕: рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реЛрдиреЗ рдкрд░ рд╡реЗрдм -рд╕рд┐рдорд▓рд┐рдВрдХ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ , рдлрд┐рд░ рдЖрдкрдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдПрдХ рдкреНрд░рддрд┐ / рдмрдВрдбрд▓ / mybundle / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпрд╛ рдпрд╣ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ? рд╣рдордиреЗ рдзрд░рдирд╛ рджрд┐рдпрд╛ред рдЕрдм рдХреНрд░рдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рддреЛ, рдлрд╝рд╛рдЗрд▓ рдирдВрдмрд░ 1 (js.fileDropBlock.js) рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдб:

// MyBundle / Resources / public / js / admin / js.fileDropBlock.js
 function fileDropBlock(block, type) { var allowType = { 'img': ['image/jpeg', 'image/png', 'image/gif'] }; block.filedrop({ url: '/upload-file', # url         paramname: 'file', # .     name  input  fallbackid: 'upload_button', maxfiles: 1, # -  maxfilesize: 2, #    mb #   .      error: function (err, file) { switch (err) { case 'BrowserNotSupported': console.log('Old browser'); break; case 'FileTooLarge': console.log('File Too Large'); break; case 'TooManyFiles': console.log('Only 1 file can be downloader'); break; case 'FileTypeNotAllowed': console.log('Wrong file type'); break; default: console.log('Some error'); } }, allowedfiletypes: allowType[type], #      dragOver: function () { block.addClass('active-drag-block'); }, dragLeave: function () { block._removeClass('active-drag-block'); }, uploadFinished: function (i, file, response) { block.find('input[type="text"]').val(response.filePath); #       } }) } 


рдлрд╝рд╛рдЗрд▓ рдирдВрдмрд░ 2 (js.fileLoadByDefault.js) рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдб:
// MyBundle / Resources / public / js / admin / js.LoadByDefault.js

 var arrayType = { 'img': [ 'image/png', 'image/jpg', 'image/jpeg' ], 'pdf': [ 'application/pdf', 'application/x-pdf' ] }; function fileLoadByDefault(selector, type, block) { var input = document.getElementById(selector), formdata = false; input.click(); } 


рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ, рд╣реИ рдирд╛? рд╣рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЙрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИред рддреЛ, рдЕрдВрдд рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдирдВрдмрд░ 3 (init.js) рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдб:

// MyBundle / Resources / public / js / admin / init.js
 (function ($) { $(document).ready(function () { $.fn.uploadFile = function (type) { var blockText = { 'img': {'text': ['Drag Image File Here'], 'name': ['img'], 'id': ['imguploadform']} }; this.append('<p>' + blockText[type].text + '</p>'); this.append('<input type="file" class="upload-file" name="' + type + 'file" id="' + type + 'uploadform" data-type="'+ blockText[type].name +'">'); this.addClass('drag_n_drop--' + type + 'Path'); $('input', this).hide(); fileDropBlock(this, type); }; var imgBlock = $('div', 'div[id$="_coverPath"]'); imgBlock.uploadFile('img'); $('input[type="file"]').on("change", function () { var $_this = $(this), type = $_this.data('type'), reader, file; file = this.files[0]; if (window.FormData) { formdata = new FormData(); } if (window.FileReader) { reader = new FileReader(); reader.readAsDataURL(file); } if (formdata) { formdata.append("file", file); } if (!$.inArray(file.type, arrayType[type])) { $.ajax({ url: "/upload-file", type: "POST", data: formdata, processData: false, contentType: false, success: function (res) { var userData = jQuery.parseJSON(res); $_this.parent().find('input[type="text"]').val(userData.filePath); } }); } else { alert('Wrong type') } }); imgBlock.click(function () { fileLoadByDefault('imguploadform', 'img', this); }); }); })(jQuery); 


рдЖрдЗрдП рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рднрд╛рдЧреЛрдВ рдореЗрдВ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐ рдкреГрд╖реНрда рдХреЗрд╡рд▓ рдПрдХ рдЗрдирдкреБрдЯ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 $.fn.uploadFile = function (type) { var blockText = { 'img': { 'text': ['Drag Image File Here'], 'name': ['img'], 'id': ['imguploadform'] } }; this.append('<p>' + blockText[type].text + '</p>'); this.append('<input type="file" class="upload-file" name="' + type + 'file" id="' + type + 'uploadform" data-type="'+ blockText[type].name +'">'); this.addClass('drag_n_drop--' + type + 'Path'); $('input', this).hide(); fileDropBlock(this, type); }; 


рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рдЬреЛ рдПрдХ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓реЛрдб (рдбреНрд░реЙрдк) рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реМрдЯ рдЖрдпрд╛, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ HTML рдХреЛрдбред рдЬрд┐рд╕рдореЗрдВ рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрдЪреНрдЫреЗрдж рд╢рд╛рдорд┐рд▓ рд╣реИ:

 this.append('<p>' + blockText[type].text + '</p>'); 


рдбрд╛рдЙрдирд▓реЛрдб рдмрдЯрди, рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдПрдЧрд╛:

 this.append('<input type="file" class="upload-file" name="' + type + 'file" id="' + type + 'uploadform" data-type="'+ blockText[type].name +'">'); 


рддрддреНрд╡ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВред

 this.addClass('drag_n_drop--' + type + 'Path'); 


рдФрд░ рд╕рднреА рдЗрдирдкреБрдЯ рдЫрд┐рдкрд╛рдПрдБ:

 $('input', this).hide(); 


рд╕реАрдПрд╕рдПрд╕ рд░рдВрдЧ рдЬреЛрдбрд╝реЗрдВ:

// MyBundle / рд╕рдВрд╕рд╛рдзрди / рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / css / style.css
 .drag_n_drop--imgPath{ width: 150px; height: 100px; cursor: pointer; border: 2px solid #e0e0e0; background: #f9f9f9; } 


рдЕрдВрдд рдореЗрдВ, рдЗрди рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЫрд╡рд┐

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╕рдм рдареАрдХ рд╣реИред

Init.js рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЖрдЧреЗ

рдРрд╕рд╛ рдХреЛрдб:

 var imgBlock = $('div', 'div[id$="_name"]'); #        imgBlock.uploadFile('img'); #     uploadFile 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ:

 $('input[type="file"]').on("change", function () { #   ,     var $_this = $(this), type = $_this.data('type'), reader, file; file = this.files[0]; #      file if (window.FormData) { formdata = new FormData(); #   (     js) } if (window.FileReader) { reader = new FileReader(); #   reader.readAsDataURL(file); } if (formdata) { formdata.append("file", file); #     } if (!$.inArray(file.type, arrayType[type])) { #        $.ajax({ url: "/upload-file", #    type: "POST", data: formdata, #     processData: false, contentType: false, success: function (res) { var userData = jQuery.parseJSON(res); #   $_this.parent().find('input[type="text"]').val(userData.filePath); #              } }); } else { alert('Wrong type'); #   alert   } }); 


рдЕрдЧрд▓рд╛, рдХреЛрдб:

 imgBlock.click(function () { fileLoadByDefault('imguploadform', 'img', this); }); 


рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдЕрдкрдиреЗ рджрд┐рд╡рд╛ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдореЗрдВ рдЪрд┐рддреНрд░ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ fileLoadByDefault рдлрд╝рдВрдХреНрд╢рди рдХреЗ 3 рддрд░реНрдХ рд╣реИрдВред 1 - рдЖрдИрдбреА input'a рдкреНрд░рдХрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рдеред 2 - рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╛рдЗрд▓ рд╣рдо рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред 3 - рдореВрд▓ рддрддреНрд╡ рд╕реНрд╡рдпрдВ, рдЬрд┐рд╕ рдкрд░ рдХреНрд▓рд┐рдХ рд╣реБрдЖред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ, рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рдХреЛрдб рд▓реЛрдбрд┐рдВрдЧ рдХреЗ 2 рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк (рдЬреЛ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЕрдкрд▓реЛрдб рдбреАрдП рдлрд╛рдЗрд▓ рдХреЗ рдорд╛рдирдХ рд░реВрдк рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рджрд┐рд╡рд╛ рдкрд░ рдПрдХ рдХреНрд▓рд┐рдХ рд╣реИ, рдЬреЛ рдбреНрд░реВрдк рдПрдВрдб рдбреНрд░реЙрдк рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ 2 рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реИ, рдРрд╕рд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реИред

рдореИрдВ рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдХреЗрд╡рд▓ рдЖрдзрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ ... рдЖрдЧреЗ рдФрд░ рдЕрдзрд┐рдХ рдордЬрд╝рд╛, рдЕрдм рдЪрд▓реЛ php рдкрд░ рдЬрд╛рдПрдВ!

рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП [/ рдЕрдкрд▓реЛрдб-рдлрд╝рд╛рдЗрд▓] рд▓рд┐рдВрдХ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рдбреНрд░реЙрдк рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛред

рд╣рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

// MyFolder / MyBundle / Resourses / config / rounting.yml
 my_file_upload: pattern: /upload-file defaults: { _controller: MyFolderMyBundle:Default:uploadFile } 


[UploadFile] рд╡рд┐рдзрд┐ рдХреЗ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

// MyFolder / MuBundle / Contraller / Default.php
 <?php namespace MyFolder\MyBundle\Controller; use Symfony\Component\HttpFoundation\File\File; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\File\UploadedFile; class DefaultController extends Controller { public function uploadFileAction() { $filename = $_FILES['file']; #    $uploadPath = $this->upload($filename); #    /** *   .     */ return null === $uploadPath ? new Response(json_encode(array( 'status' => 0, 'message' => 'Wrong file type' ) ) ) : new Response(json_encode(array( 'status' => 1, 'message' => $filename, #   'filePath' => $uploadPath #     ) ) ); } private function getFoldersForUploadFile($type) { $fileType = $this->returnExistFileType($type); #       if ($fileType !== null) { return array( 'root_dir' => $this->container->getParameter('upload_' . $fileType . '_root_directory'), #       'dir' => $this->container->getParameter('upload_' . $fileType . '_directory'), #     ); } else { return null; } } #   ()     private function returnExistFileType($type) { $typeArray = array( 'img' => array( 'image/png', 'image/jpg', 'image/jpeg', ), 'pdf' => array( 'application/pdf', 'application/x-pdf', ) ); foreach ($typeArray as $key => $value) { if (in_array($type, $value)) { return $key; } } return null; } #     . ,  ,    private function upload($file) { $filePath = $this->getFoldersForUploadFile($file['type']); if (null === $this->getFileInfo($file['name']) || $filePath === null) { return null; } $pathInfo = $this->getFileInfo($file['name']); $path = $this->fileUniqueName() . '.' . $pathInfo['extension']; $this->uploadFileToFolder($file['tmp_name'], $path, $filePath['root_dir']); unset($file); return $filePath['dir'] . DIRECTORY_SEPARATOR . $path; } #       (    ) private function getFileInfo($file) { return $file !== null ? (array)pathinfo($file) : null; } #    private function fileUniqueName() { return sha1(uniqid(mt_rand(), true)); } #      private function uploadFileToFolder($tmpFile, $newFileName, $rootFolder) { $e = new File($tmpFile); $e->move($rootFolder, $newFileName); } 


рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рд╢реИрддрд╛рди рдЗрддрдирд╛ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ ... рд▓реЗрдХрд┐рди рдЖрдк, рдкреНрд░рд┐рдп рдкрд╛рдардХ, рдЕрдкрдиреЗ рд╕рд╡рд╛рд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдХреЛрдб рдкрд░ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдЕрдиреБрдХреВрд▓рдиред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рдЕрдкрдиреЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдпрд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЬрд▓реНрдж рд╣реА рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИред

PS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

// app / config / config.yml
 parameters: upload_img_root_directory: %kernel.root_dir%/../web/upload/img upload_img_directory: upload/img 


рдЕрдкрд▓реЛрдб рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ img рдлрд╝реЛрд▓реНрдбрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрдк рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рдЬреЛ рдпрд╣ рдХрд░реЗрдЧреА рдХрд┐ рдпреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рдЙрдирдХреЗ рд▓рд┐рдП рд░рд╛рдЗрдЯрд┐рдВрдЧ рдкрд░рдорд┐рд╢рди рд░рдЦрдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред

Source: https://habr.com/ru/post/In199482/


All Articles