]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
form to upload file
authorNicolas Lœuillet <nicolas.loeuillet@smile.fr>
Thu, 22 Oct 2015 14:57:56 +0000 (16:57 +0200)
committerJeremy Benoist <jeremy.benoist@gmail.com>
Sat, 2 Jan 2016 22:24:17 +0000 (23:24 +0100)
app/config/config.yml
src/Wallabag/CoreBundle/Command/ImportCommand.php
src/Wallabag/CoreBundle/Controller/ImportController.php
src/Wallabag/CoreBundle/DependencyInjection/Configuration.php
src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php
src/Wallabag/CoreBundle/Form/Type/UploadImportType.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Resources/views/themes/material/Import/index.html.twig [new file with mode: 0644]

index 8403a458f69916a11f2745825de010a2627413c2..421b2db5a527c213c3fd8343350a26768516269d 100644 (file)
@@ -30,6 +30,8 @@ wallabag_core:
         en: 'English'
         fr: 'Français'
         de: 'Deutsch'
+    import:
+        allow_mimetypes: ['application/octet-stream', 'application/json', 'text/plain']
 
 # Twig Configuration
 twig:
index 16c84229fb441fe4b60a8a6dc32dc1c1e5db1f9e..6be6f5e1113309e65ed3af2d0d03d00cb050ff43 100644 (file)
@@ -51,7 +51,7 @@ class ImportCommand extends ContainerAwareCommand
         $batchSize = 20;
         $i = 1;
 
-        $user = $em->getRepository('WallabagCoreBundle:User')
+        $user = $em->getRepository('WallabagUserBundle:User')
             ->findOneById($input->getArgument('userId'));
 
         if (!is_object($user)) {
@@ -116,6 +116,7 @@ class ImportCommand extends ContainerAwareCommand
     protected function get(InputInterface $input, OutputInterface $output)
     {
         $filename = __DIR__.'/../../../../web/uploads/import/'.$input->getArgument('userId').'.json';
+
         $data = $this->convert($filename);
 
         return $data;
index 53211eec4f8b783ddc66f995dd1b20bf9f9ab83f..330877108eda51a030df445917318bfc51c4d6ec 100644 (file)
@@ -8,6 +8,7 @@ use Symfony\Component\Console\Input\ArrayInput;
 use Symfony\Component\Console\Output\NullOutput;
 use Symfony\Component\HttpFoundation\Request;
 use Wallabag\CoreBundle\Command\ImportCommand;
+use Wallabag\CoreBundle\Form\Type\UploadImportType;
 
 class ImportController extends Controller
 {
@@ -18,23 +19,46 @@ class ImportController extends Controller
      */
     public function importAction(Request $request)
     {
-        $command = new ImportCommand();
-        $command->setContainer($this->container);
-        $input = new ArrayInput(array('userId' => $this->getUser()->getId()));
-        $return = $command->run($input, new NullOutput());
-
-        if ($return == 0) {
-            $this->get('session')->getFlashBag()->add(
-                'notice',
-                'Import successful'
-            );
-        } else {
-            $this->get('session')->getFlashBag()->add(
-                'warning',
-                'Import failed'
-            );
+        $importForm = $this->createForm(new UploadImportType());
+        $importForm->handleRequest($request);
+        $user = $this->getUser();
+        $importConfig = $this->container->getParameter('wallabag_core.import');
+
+        if ($importForm->isValid()) {
+            $file = $importForm->get('file')->getData();
+            $name = $user->getId().'.json';
+            $dir = __DIR__.'/../../../../web/uploads/import';
+
+            if (in_array($file->getMimeType(), $importConfig['allow_mimetypes']) && $file->move($dir, $name)) {
+                $command = new ImportCommand();
+                $command->setContainer($this->container);
+                $input = new ArrayInput(array('userId' => $user->getId()));
+                $return = $command->run($input, new NullOutput());
+
+                if ($return == 0) {
+                    $this->get('session')->getFlashBag()->add(
+                        'notice',
+                        'Import successful'
+                    );
+                } else {
+                    $this->get('session')->getFlashBag()->add(
+                        'notice',
+                        'Import failed'
+                    );
+                }
+
+                return $this->redirect('/');
+            } else {
+                $this->get('session')->getFlashBag()->add(
+                    'notice',
+                    'Error while processing import. Please verify your import file.'
+                );
+            }
         }
 
-        return $this->redirect('/');
+        return $this->render('WallabagCoreBundle:Import:index.html.twig', array(
+            'form' => array(
+                'import' => $importForm->createView(), ),
+        ));
     }
 }
index 32acd1f17f315db1641266bc52fe861ea2fef996..fb1941b8eb7343494dc91f173223d62591c136ac 100644 (file)
@@ -4,6 +4,7 @@ namespace Wallabag\CoreBundle\DependencyInjection;
 
 use Symfony\Component\Config\Definition\Builder\TreeBuilder;
 use Symfony\Component\Config\Definition\ConfigurationInterface;
+use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
 
 class Configuration implements ConfigurationInterface
 {
@@ -17,9 +18,21 @@ class Configuration implements ConfigurationInterface
                 ->arrayNode('languages')
                     ->prototype('scalar')->end()
                 ->end()
+                ->arrayNode('import')
+                    ->append($this->getAllowMimetypes())
+                ->end()
             ->end()
         ;
 
         return $treeBuilder;
     }
+
+    private function getAllowMimetypes()
+    {
+        $node = new ArrayNodeDefinition('allow_mimetypes');
+
+        $node->prototype('scalar')->end();
+
+        return $node;
+    }
 }
index 330cc957698660ad95eab41e095419fedca206da..e2a3ad552fd81e977b4e5942ec7791cc179ee0da 100644 (file)
@@ -14,6 +14,7 @@ class WallabagCoreExtension extends Extension
         $configuration = new Configuration();
         $config = $this->processConfiguration($configuration, $configs);
         $container->setParameter('wallabag_core.languages', $config['languages']);
+        $container->setParameter('wallabag_core.import', $config['import']);
 
         $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
         $loader->load('services.yml');
diff --git a/src/Wallabag/CoreBundle/Form/Type/UploadImportType.php b/src/Wallabag/CoreBundle/Form/Type/UploadImportType.php
new file mode 100644 (file)
index 0000000..b9a9c46
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+namespace Wallabag\CoreBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormBuilderInterface;
+
+class UploadImportType extends AbstractType
+{
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('file', 'file')
+            ->add('save', 'submit')
+        ;
+    }
+
+    public function getDefaultOptions(array $options)
+    {
+        return array(
+            'csrf_protection' => false,
+        );
+    }
+
+    public function getName()
+    {
+        return 'upload_import_file';
+    }
+}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Import/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Import/index.html.twig
new file mode 100644 (file)
index 0000000..2c8c158
--- /dev/null
@@ -0,0 +1,23 @@
+{% extends "WallabagCoreBundle::layout.html.twig" %}
+
+{% block title %}{% trans %}import{% endtrans %}{% endblock %}
+
+{% block content %}
+
+    <div id="set1" class="col s12">
+        <form action="{{ path('import') }}" method="post" {{ form_enctype(form.import) }}>
+            {{ form_errors(form.import) }}
+            <div class="row">
+                <div class="input-field col s12">
+                    {{ form_errors(form.import.file) }}
+                    {{ form_widget(form.import.file) }}
+                    <label class="required">{% trans %}File{% endtrans %}</label>
+                </div>
+            </div>
+            <div class="hidden">{{ form_rest(form.import) }}</div>
+            <button class="btn waves-effect waves-light" type="submit" name="action">
+                {% trans %}Upload file{% endtrans %}
+            </button>
+        </form>
+    </div>
+{% endblock %}