Mejora de productos

This commit is contained in:
2020-05-29 18:36:56 -04:00
parent 6744b8aa90
commit 3d270b1e8d
17 changed files with 593 additions and 147 deletions

View File

@ -6,24 +6,27 @@ use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Views\Blade as View;
use Carbon\Carbon;
use ProVM\Common\Factory\Model as ModelFactory;
use ProVM\KI\Producto;
class Productos {
public function __invoke(Request $request, Response $response, View $view, Container $container): Response {
$filename = implode(DIRECTORY_SEPARATOR, [
public function __invoke(Request $request, Response $response, View $view, ModelFactory $factory): Response {
/*$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
$productos = json_decode(trim(file_get_contents($filename)));
$productos = json_decode(trim(file_get_contents($filename)));*/
$productos = $factory->find(Producto::class)->many();
return $view->render($response, 'admin.productos', compact('productos'));
}
public function edit(Request $request, Response $response, View $view, Container $container, $producto): Response {
$filename = implode(DIRECTORY_SEPARATOR, [
public function edit(Request $request, Response $response, View $view, Container $container, ModelFactory $factory, $producto): Response {
/*$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
$id = $producto;
$productos = json_decode(trim(file_get_contents($filename)));
$producto = $productos[$producto];
$producto = $productos[$id];
$producto->id = $id;
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
@ -50,7 +53,8 @@ class Productos {
}
$producto->images []= $file->getFilename();
}
}
}*/
$producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
@ -59,18 +63,18 @@ class Productos {
$segmentos = json_decode(trim(file_get_contents($filename)));
return $view->render($response, 'admin.producto', compact('producto', 'segmentos'));
}
public function do_edit(Request $request, Response $response, Container $container, $producto): Response {
public function do_edit(Request $request, Response $response, ModelFactory $factory, $producto): Response {
$post = $request->getParsedBody();
$filename = implode(DIRECTORY_SEPARATOR, [
/*$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;
$producto = $productos[$producto];*/
$producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
$fields = ['nombre', 'segmento', 'direccion', 'comuna', 'ciudad', 'bono', 'rentabilidad', 'estado',
/*$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) {
@ -87,28 +91,39 @@ class Productos {
if (!isset($producto->tamaño) or $producto->tamaño != $tamaño) {
$producto->tamaño = $tamaño;
$changed = true;
}*/
if (isset($post['destacado']) and $post['destacado'] == 'on') {
$producto->destacado(true);
}
$post['tamaños'] = implode(' ', [
$post['tamaño_min'],
'-',
$post['tamaño_max'],
'm²'
]);
$producto->map((object) $post);
$status1 = false;
/*$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);
}
}*/
$producto->save();
$filename = implode(DIRECTORY_SEPARATOR, [
/*$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;
if (array_search($producto->id, $destacados) === false) {
$destacados []= $producto->id;
sort($destacados);
$changed = true;
}
} else {
if (($i = array_search($id, $destacados)) !== false) {
if (($i = array_search($producto->id, $destacados)) !== false) {
unset($destacados[$i]);
$destacados = array_values($destacados);
$changed = true;
@ -117,7 +132,7 @@ class Productos {
$status2 = false;
if ($changed) {
$status2 = (file_put_contents($filename, json_encode($destacados)) !== false);
}
}*/
return $response
->withHeader('Location', implode('/', [$container->get('urls')->admin, 'productos']));
@ -130,10 +145,10 @@ class Productos {
$segmentos = json_decode(trim(file_get_contents($filename)));
return $view->render($response, 'admin.productos.add', compact('segmentos'));
}
public function do_add(Request $request, Response $response, Container $container): Response {
public function do_add(Request $request, Response $response, ModelFactory $factory): Response {
$post = $request->getParsedBody();
$producto = (object) [];
/*$producto = (object) [];
$fields = ['nombre', 'segmento', 'direccion', 'comuna', 'ciudad', 'bono', 'rentabilidad', 'estado',
'cuota', 'unidades', 'modelos', 'descripcion', 'entrega'];
foreach ($fields as $field) {
@ -158,26 +173,32 @@ class Productos {
]);
$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));
file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES));*/
$producto = $factory->create(Producto::class, (object) $post);
if (isset($post['destacado']) and $post['destacado'] == 'on') {
$id = count($productos) - 1;
$producto->destacado(true);
}
$producto->save();
/*if (isset($post['destacado']) and $post['destacado'] == 'on') {
//$id = count($productos) - 1;
$id = $producto->id;
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'destacados.json'
]);
$destacados = json_decode(trim(file_get_contents($filename)));
$destacados []= $id;
$destacados []= $proyecto->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 {
public function delete(Request $request, Response $response, ModelFactory $factory): Response {
$post = $request->getParsedBody();
$filename = implode(DIRECTORY_SEPARATOR, [
/*$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
@ -191,6 +212,7 @@ class Productos {
mb_strtolower($producto->nombre)
]);
unset($productos[$id]);
$productos = array_values($productos);
$status = false;
$status |= (file_put_contents($filename, json_encode($productos, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES)) !== false);
if (file_exists($folder)) {
@ -205,7 +227,10 @@ class Productos {
unset($destacados[$i]);
$destacados = array_values($destacados);
$status |= (file_put_contents($filename, json_encode($destacados)) !== false);
}
}*/
$producto = $factory->find(Producto::class)->where([['id', $post['id']]])->one();
$status = $producto->delete();
$output = [
'information' => $post,
'estado' => $status
@ -215,11 +240,11 @@ class Productos {
->withHeader('Content-Type', 'application/json')
->withStatus(201);
}
public function add_image(Request $request, Response $response, Container $container, $producto): Response {
public function add_image(Request $request, Response $response, ModelFactory $factory, $producto): Response {
$post = $request->getParsedBody();
$files = $request->getUploadedFiles();
$file = $files['imagen'];
$filename = implode(DIRECTORY_SEPARATOR, [
/*$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
@ -239,11 +264,13 @@ class Productos {
$folder,
$file->getClientFilename()
]);
$file->moveTo($filename);
$file->moveTo($filename);*/
$producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
$status = $producto->addImagen($file);
$output = [
'informacion' => $id,
'estado' => file_exists($filename)
'estado' => $status
];
$response->getBody()->write(json_encode($output));
return $response
@ -262,9 +289,9 @@ class Productos {
mb_strtolower($producto->nombre)
]);
}
public function delete_image(Request $request, Response $response, Container $container, $producto): Response {
public function delete_image(Request $request, Response $response, ModelFactory $factory, $producto): Response {
$post = $request->getParsedBody();
$filename = implode(DIRECTORY_SEPARATOR, [
/*$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
@ -281,7 +308,9 @@ class Productos {
$folder,
$post['imagen']
]);
$status = unlink($filename);
$status = unlink($filename);*/
$producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
$status = $producto->deleteImagen($post['imagen']);
$output = [
'estado' => $status
@ -299,5 +328,6 @@ class Productos {
'images',
mb_strtolower($producto->nombre)
]);
return $response;
}
}

View File

@ -5,6 +5,8 @@ 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 ProVM\Common\Factory\Model as ModelFactory;
use ProVM\KI\Producto;
class Productos {
public function __invoke(Request $request, Response $response, Container $container, View $view): Response {
@ -15,59 +17,23 @@ class Productos {
$segmentos = json_decode(trim(file_get_contents($filename)));
return $view->render($response, 'productos.list', compact('segmentos'));
}
public function show(Request $request, Response $response, Container $container, View $view, $producto): Response {
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
$productos = json_decode(trim(file_get_contents($filename)));
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'destacados.json'
]);
$destacados = json_decode(trim(file_get_contents($filename)));
$destacado = false;
if (array_search($producto, $destacados) !== false) {
$destacado = true;
}
$id = $producto;
$producto = $productos[$producto];
$producto->destacado = $destacado;
$producto->id = $id;
$folder = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.public'),
'assets',
'images',
mb_strtolower($producto->nombre)
]);
$producto->images = [];
if (file_exists($folder)) {
$files = new \DirectoryIterator($folder);
foreach ($files as $file) {
if ($file->isDir()) {
continue;
}
$producto->images []= $file->getFilename();
}
}
public function show(Request $request, Response $response, View $view, ModelFactory $factory, $producto): Response {
$producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
return $view->render($response, 'productos.show', compact('producto'));
}
public function segmento(Request $request, Response $response, Container $container, $segmento): Response {
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
$productos = json_decode(trim(file_get_contents($filename)));
public function segmento(Request $request, Response $response, ModelFactory $factory, $segmento): Response {
$productos = $factory->find(Producto::class);
if ($segmento != 'todo') {
$productos = array_filter($productos, function($item) use ($segmento) {
return (str_replace(' ', '_', mb_strtolower($item->segmento)) == $segmento);
});
$productos = $productos->where([['segmento', ucwords($segmento)]]);
}
$productos = $productos->many();
$output = [
'information' => [
'segmento' => $segmento
],
'productos' => array_keys($productos)
'productos' => array_map(function($item) {
return $item->id;
}, $productos)
];
$response->getBody()->write(json_encode($output));
return $response
@ -87,7 +53,8 @@ class Productos {
],
'destacados' => []
];
for ($i = ($page - 1) * 4; $i < $page * 4; $i ++) {
$n = min(4, count($destacados));
for ($i = ($page - 1) * $n; $i < $page * $n; $i ++) {
$output['destacados'] []= $destacados[$i];
}
$response->getBody()->write(json_encode($output));
@ -95,42 +62,8 @@ class Productos {
->withHeader('Content-Type', 'application/json')
->withStatus(201);
}
public function ficha(Request $request, Response $response, Container $container, View $view, $producto): Response {
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'productos.json'
]);
$productos = json_decode(trim(file_get_contents($filename)));
$filename = implode(DIRECTORY_SEPARATOR, [
$container->get('folders.data'),
'destacados.json'
]);
$destacados = json_decode(trim(file_get_contents($filename)));
$destacado = false;
if (array_search($producto, $destacados) !== false) {
$destacado = true;
}
$id = $producto;
$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;
}
}
public function ficha(Request $request, Response $response, View $view, ModelFactory $factory, $producto): Response {
$producto = $factory->find(Producto::class)->where([['id', $producto]])->one();
return $view->render($response, 'productos.ficha', compact('producto'));
}
}