рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рди рдХрд░рдиреЗ рдХреЗ 2 рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдЕрдкрдиреЗ рдХрд░реНрддрд╡реНрдп рдХреЗ рдХрд╛рд░рдг рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛ред рдХрд╛рд░реНрдп рдпрд╣ рдерд╛: рд╕рд╛рдЗрдЯ рдХреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рднрд╛рдЧ рдореЗрдВ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдЕрдкрд▓реЛрдбрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬреЛ рдлреНрд░реЗрдордлрд╝реЙрд░реНрдХреЗ рд╕рд┐рдореНрдлрдиреА 2.3 рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред * + рд╕реЛрдирд╛рдЯрд╛рдЕрдорд┐рдирдмрдВрдбрд▓ред рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдореИрдВ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЛрдирд╛рдЯрд╛ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рднрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реЛрдирд╛рдЯрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрдХрд╛рдИ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдИ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдЗрдП рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ:
// MyFolder / MyBundle / рдЗрдХрд╛рдИ / рдирд╛рдо
<?php namespace MyFolder\MyBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Validator\Constraints as Assert; class Table { private $id; 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:
рддреЛ рд╣рдордиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛, рд╣рдордиреЗ рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕реЛрдирд╛рдЯрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред рдЖрдк рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрди 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.
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реЛрдЧрд╛, рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдБ:
- js.fileDropBlock.js
- js.fileLoadByDefault.js
- 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'];
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рд╢реИрддрд╛рди рдЗрддрдирд╛ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдореИрдВ рдХреБрдЫ рдмрд┐рдВрджреБ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ ... рд▓реЗрдХрд┐рди рдЖрдк, рдкреНрд░рд┐рдп рдкрд╛рдардХ, рдЕрдкрдиреЗ рд╕рд╡рд╛рд▓ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ, рдХреЛрдб рдкрд░ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рдЕрдиреБрдХреВрд▓рдиред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рд╕рд┐рдореНрдлрдиреА рдореЗрдВ рдЕрдкрдиреЗ рдмреВрдЯрд▓реЛрдбрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджрд┐рдЦрд╛рдпрд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рд╕реЗрд╡рд╛ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЬрд▓реНрдж рд╣реА рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рдХрд╣рд╛рдиреА рд╣реИред
PS рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ
// app / config / config.yml
parameters: upload_img_root_directory: %kernel.root_dir%/../web/upload/img upload_img_directory: upload/img
рдЕрдкрд▓реЛрдб рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ img рдлрд╝реЛрд▓реНрдбрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЖрдк рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рдЬреЛ рдпрд╣ рдХрд░реЗрдЧреА рдХрд┐ рдпреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рдЙрдирдХреЗ рд▓рд┐рдП рд░рд╛рдЗрдЯрд┐рдВрдЧ рдкрд░рдорд┐рд╢рди рд░рдЦрдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред