From 24c74d2887921049f60396607bba492afdad87bb Mon Sep 17 00:00:00 2001 From: Aldarien Date: Wed, 27 May 2020 13:39:14 -0400 Subject: [PATCH] Admin producto y mirar mapa --- common/Controller/Web/Admin/Productos.php | 216 ++++++++++++++++++ common/Controller/Web/Productos.php | 29 ++- .../images/{optimus.jpg => default.jpg} | Bin resources/routes/web/admin/productos.php | 1 + resources/views/admin/producto.blade.php | 15 +- resources/views/admin/productos/add.blade.php | 10 +- .../views/productos/producto/datos.blade.php | 30 ++- .../productos/producto/galeria.blade.php | 30 +-- resources/views/productos/show.blade.php | 4 +- 9 files changed, 294 insertions(+), 41 deletions(-) rename public/assets/images/{optimus.jpg => default.jpg} (100%) diff --git a/common/Controller/Web/Admin/Productos.php b/common/Controller/Web/Admin/Productos.php index 0a119de..bbb898f 100644 --- a/common/Controller/Web/Admin/Productos.php +++ b/common/Controller/Web/Admin/Productos.php @@ -5,6 +5,7 @@ use Psr\Container\ContainerInterface as Container; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Slim\Views\Blade as View; +use Carbon\Carbon; class Productos { public function __invoke(Request $request, Response $response, View $view, Container $container): Response { @@ -60,6 +61,66 @@ class Productos { } public function do_edit(Request $request, Response $response, Container $container, $producto): Response { $post = $request->getParsedBody(); + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'productos.json' + ]); + $id = $producto; + $productos = json_decode(trim(file_get_contents($filename))); + $producto = $productos[$producto]; + $changed = false; + + $fields = ['nombre', 'segmento', 'direccion', 'comuna', 'ciudad', 'bono', 'rentabilidad', 'estado', + 'cuota', 'unidades', 'modelos', 'descripcion', 'entrega']; + foreach ($fields as $field) { + if (!isset($producto->$field) or $post[$field] != $producto->$field) { + $producto->$field = $post[$field]; + $changed = true; + } + } + $valor = number_format($post['valor'], 0, ',', '.'); + if (!isset($producto->valor) or $producto->valor != $valor) { + $producto->valor = $valor; + $changed = true; + } + $tamaño = $post['tamaño_min'] . ' - ' . $post['tamaño_max'] . ' m²'; + if (!isset($producto->tamaño) or $producto->tamaño != $tamaño) { + $producto->tamaño = $tamaño; + $changed = true; + } + + $status1 = false; + if ($changed) { + $productos[$id] = $producto; + $status1 = (file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)) !== false); + } + + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'destacados.json' + ]); + $destacados = json_decode(trim(file_get_contents($filename))); + $changed = false; + if (isset($post['destacado']) and $post['destacado'] == 'on') { + if (array_search($id, $destacados) === false) { + $destacados []= $id; + sort($destacados); + $changed = true; + } + } else { + if (($i = array_search($id, $destacados)) !== false) { + unset($destacados[$i]); + $destacados = array_values($destacados); + $changed = true; + } + } + $status2 = false; + if ($changed) { + $status2 = (file_put_contents($filename, json_encode($destacados)) !== false); + } + + return $response + ->withHeader('Location', implode('/', [$container->get('urls')->admin, 'productos'])); } public function add(Request $request, Response $response, View $view, Container $container): Response { $filename = implode(DIRECTORY_SEPARATOR, [ @@ -71,17 +132,172 @@ class Productos { } public function do_add(Request $request, Response $response, Container $container): Response { $post = $request->getParsedBody(); + + $producto = (object) []; + $fields = ['nombre', 'segmento', 'direccion', 'comuna', 'ciudad', 'bono', 'rentabilidad', 'estado', + 'cuota', 'unidades', 'modelos', 'descripcion', 'entrega']; + foreach ($fields as $field) { + $producto->$field = $post[$field]; + } + $valor = number_format($post['valor'], 0, ',', '.'); + $producto->valor = $valor; + $tamaño = $post['tamaño_min'] . ' - ' . $post['tamaño_max'] . ' m²'; + $producto->tamaño = $tamaño; + + $f = Carbon::today(); + $producto->publicacion = implode(' ', [ + $f->day, + 'de', + ucfirst($f->locale('es')->isoFormat('MMMM')) . ',', + $f->year + ]); + + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'productos.json' + ]); + $productos = json_decode(trim(file_get_contents($filename))); + $productos []= $producto; + file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)); + + if (isset($post['destacado']) and $post['destacado'] == 'on') { + $id = count($productos) - 1; + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'destacados.json' + ]); + $destacados = json_decode(trim(file_get_contents($filename))); + $destacados []= $id; + sort($destacados); + file_put_contents($filename, json_encode($destacados)); + } + + return $response + ->withHeader('Location', implode('/', [$container->get('urls')->admin, 'productos'])); + } + public function delete(Request $request, Response $response, Container $container): Response { + $post = $request->getParsedBody(); + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'productos.json' + ]); + $id = $post['id']; + $productos = json_decode(trim(file_get_contents($filename))); + $producto = $productos[$id]; + $folder = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.public'), + 'assets', + 'images', + mb_strtolower($producto->nombre) + ]); + unset($productos[$id]); + $status = false; + $status |= (file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)) !== false); + if (file_exists($folder)) { + $status |= rmdir($folder); + } + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'destacados.json' + ]); + $destacados = json_decode(trim(file_get_contents($filename))); + if (($i = array_search($id, $destacados)) !== false) { + unset($destacados[$i]); + $destacados = array_values($destacados); + $status |= (file_put_contents($filename, json_encode($destacados)) !== false); + } + $output = [ + 'information' => $post, + 'estado' => $status + ]; + $response->getBody()->write(json_encode($output)); + return $response + ->withHeader('Content-Type', 'application/json') + ->withStatus(201); } public function add_image(Request $request, Response $response, Container $container, $producto): Response { $post = $request->getParsedBody(); + $files = $request->getUploadedFiles(); + $file = $files['imagen']; + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'productos.json' + ]); + $id = $producto; + $productos = json_decode(trim(file_get_contents($filename))); + $producto = $productos[$producto]; + $folder = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.public'), + 'assets', + 'images', + mb_strtolower($producto->nombre) + ]); + if (!file_exists($folder)) { + mkdir($folder); + } + $filename = implode(DIRECTORY_SEPARATOR, [ + $folder, + $file->getClientFilename() + ]); + $file->moveTo($filename); + + $output = [ + 'informacion' => $id, + 'estado' => file_exists($filename) + ]; + $response->getBody()->write(json_encode($output)); + return $response + ->withHeader('Content-Type', 'application/json') + ->withStatus(201); } public function set_video(Request $request, Response $response, Container $container, $producto): Response { $post = $request->getParsedBody(); + $files = $request->getUploadedFiles(); + die(); + $file = $files['video']; + $folder = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.public'), + 'assets', + 'images', + mb_strtolower($producto->nombre) + ]); } public function delete_image(Request $request, Response $response, Container $container, $producto): Response { $post = $request->getParsedBody(); + $filename = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.data'), + 'productos.json' + ]); + $id = $producto; + $productos = json_decode(trim(file_get_contents($filename))); + $producto = $productos[$producto]; + $folder = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.public'), + 'assets', + 'images', + mb_strtolower($producto->nombre) + ]); + $filename = implode(DIRECTORY_SEPARATOR, [ + $folder, + $post['imagen'] + ]); + $status = unlink($filename); + + $output = [ + 'estado' => $status + ]; + $response->getBody()->write(json_encode($output)); + return $response + ->withHeader('Content-Type', 'application/json') + ->withStatus(201); } public function delete_video(Request $request, Response $response, Container $container, $producto): Response { $post = $request->getParsedBody(); + $folder = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.public'), + 'assets', + 'images', + mb_strtolower($producto->nombre) + ]); } } diff --git a/common/Controller/Web/Productos.php b/common/Controller/Web/Productos.php index 31f2ac8..068316f 100644 --- a/common/Controller/Web/Productos.php +++ b/common/Controller/Web/Productos.php @@ -40,13 +40,15 @@ class Productos { 'images', mb_strtolower($producto->nombre) ]); - $files = new \DirectoryIterator($folder); $producto->images = []; - foreach ($files as $file) { - if ($file->isDir()) { - continue; + if (file_exists($folder)) { + $files = new \DirectoryIterator($folder); + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + $producto->images []= $file->getFilename(); } - $producto->images []= $file->getFilename(); } return $view->render($response, 'productos.show', compact('producto')); } @@ -112,6 +114,23 @@ class Productos { $producto = $productos[$producto]; $producto->destacado = $destacado; $producto->id = $id; + $folder = implode(DIRECTORY_SEPARATOR, [ + $container->get('folders.public'), + 'assets', + 'images', + mb_strtolower($producto->nombre) + ]); + $producto->imagen = 'default.jpg'; + if (file_exists($folder)) { + $files = new \DirectoryIterator($folder); + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + $producto->imagen = implode('/', [mb_strtolower($producto->nombre), $file->getFilename()]); + break; + } + } return $view->render($response, 'productos.ficha', compact('producto')); } } diff --git a/public/assets/images/optimus.jpg b/public/assets/images/default.jpg similarity index 100% rename from public/assets/images/optimus.jpg rename to public/assets/images/default.jpg diff --git a/resources/routes/web/admin/productos.php b/resources/routes/web/admin/productos.php index 2e3390e..3f82273 100644 --- a/resources/routes/web/admin/productos.php +++ b/resources/routes/web/admin/productos.php @@ -6,6 +6,7 @@ $app->group('/productos', function($app) { $app->get('[/]', [Productos::class, 'add']); $app->post('[/]', [Productos::class, 'do_add']); }); + $app->post('/delete', [Productos::class, 'delete']); $app->get('[/]', Productos::class); }); $app->group('/producto/{producto}', function($app) { diff --git a/resources/views/admin/producto.blade.php b/resources/views/admin/producto.blade.php index cd52816..a98854f 100644 --- a/resources/views/admin/producto.blade.php +++ b/resources/views/admin/producto.blade.php @@ -22,6 +22,10 @@ +
+ + +
@@ -101,7 +105,7 @@
- +
@@ -122,6 +126,8 @@
+
@@ -138,6 +144,7 @@ @endif
+ */?>
@@ -192,9 +199,13 @@ text: { months: months.long, monthsShort: months.short + }, + formatInput: false, + onChange: function(a, b) { + $(this).find('input').val(('0' + (a.getMonth() + 1)).slice(-2) + '/' + a.getFullYear()) } }) - var entrega = new Date('20{{implode('-', array_reverse(explode('/', $producto->entrega)))}}-01T01:00') + var entrega = new Date('{{str_pad(implode('-', array_reverse(explode('/', $producto->entrega))), 7, '20', STR_PAD_LEFT)}}-01T01:00') $('.calendar').calendar('set date', entrega) $('.checkbox').checkbox() @if ($producto->destacado) diff --git a/resources/views/admin/productos/add.blade.php b/resources/views/admin/productos/add.blade.php index d80bea2..7679e42 100644 --- a/resources/views/admin/productos/add.blade.php +++ b/resources/views/admin/productos/add.blade.php @@ -22,6 +22,10 @@ +
+ + +
@@ -101,7 +105,7 @@
- +
@@ -150,6 +154,10 @@ text: { months: months.long, monthsShort: months.short + }, + formatInput: false, + onChange: function(a) { + $(this).find('input').val(('0' + (a.getMonth() + 1)).slice(-2) + '/' + a.getFullYear()) } }) $('.checkbox').checkbox() diff --git a/resources/views/productos/producto/datos.blade.php b/resources/views/productos/producto/datos.blade.php index 183af9c..aafe2f5 100644 --- a/resources/views/productos/producto/datos.blade.php +++ b/resources/views/productos/producto/datos.blade.php @@ -2,7 +2,6 @@
@@ -14,7 +13,7 @@ Precio:
- {{$producto->valor}} UF + {{$producto->valor ?? ''}} UF
@@ -22,7 +21,7 @@ Estado:
- {{$producto->estado}} + {{$producto->estado ?? ''}}
@@ -30,7 +29,7 @@ Tipo:
- {{$producto->segmento}} + {{$producto->segmento ?? ''}}
@@ -38,7 +37,7 @@ Ubicación:
- {{$producto->comuna}}, {{$producto->ciudad}} + {{$producto->comuna ?? ''}}, {{$producto->ciudad ?? ''}}
@@ -46,7 +45,7 @@ Unidades:
- {{$producto->unidades}} + {{$producto->unidades ?? ''}}
@@ -54,7 +53,7 @@ Modelos:
- {{$producto->modelos}} + {{$producto->modelos ?? ''}}
@@ -62,25 +61,21 @@ Tamaño
- {{$producto->tamaño}} + {{$producto->tamaño ?? ''}}
- {{$producto->descripcion}} + {{$producto->descripcion ?? ''}}
-
-
-
-
-
-
-
-
+
@@ -103,6 +98,7 @@ @endpush diff --git a/resources/views/productos/producto/galeria.blade.php b/resources/views/productos/producto/galeria.blade.php index f59c039..82af0b3 100644 --- a/resources/views/productos/producto/galeria.blade.php +++ b/resources/views/productos/producto/galeria.blade.php @@ -1,19 +1,21 @@
-
- -
-
- @foreach ($producto->images as $i => $image) - @if ($i == 0) - @continue - @endif -
-
- + @if (count($producto->images)) +
+ +
+
+ @foreach ($producto->images as $i => $image) + @if ($i == 0) + @continue + @endif +
+
+ +
-
- @endforeach -
+ @endforeach +
+ @endif
@push('scripts') diff --git a/resources/views/productos/show.blade.php b/resources/views/productos/show.blade.php index b20da7e..6f4f447 100644 --- a/resources/views/productos/show.blade.php +++ b/resources/views/productos/show.blade.php @@ -10,10 +10,10 @@ {{$producto->nombre}} - {{$producto->direccion}}, {{$producto->comuna}}, {{$producto->ciudad}} + {{$producto->direccion ?? ''}}, {{$producto->comuna ?? ''}}, {{$producto->ciudad ?? ''}}
- Publicado el {{$producto->publicacion}} + Publicado el {{$producto->publicacion ?? ''}}
@include('productos.producto.galeria')