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 @@ +