diff --git a/assets/css/app.scss b/assets/css/app.scss index 1eb590a..8bde450 100644 --- a/assets/css/app.scss +++ b/assets/css/app.scss @@ -795,6 +795,16 @@ $links: ( padding-left: 10px; padding-right: 10px; } + + &-file { + ul { + margin-top: 0; + } + } + + &-name { + min-width: 100px; + } } @media screen and (max-width: 1280px) { diff --git a/src/Controller/StlMeshController.php b/src/Controller/StlMeshController.php index 91802e7..6f675cb 100644 --- a/src/Controller/StlMeshController.php +++ b/src/Controller/StlMeshController.php @@ -26,26 +26,40 @@ class StlMeshController extends PageController } /** - * @Route("/mesh/download/{stlMesh}", name="mesh_download") + * @Route("/mesh/download/{stlMesh}/{key}", name="mesh_download") */ - public function download(StlMesh $stlMesh): Response + public function download(StlMesh $stlMesh, int $key): Response { - $response = new BinaryFileResponse($stlMesh->getFile()); + $file = $stlMesh->getFiles()[--$key] ?? null; + + if (null === $file) { + throw $this->createNotFoundException(); + } + + $response = new BinaryFileResponse($file['file']); $response->setContentDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, - str_replace('.bin', '.stl', basename($stlMesh->getFile())) + sprintf('%s.stl', $file['name']) ); return $response; } /** - * @Route("/mesh/viewer/{stlMesh}", name="mesh_viewer") + * @Route("/mesh/viewer/{stlMesh}/{key}", name="mesh_viewer") */ - public function viewer(StlMesh $stlMesh): Response + public function viewer(StlMesh $stlMesh, int $key): Response { + $file = $stlMesh->getFiles()[--$key] ?? null; + + if (null === $file) { + throw $this->createNotFoundException(); + } + return $this->render('page/mesh/viewer.html.twig', [ 'mesh' => $stlMesh, + 'file' => $file, + 'key' => $key + 1, ]); } } diff --git a/src/Entity/StlMesh.php b/src/Entity/StlMesh.php index 4ce602d..83a10d4 100644 --- a/src/Entity/StlMesh.php +++ b/src/Entity/StlMesh.php @@ -38,6 +38,11 @@ class StlMesh implements EntityInterface */ private $file; + /** + * @ORM\Column(type="array", nullable=true) + */ + private $files = []; + /** * @ORM\Column(type="string", length=255, nullable=true) */ @@ -107,4 +112,30 @@ class StlMesh implements EntityInterface return $this; } + + public function getFiles(): ?array + { + $this->files = (array) $this->files; + + usort($this->files, function($a, $b) { + if ($a['position'] > $b['position']) { + return 1; + } + + if ($a['position'] < $b['position']) { + return -1; + } + + return 0; + }); + + return $this->files; + } + + public function setFiles(?array $files): self + { + $this->files = $files; + + return $this; + } } diff --git a/src/Form/StlFileType.php b/src/Form/StlFileType.php new file mode 100644 index 0000000..0d2d6f0 --- /dev/null +++ b/src/Form/StlFileType.php @@ -0,0 +1,51 @@ +add('position', HiddenType::class); + + $builder->add( + 'name', + TextType::class, + [ + 'label' => 'Nom', + 'required' => true, + 'attr' => [ + ], + 'constraints' => [ + new NotBlank(), + ], + ] + ); + + $builder->add( + 'file', + FilePickerType::class, + [ + 'label' => false, + 'required' => true, + 'constraints' => [ + ], + ] + ); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + // Configure your form options here + ]); + } +} diff --git a/src/Form/StlMeshType.php b/src/Form/StlMeshType.php index 25afcf5..ad72fd8 100644 --- a/src/Form/StlMeshType.php +++ b/src/Form/StlMeshType.php @@ -2,14 +2,15 @@ namespace App\Form; +use App\Core\Form\FileManager\FilePickerType; +use App\Core\Form\Type\CollectionType as MurphCollectionType; use App\Entity\StlMesh; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\TextareaType; +use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\NotBlank; -use App\Core\Form\FileManager\FilePickerType; -use Symfony\Component\Form\Extension\Core\Type\TextareaType; -use Symfony\Component\Form\Extension\Core\Type\TextType; class StlMeshType extends AbstractType { @@ -57,6 +58,19 @@ class StlMeshType extends AbstractType ] ); + $builder->add( + 'files', + MurphCollectionType::class, + [ + 'label' => 'Fichiers STL', + 'entry_type' => StlFileType::class, + 'by_reference' => false, + 'allow_add' => true, + 'allow_delete' => true, + 'prototype' => true, + 'collection_name' => 'stlfiles', + ] + ); $builder->add( 'preview', diff --git a/templates/page/mesh/default.html.twig b/templates/page/mesh/default.html.twig index 8b8c566..ff0e423 100644 --- a/templates/page/mesh/default.html.twig +++ b/templates/page/mesh/default.html.twig @@ -30,26 +30,31 @@
- - {{ mesh.label }} - + {{ mesh.label }}

{{ mesh.label }}

{{ mesh.description|murph_url|file_attributes|markdown('post') }} - + {% for key, item in mesh.files %} +
+ +
+ {% endfor %}
diff --git a/templates/page/mesh/viewer.html.twig b/templates/page/mesh/viewer.html.twig index 11be74d..cd2cb2f 100644 --- a/templates/page/mesh/viewer.html.twig +++ b/templates/page/mesh/viewer.html.twig @@ -2,12 +2,12 @@ - {{ mesh.label }} + {{ mesh.label }} / {{ file.name }} {{ encore_entry_link_tags('viewer') }} -
+
{{ encore_entry_script_tags('viewer') }}