{"id":199482,"date":"2013-10-29T16:25:03","date_gmt":"2013-10-29T12:25:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=199482"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=199482","title":{"rendered":"<span class=\"post_title\">SonataAdminBundle + AJAX \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c 2 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u043e \u0434\u043e\u043b\u0433\u0443 \u0441\u043b\u0443\u0436\u0431\u044b \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u043e\u044f\u043b\u0430 \u0442\u0430\u043a\u0430\u044f: \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c Drag &#038; Drop \u0437\u0430\u043a\u0430\u0447\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0434\u043c\u0438\u043d \u0447\u0430\u0441\u0442\u0438 \u0441\u0430\u0439\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 framefork\u2019e Symfony 2.3.* + SonataAdminBundle. \u041f\u043e \u0440\u044f\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u044f \u043e\u043f\u0443\u0441\u043a\u0430\u044e \u0442\u0443 \u0447\u0430\u0441\u0442\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0421\u043e\u043d\u0430\u0442\u0430 \u0441\u0442\u0430\u0432\u0438\u043b\u0430\u0441\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b). \u0418\u0442\u0430\u043a, \u044f \u043f\u043e\u043b\u0430\u0433\u0430\u044e \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0421\u043e\u043d\u0430\u0442\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 Entity. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435\u0442, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e. \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442:<br \/>  <a name=\"habracut\"><\/a><br \/>  \/\/ MyFolder\/MyBundle\/Entity\/Name  <\/p>\n<pre><code class=\"php\">&lt;?php namespace MyFolder\\MyBundle\\Entity;   use Doctrine\\ORM\\Mapping as ORM; use Symfony\\Component\\Validator\\Constraints as Assert;   \/**  * Table  *  * @ORM\\Table(name=&quot;table&quot;)  * @ORM\\Entity  *\/ class Table {     \/**      * @var integer      *      * @ORM\\Column(name=&quot;id&quot;, type=&quot;integer&quot;)      * @ORM\\Id      *\/     private $id;       \/**      * @var string      *      * @ORM\\Column(name=&quot;name&quot;, type=&quot;string&quot;, length=255, nullable=true)      *\/     private $filePath; }   \u0414\u0430\u043b\u0435\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u043c \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435\/\u043a\u043e\u043d\u0441\u043e\u043b\u0438: <\/code><\/pre>\n<p>  <b>$ app\/console doctrine:generate:entities MyFolder\/MyBundle\/Entity\/Name<\/b><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b, \u043c\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0421\u043e\u043d\u0430\u0442\u0435. \u0418\u0442\u0430\u043a, \u043a\u043e\u0434, \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043e\u043d\u0430\u0442\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<p>  \/\/ MyFolder\/MyBundle\/Admin\/Name  <\/p>\n<pre><code class=\"php\">&lt;?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             -&gt;add('name');     }       protected function configureDatagridFilters(DatagridMapper $datagridMapper)     {         $datagridMapper             -&gt;add('name')     }       protected function configureListFields(ListMapper $listMapper)     {         $listMapper             -&gt;addIdentifier('name')     } } <\/code><\/pre>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u0442\u0443\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u041d\u0430 \u043c\u0438\u043d\u0443\u0442\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f, \u0438 \u043f\u043e\u0439\u0434\u0435\u043c \u043f\u043e \u044d\u0442\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435 \u2014 <a href=\"https:\/\/github.com\/weixiyen\/jquery-filedrop\">github.com\/weixiyen\/jquery-filedrop<\/a>. \u0422\u0443\u0442 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0442\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d js \u0444\u0430\u0439\u043b, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u043c\u0430\u0445\u043d\u0435\u0442\u0435\u0441\u044c :).<\/p>\n<p>  \u0418\u0442\u0430\u043a. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u0438\u0431\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c Drag &#038; Drop, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435, \u0432 \u043f\u0430\u043f\u043a\u0435 MyBundle\/Resources\/view\/Admin (\u0415\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043d\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435, \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u0442\u043e\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442) \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u0438\u043a \u0448\u0430\u0431\u043b\u043e\u043d\u0430 twig \u2014 sonata_admin_base_layout.html.twig \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c:<\/p>\n<p>  \/\/ MyBundle\/Resources\/view\/Admin\/sonata_admin_base_layout.html.twig  <\/p>\n<pre><code class=\"php\">{% extends 'SonataAdminBundle::standard_layout.html.twig' %}   {% block stylesheets %}     {{ parent() }}     &lt;link href=&quot;{{ asset('bundles\/mybundle\/css\/admin\/style.css') }}&quot; rel=&quot;stylesheet&quot; type=&quot;text\/css&quot; \/&gt; {% endblock %}   {% block javascripts %}     {{ parent() }}     &lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/jquery.filedrop.js') }}&quot;&gt;&lt;\/script&gt;     &lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/js.fileDropBlock.js') }}&quot;&gt;&lt;\/script&gt;     &lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/js.fileLoadByDefault.js') }}&quot;&gt;&lt;\/script&gt;     &lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/init.js') }}&quot;&gt;&lt;\/script&gt; {% endblock %} <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0438\u0434\u0435\u043c \u0432 config.yml \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u043d\u0430\u0442\u044b<br \/>  \/\/ app\/config\/config.yml  <\/p>\n<pre><code class=\"php\">sonata_admin:     title: My Admin Panel     templates:         ## default global templates         layout:  MyFolderMyBundle:Admin:sonata_admin_base_layout.html.twig <\/code><\/pre>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438, \u043c\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0441\u043e\u043d\u0430\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u043d\u0435\u0433\u043e. \u0412\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u043e\u0442 \u044d\u0442\u0438 4 \u0441\u0442\u0440\u043e\u0447\u043a\u0438:<\/p>\n<pre><code class=\"html\">&lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/jquery.filedrop.js') }}&quot;&gt;&lt;\/script&gt; &lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/js.fileDropBlock.js') }}&quot;&gt;&lt;\/script&gt; &lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/js.fileLoadByDefault.js') }}&quot;&gt;&lt;\/script&gt; &lt;script src=&quot;{{ asset('bundles\/mybundle\/js\/admin\/init.js') }}&quot;&gt;&lt;\/script&gt; <\/code><\/pre>\n<p>  \u042d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0436\u0438\u0432\u0443\u0442 \u0443 \u043d\u0430\u0441 \u043f\u043e \u0442\u0430\u043a\u043e\u043c \u043f\u0443\u0442\u0438:<\/p>\n<p>  MyBundle\/Resources\/public\/js\/admin\/jquery.filedrop.js<br \/>  MyBundle\/Resources\/public\/js\/admin\/js.fileDropBlock.js<br \/>  MyBundle\/Resources\/public\/js\/admin\/js.fileLoadByDefault.js<br \/>  MyBundle\/Resources\/public\/js\/admin\/js.init.js.<\/p>\n<p>  \u041d\u0430 \u0437\u0430\u043c\u0435\u0442\u043a\u0443, \u0447\u0442\u043e \u0431\u044b \u0432\u0441\u0435 \u0431\u044b\u043b\u043e \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c\u0443, \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 public \u043f\u0430\u043f\u043a\u0443 admin \u0432 \u043d\u0435\u0439 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b:<\/p>\n<ol>\n<li>js.fileDropBlock.js<\/li>\n<li>js.fileLoadByDefault.js<\/li>\n<li>init.js.<\/li>\n<\/ol>\n<p>  \u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u0438\u0437 4 \u044d\u0442\u043e \u043d\u0430\u0448 \u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0441 \u0433\u0438\u0442\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0435\u043c\u0441\u044f \u0438 \u043a\u0438\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 admin, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043b\u0430\u0435\u043c assets. \u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0435 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u043c<\/p>\n<p>  <b>$ app\/console assets:install www &#8212;symlink<\/b> \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u0443 \u0432\u0430\u0441 \u0432 \u043f\u0430\u043f\u043a\u0435 \/bundle\/mybundle\/ \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u043f\u0438\u044f \u0432\u0430\u0448\u0435\u0439 \u043f\u0430\u043f\u043a\u0438 public, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c? \u041f\u043e\u0433\u043d\u0430\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043e \u043a\u0430\u0436\u0434\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u0418\u0442\u0430\u043a, \u0444\u0430\u0439\u043b \u21161(js.fileDropBlock.js) \u0438 \u0435\u0433\u043e \u043a\u043e\u0434:<\/p>\n<p>  \/\/ MyBundle\/Resources\/public\/js\/admin\/js.fileDropBlock.js  <\/p>\n<pre><code class=\"javascript\">function fileDropBlock(block, type) {     var allowType = {         'img': ['image\/jpeg', 'image\/png', 'image\/gif']     };       block.filedrop({         url: '\/upload-file', # url \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438         paramname: 'file', # \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440. \u041f\u043e \u0441\u0443\u0442\u0438 \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 name \u0432\u0430\u0448\u0435\u0433\u043e input \u043f\u043e\u043b\u044f         fallbackid: 'upload_button',          maxfiles: 1, # \u043a\u043e\u043b-\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432         maxfilesize: 2, # \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u0432 mb   # \u0420\u0435\u0430\u043a\u0446\u0438\u044f \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438. \u0422\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e         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], # \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438         dragOver: function () {             block.addClass('active-drag-block');         },         dragLeave: function () {             block._removeClass('active-drag-block');         },             uploadFinished: function (i, file, response) {             block.find('input[type=&quot;text&quot;]').val(response.filePath); # \u0432 \u0438\u043d\u043f\u0443\u0442 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443         }     }) } <\/code><\/pre>\n<p>  \u0444\u0430\u0439\u043b \u21162(js.fileLoadByDefault.js) \u0438 \u0435\u0433\u043e \u043a\u043e\u0434:<br \/>  \/\/ MyBundle\/Resources\/public\/js\/admin\/js.LoadByDefault.js<\/p>\n<pre><code class=\"javascript\">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(); } <\/code><\/pre>\n<p>  \u041d\u0435 \u043c\u043d\u043e\u0433\u043e, \u043d\u0435 \u043f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438? \u041e\u043d \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u0418\u0442\u0430\u043a, \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b \u043f\u043e\u0434 \u043d\u043e\u043c\u0435\u0440\u043e\u043c 3 (init.js) \u0438 \u0435\u0433\u043e \u043a\u043e\u0434:<\/p>\n<p>  \/\/ MyBundle\/Resources\/public\/js\/admin\/init.js  <\/p>\n<pre><code class=\"javascript\">(function ($) {     $(document).ready(function () {         $.fn.uploadFile = function (type) {             var blockText = {                 'img': {'text': ['Drag Image File Here'], 'name': ['img'], 'id': ['imguploadform']}             };               this.append('&lt;p&gt;' + blockText[type].text + '&lt;\/p&gt;');             this.append('&lt;input type=&quot;file&quot; class=&quot;upload-file&quot; name=&quot;' + type + 'file&quot; id=&quot;' + type + 'uploadform&quot; data-type=&quot;'+ blockText[type].name +'&quot;&gt;');             this.addClass('drag_n_drop--' + type + 'Path');             $('input', this).hide();               fileDropBlock(this, type);         };           var imgBlock = $('div', 'div[id$=&quot;_coverPath&quot;]');         imgBlock.uploadFile('img');           $('input[type=&quot;file&quot;]').on(&quot;change&quot;, 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(&quot;file&quot;, file);             }               if (!$.inArray(file.type, arrayType[type])) {                 $.ajax({                     url: &quot;\/upload-file&quot;,                     type: &quot;POST&quot;,                     data: formdata,                     processData: false,                     contentType: false,                     success: function (res) {                         var userData = jQuery.parseJSON(res);                         $_this.parent().find('input[type=&quot;text&quot;]').val(userData.filePath);                     }                 });             } else {                 alert('Wrong type')             }         });           imgBlock.click(function () {             fileLoadByDefault('imguploadform', 'img', this);         });     }); })(jQuery); <\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u043c \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u043e\u0434 \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c. \u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0438\u043c\u0435\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u043d\u043f\u0443\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u043b\u044f Drag &#038; Drop\u2019a.<\/p>\n<pre><code class=\"javascript\">$.fn.uploadFile = function (type) {     var blockText = {         'img': {             'text': ['Drag Image File Here'],              'name': ['img'],              'id': ['imguploadform']         }     };       this.append('&lt;p&gt;' + blockText[type].text + '&lt;\/p&gt;');     this.append('&lt;input type=&quot;file&quot; class=&quot;upload-file&quot; name=&quot;' + type + 'file&quot; id=&quot;' + type + 'uploadform&quot; data-type=&quot;'+ blockText[type].name +'&quot;&gt;');     this.addClass('drag_n_drop--' + type + 'Path');     $('input', this).hide();       fileDropBlock(this, type); }; <\/code><\/pre>\n<p>  \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0438\u043f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0434\u0438\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c (\u0431\u0440\u043e\u0441\u0430\u0442\u044c) \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u044f\u043b\u0430 \u0435\u0433\u043e \u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043d\u0430\u043c, \u043f\u043e \u0441\u0443\u0442\u0438 \u0443\u0436\u0435 \u043d\u043e\u0432\u044b\u0439 html \u043a\u043e\u0434. \u041a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0430\u0431\u0440\u0430\u0446 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c:<\/p>\n<pre><code class=\"javascript\">this.append('&lt;p&gt;' + blockText[type].text + '&lt;\/p&gt;'); <\/code><\/pre>\n<p>  \u041a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043e\u043d\u0430 \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0435 \u0441\u044b\u0433\u0440\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u0443\u044e \u0440\u043e\u043b\u044c:<\/p>\n<pre><code class=\"javascript\">this.append('&lt;input type=&quot;file&quot; class=&quot;upload-file&quot; name=&quot;' + type + 'file&quot; id=&quot;' + type + 'uploadform&quot; data-type=&quot;'+ blockText[type].name +'&quot;&gt;'); <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043a\u043b\u0430\u0441\u0441, \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043e\u043d<\/p>\n<pre><code class=\"javascript\">this.addClass('drag_n_drop--' + type + 'Path'); <\/code><\/pre>\n<p>  \u0418 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0438\u043d\u043f\u0443\u0442\u044b:<\/p>\n<pre><code class=\"javascript\">$('input', this).hide(); <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u0440\u0430\u0441\u043e\u043a css:<\/p>\n<p>  \/\/ MyBundle\/Resources\/public\/css\/style.css  <\/p>\n<pre><code class=\"css\">.drag_n_drop--imgPath{     width: 150px;     height: 100px;     cursor: pointer;     border: 2px solid #e0e0e0;     background: #f9f9f9; } <\/code><\/pre>\n<p>  \u0412 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u0442\u0430\u043a\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439, \u0443 \u0432\u0430\u0441 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 \u044d\u0442\u043e<br \/>  <img decoding=\"async\" src=\"http:\/\/d1zjcuqflbd5k.cloudfront.net\/files\/acc_115810\/DZMv?response-content-disposition=inline;%20filename=Screen%20Shot%202013-08-03%20at%2010.36.53%20PM.png;%20filename*=UTF-8%27%27Screen%20Shot%202013-08-03%20at%2010.36.53%20PM.png&amp;Expires=1382993282&amp;Signature=gFRDunJ5pfM4AKQFcrdYgvU0JU0RXlpIswR-jUb0GbR6ub1MDKKm4DUTIyZCz2FnJmTYe07vh1QAf0cBZTtwmzRsSSmDffAkveM9Wjc46yq1rXpzHVSN7W~iEVkLcUhWA0mjt1ii9UYw9rmne2KoCAEpoXR529AJ5hulxDZsnSE_&amp;Key-Pair-Id=APKAJTEIOJM3LSMN33SA\" alt=\"image\"\/><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0442\u0430\u043a \u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0444\u0430\u0439\u043b\u0443 init.js<\/p>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"javascript\">var imgBlock = $('div', 'div[id$=&quot;_name&quot;]'); # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0446\u0435\u043b\u044b\u0439 \u0434\u0438\u0432 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0448 \u0438\u043d\u043f\u0443\u0442 imgBlock.uploadFile('img'); # \u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e uploadFile <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"javascript\">$('input[type=&quot;file&quot;]').on(&quot;change&quot;, function () { # \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u0438\u043d\u043f\u0443\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c     var $_this = $(this),         type = $_this.data('type'),         reader,         file;     file = this.files[0]; # \u043b\u043e\u0432\u0438\u043c \u0444\u0430\u0439\u043b \u0438\u0437 \u0438\u043d\u043f\u0443\u0442\u0430 \u0442\u0438\u043f\u0430 file       if (window.FormData) {         formdata = new FormData(); # \u0431\u0435\u0440\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 (\u044d\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u043f\u043b\u044e\u0448\u043a\u0438 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 js)     }       if (window.FileReader) {         reader = new FileReader(); # \u0447\u0438\u0442\u0430\u0435\u043c \u0444\u0430\u0439\u043b         reader.readAsDataURL(file);     }       if (formdata) {         formdata.append(&quot;file&quot;, file); # \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0435\u043d\u0438\u044f\u043c \u0444\u0430\u0439\u043b \u0432 \u043e\u0431\u044a\u0435\u043a\u0442     }       if (!$.inArray(file.type, arrayType[type])) { # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u043c \u043d\u0430\u0434\u043e         $.ajax({             url: &quot;\/upload-file&quot;, # \u0438\u0434\u0435\u043c \u043f\u043e \u043f\u0443\u0442\u0438             type: &quot;POST&quot;,              data: formdata, # \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0443\u0434\u0430 \u043d\u0430\u0448\u0438 \u0444\u0430\u0439\u043b\u044b             processData: false,             contentType: false,             success: function (res) {                 var userData = jQuery.parseJSON(res); # \u043f\u0430\u0440\u0441\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442                 $_this.parent().find('input[type=&quot;text&quot;]').val(userData.filePath); # \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430\u0448 \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u043f\u0443\u0442 \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0432 \u043d\u0435\u0433\u043e \u043f\u0443\u0442\u044c \u043a \u0443\u0436\u0435 \u0437\u0430\u043a\u0430\u0447\u0435\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443             }         });     } else {         alert('Wrong type'); # \u0430 \u0438\u043d\u0430\u0447\u0435 alert \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439     } }); <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u043a\u043e\u0434:<\/p>\n<pre><code class=\"javascript\">imgBlock.click(function () {     fileLoadByDefault('imguploadform', 'img', this); }); <\/code><\/pre>\n<p>  \u0422\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043f\u043e \u043d\u0430\u0448\u0435\u043c\u0443 \u0434\u0438\u0432\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0431\u0440\u043e\u0441\u0430\u043d\u0438\u044f \u0432 \u043d\u0435\u0433\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f fileLoadByDefault \u0432 \u043d\u0435\u0439 3 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. 1 \u2014 id input\u2019a \u0441 \u0442\u0438\u043f\u043e\u043c file. 2 \u2014 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c. 3 \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c \u044d\u043b\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u043a\u043b\u0438\u043a.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0442 \u0442\u0443\u0442, \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0433 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u043d\u0430\u0448 \u043a\u043e\u0434, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 2 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041f\u0435\u0440\u0432\u044b\u0439 \u2014 Drag &#038; Drop(\u0442\u043e \u043a \u0447\u0435\u043c\u0443 \u0438 \u0441\u0442\u0440\u0438\u043c\u0438\u043b\u0438\u0441\u044c), \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u044d\u0442\u043e \u043a\u043b\u0438\u043a \u043f\u043e \u0434\u0438\u0432\u0443 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u044b upload\u2019a \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0442\u043e \u0434\u043b\u044f Drup&#038;Drop. \u041f\u043e \u0441\u0443\u0442\u0438 2 \u2014 \u044d\u0442\u043e \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442.<\/p>\n<p>  \u041d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u0430\u0441 \u043e\u0433\u043e\u0440\u0447\u0430\u0442\u044c, \u043d\u043e \u043c\u044b \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0440\u0430\u0431\u043e\u0442\u044b\u2026 \u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u0435\u0441\u0435\u043b\u0435\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u043e\u0434\u0438\u043c \u043d\u0430 php?!<\/p>\n<p>  \u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0441\u0441\u044b\u043b\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0443 [\/upload-file] \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438, \u0431\u0443\u0434\u044c \u0442\u043e Drop \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u043f\u0440\u044f\u043c\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430.<\/p>\n<p>  \u041d\u0430\u0434\u043e \u043d\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0440\u043e\u0443\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043b\u0430:<\/p>\n<p>  \/\/ MyFolder\/MyBundle\/Resourses\/config\/rounting.yml  <\/p>\n<pre><code class=\"php\">my_file_upload:     pattern:  \/upload-file     defaults: { _controller: MyFolderMyBundle:Default:uploadFile } <\/code><\/pre>\n<p>  \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430 [uploadFile]:<\/p>\n<p>  \/\/ MyFolder\/MuBundle\/Contraller\/Default.php  <\/p>\n<pre><code class=\"php\">&lt;?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']; # \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430\u0448 \u0444\u0430\u0439\u043b         $uploadPath = $this-&gt;upload($filename); # \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438           \/**           * \u0422\u0443\u0442 \u0434\u0443\u043c\u0430\u044e \u044f\u0441\u043d\u043e. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441           *\/         return null === $uploadPath             ? new Response(json_encode(array(                         'status' =&gt; 0,                         'message' =&gt; 'Wrong file type'                     )                 )             )               : new Response(json_encode(array(                         'status' =&gt; 1,                         'message' =&gt; $filename, # \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430                         'filePath' =&gt; $uploadPath # \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443                     )                 )             );     }         private function getFoldersForUploadFile($type)     {         $fileType = $this-&gt;returnExistFileType($type); #\u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u044e\u0439 \u0442\u0438\u043f \u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0433\u0440\u0443\u0437\u0438\u0442\u044c           if ($fileType !== null) {             return array(                 'root_dir' =&gt; $this-&gt;container-&gt;getParameter('upload_' . $fileType . '_root_directory'), # \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439                 'dir' =&gt; $this-&gt;container-&gt;getParameter('upload_' . $fileType . '_directory'), # \u043e\u0442\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435             );         } else {             return null;         }     }       # \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043b\u044e\u0447(\u0442\u0438\u043f) \u0444\u0430\u0439\u043b\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f     private function returnExistFileType($type)     {         $typeArray = array(             'img' =&gt; array(                 'image\/png',                 'image\/jpg',                 'image\/jpeg',             ),             'pdf' =&gt; array(                 'application\/pdf',                 'application\/x-pdf',             )         );           foreach ($typeArray as $key =&gt; $value) {             if (in_array($type, $value)) {                 return $key;             }         }           return null;     }       # \u0422\u0443\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0441\u0435 \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430, \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043f\u043a\u0443     private function upload($file)     {         $filePath = $this-&gt;getFoldersForUploadFile($file['type']);           if (null === $this-&gt;getFileInfo($file['name']) || $filePath === null) {               return null;         }         $pathInfo = $this-&gt;getFileInfo($file['name']);         $path = $this-&gt;fileUniqueName() . '.' . $pathInfo['extension'];         $this-&gt;uploadFileToFolder($file['tmp_name'], $path, $filePath['root_dir']);           unset($file);         return $filePath['dir'] . DIRECTORY_SEPARATOR . $path;     }       # \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c \u0444\u0430\u043b\u0435 (\u0447\u0442\u043e \u0431\u044b \u044d\u0442\u043e \u043d\u0435 \u0431\u044b\u043b\u043e)     private function getFileInfo($file)     {           return $file !== null ? (array)pathinfo($file) : null;     }       # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f     private function fileUniqueName()     {           return sha1(uniqid(mt_rand(), true));     }          # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u043f\u0430\u043f\u043a\u0443     private function uploadFileToFolder($tmpFile, $newFileName, $rootFolder)     {         $e = new File($tmpFile);         $e-&gt;move($rootFolder, $newFileName);     } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432 \u0438\u0442\u043e\u0433\u0435, \u043d\u0435 \u0442\u0430\u043a \u0441\u0442\u0440\u0430\u0448\u0435\u043d \u0447\u0435\u0440\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u043b \u043a\u0430\u043a\u043e\u0439 \u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u2026 \u041d\u043e \u0442\u044b, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0432\u043e\u043b\u0435\u043d \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u0441\u0432\u043e\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043f\u043e \u043a\u043e\u0434\u0443 \u0438 \u0435\u0433\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0430 \u0432 Symfony. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e. \u0412 \u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>  <u>P.S.<\/u> \u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0430\u043c \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0447\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<\/p>\n<p>  \/\/ app\/config\/config.yml  <\/p>\n<pre><code class=\"php\">parameters:    upload_img_root_directory: %kernel.root_dir%\/..\/web\/upload\/img    upload_img_directory: upload\/img <\/code><\/pre>\n<p>  \u041f\u0430\u043f\u043a\u0438 upload \u0438 \u043f\u0430\u043f\u043a\u0438 img \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0435 \u043d\u0435\u0442, \u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c.<\/p>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u0432\u044b \u0432\u043e\u043b\u044c\u043d\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0430\u043f\u043e\u043a. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u043d\u0438\u0445. \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/199482\/\"> http:\/\/habrahabr.ru\/post\/199482\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0443\u0442\u043e\u043a. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c 2 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043d\u0435 \u043f\u043e \u0434\u043e\u043b\u0433\u0443 \u0441\u043b\u0443\u0436\u0431\u044b \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u043e\u044f\u043b\u0430 \u0442\u0430\u043a\u0430\u044f: \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c Drag &#038; Drop \u0437\u0430\u043a\u0430\u0447\u043a\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0430\u0434\u043c\u0438\u043d \u0447\u0430\u0441\u0442\u0438 \u0441\u0430\u0439\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 framefork\u2019e Symfony 2.3.* + SonataAdminBundle. \u041f\u043e \u0440\u044f\u0434\u0443 \u043f\u0440\u0438\u0447\u0438\u043d \u044f \u043e\u043f\u0443\u0441\u043a\u0430\u044e \u0442\u0443 \u0447\u0430\u0441\u0442\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0421\u043e\u043d\u0430\u0442\u0430 \u0441\u0442\u0430\u0432\u0438\u043b\u0430\u0441\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b). \u0418\u0442\u0430\u043a, \u044f \u043f\u043e\u043b\u0430\u0433\u0430\u044e \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0421\u043e\u043d\u0430\u0442\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 Entity. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435\u0442, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e. \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442:  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-199482","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/199482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=199482"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/199482\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=199482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=199482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=199482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}