From b943a21890100bc35afcfc56834c7bebbfcca14b Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 16 Jun 2020 22:44:48 -0400 Subject: [PATCH] Zona de administracion para agregar eventos y subir imagenes --- bootstrap/web/config.php | 4 + bootstrap/web/setup.php | 8 + common/Controller/Web/Admin/Eventos.php | 126 ++++++++ common/Controller/Web/Eventos.php | 4 +- common/Controller/Web/Home.php | 8 +- common/Service/DataHandler.php | 7 + common/Service/ImageLoader.php | 43 ++- common/Service/MediaLoader.php | 303 ++++++++++++++++++ composer.json | 3 +- public/assets/styles/home.css | 14 + resources/data/clientes.yml | 0 resources/data/eventos.yml | 171 ++++++++-- resources/data/imagenes.yml | 9 + resources/routes/web/admin.php | 16 + resources/routes/web/admin/eventos.php | 17 + resources/views/admin/eventos.blade.php | 46 +++ resources/views/admin/eventos/add.blade.php | 77 +++++ resources/views/admin/eventos/show.blade.php | 190 +++++++++++ resources/views/admin/layout/base.blade.php | 5 + resources/views/admin/layout/body.blade.php | 6 + resources/views/admin/layout/footer.blade.php | 21 ++ .../admin/layout/footer/contacto.blade.php | 15 + .../views/admin/layout/footer/menu.blade.php | 24 ++ .../views/admin/layout/footer/redes.blade.php | 17 + .../admin/layout/footer/ubicacion.blade.php | 17 + resources/views/admin/layout/head.blade.php | 8 + resources/views/admin/layout/header.blade.php | 3 + resources/views/admin/layout/menu.blade.php | 13 + .../views/admin/layout/scripts.blade.php | 7 + resources/views/admin/layout/styles.blade.php | 14 + resources/views/evento.blade.php | 34 +- resources/views/home/eventos.blade.php | 95 +++--- 32 files changed, 1228 insertions(+), 97 deletions(-) create mode 100644 common/Controller/Web/Admin/Eventos.php create mode 100644 common/Service/MediaLoader.php delete mode 100644 resources/data/clientes.yml create mode 100644 resources/data/imagenes.yml create mode 100644 resources/routes/web/admin.php create mode 100644 resources/routes/web/admin/eventos.php create mode 100644 resources/views/admin/eventos.blade.php create mode 100644 resources/views/admin/eventos/add.blade.php create mode 100644 resources/views/admin/eventos/show.blade.php create mode 100644 resources/views/admin/layout/base.blade.php create mode 100644 resources/views/admin/layout/body.blade.php create mode 100644 resources/views/admin/layout/footer.blade.php create mode 100644 resources/views/admin/layout/footer/contacto.blade.php create mode 100644 resources/views/admin/layout/footer/menu.blade.php create mode 100644 resources/views/admin/layout/footer/redes.blade.php create mode 100644 resources/views/admin/layout/footer/ubicacion.blade.php create mode 100644 resources/views/admin/layout/head.blade.php create mode 100644 resources/views/admin/layout/header.blade.php create mode 100644 resources/views/admin/layout/menu.blade.php create mode 100644 resources/views/admin/layout/scripts.blade.php create mode 100644 resources/views/admin/layout/styles.blade.php diff --git a/bootstrap/web/config.php b/bootstrap/web/config.php index 8679d76..8c20a7c 100644 --- a/bootstrap/web/config.php +++ b/bootstrap/web/config.php @@ -36,6 +36,10 @@ return [ '{urls.base}', 'eventos' ])), + 'admin' => DI\string(implode('/', [ + '{urls.base}', + 'admin' + ])), 'map' => 'https://maps.google.com/maps?hl=es&q=Avenida%20Nueva%20Providencia%201945,%20Providencia&ie=UTF8&z=16&iwloc=B&output=embed' ], 'assets' => [ diff --git a/bootstrap/web/setup.php b/bootstrap/web/setup.php index 0a4680c..123fefa 100644 --- a/bootstrap/web/setup.php +++ b/bootstrap/web/setup.php @@ -15,5 +15,13 @@ return [ 'assets' => (object) $c->get('assets') ] ); + }, + ProVM\TotalSport\Common\Service\MediaLoader::class => function(Container $c) { + $obj = new ProVM\TotalSport\Common\Service\MediaLoader($c->get('folders.images'), $c->get('urls')['images']); + $obj->setFFMpeg($c->get(FFMpeg\FFMpeg::class)); + return $obj; + }, + FFMpeg\FFMpeg::class => function(Container $c) { + return FFMpeg\FFMpeg::create(); } ]; diff --git a/common/Controller/Web/Admin/Eventos.php b/common/Controller/Web/Admin/Eventos.php new file mode 100644 index 0000000..7dcfe8e --- /dev/null +++ b/common/Controller/Web/Admin/Eventos.php @@ -0,0 +1,126 @@ +load('eventos'); + return $view->render($response, 'admin.eventos', compact('eventos')); + } + public function show(Request $request, Response $response, View $view, DataHandler $handler, MediaLoader $loader, $evento): Response { + $eventos = $handler->load('eventos'); + $e = $eventos[$evento]; + $e->id = $evento; + $imagenes = $loader->load($e); + $servicios = $handler->load('servicios'); + return $view->render($response, 'admin.eventos.show', ['evento' => $e, 'imagenes' => $imagenes, 'servicios' => $servicios]); + } + public function edit(Request $request, Response $response, Container $container, DataHandler $handler, $evento): Response { + $eventos = $handler->load('eventos'); + $e = $eventos[$evento]; + $post = $request->getParsedBody(); + $servicios = $handler->load('servicios'); + $fields = ['titulo', 'empresa', 'servicio', 'descripcion']; + $changed = false; + foreach ($fields as $field) { + if ($post[$field] != $e->{$field}) { + $e->{$field} = $post[$field]; + $changed = true; + } + } + if ($changed) { + $eventos[$evento] = $e; + $handler->save('eventos', $eventos); + } + return $response->withHeader('Location', implode('/', [ + $container->get('urls')['admin'], + 'eventos' + ])); + } + public function add(Request $request, Response $response, View $view, DataHandler $handler): Response { + $servicios = $handler->load('servicios'); + return $view->render($response, 'admin.eventos.add', compact('servicios')); + } + public function do_add(Request $request, Response $response, Container $container, DataHandler $handler): Response { + $post = $request->getParsedBody(); + $eventos = $handler->load('eventos'); + $evento = [ + 'titulo' => $post['titulo'], + 'empresa' => $post['empresa'], + 'servicio' => $post['servicio'], + 'descripcion' => $post['descripcion'] + ]; + $eventos []= $evento; + $status = $handler->save('eventos', $eventos); + return $response->withHeader('Location', implode('/', [ + $container->get('urls')['admin'], + 'eventos' + ])); + } + public function delete(Request $request, Response $response, Container $container, DataHandler $handler, MediaLoader $loader, $evento): Response { + $eventos = $handler->load('eventos'); + unset($eventos[$evento]); + $eventos = array_values($eventos); + $handler->save('eventos', $eventos); + return $response->withHeader('Location', implode('/', [ + $container->get('urls')['admin'], + 'eventos' + ])); + } + public function addImage(Request $request, Response $response, DataHandler $handler, MediaLoader $loader, $evento): Response { + $post = $request->getParsedBody(); + $files = $request->getUploadedFiles(); + if (count($files) == 0) { + $output = [ + 'informacion' => '', + 'evento' => $e, + 'estado' => false + ]; + $response->getBody()->write(json_encode($output)); + return $response + ->withHeader('Content-Type', 'application/json') + ->withStatus(201); + } + $file = $files['imagen']; + $eventos = $handler->load('eventos'); + $e = $eventos[$evento]; + if (is_array($file)) { + $status = false; + foreach ($file as $f) { + $status |= $loader->add($e, $f); + } + } else { + $status = $loader->add($e, $file); + } + $output = [ + 'informacion' => $file, + 'evento' => $e, + 'estado' => $status + ]; + $response->getBody()->write(json_encode($output)); + return $response + ->withHeader('Content-Type', 'application/json') + ->withStatus(201); + } + public function deleteImage(Request $request, Response $response, DataHandler $handler, MediaLoader $loader, $evento): Response { + $post = $request->getParsedBody(); + $eventos = $handler->load('eventos'); + $e = $eventos[$evento]; + $status = $loader->delete($e, $post['media']); + $output = [ + 'informacion' => $file, + 'evento' => $e, + 'estado' => !$status + ]; + $response->getBody()->write(json_encode($output)); + return $response + ->withHeader('Content-Type', 'application/json') + ->withStatus(201); + } +} diff --git a/common/Controller/Web/Eventos.php b/common/Controller/Web/Eventos.php index 98716c5..83e37c3 100644 --- a/common/Controller/Web/Eventos.php +++ b/common/Controller/Web/Eventos.php @@ -6,10 +6,10 @@ use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Slim\Views\Blade as View; use ProVM\TotalSport\Common\Service\DataHandler; -use ProVM\TotalSport\Common\Service\ImageLoader; +use ProVM\TotalSport\Common\Service\MediaLoader; class Eventos { - public function __invoke(Request $request, Response $response, View $view, DataHandler $handler, ImageLoader $loader, $evento): Response { + public function __invoke(Request $request, Response $response, View $view, DataHandler $handler, MediaLoader $loader, $evento): Response { $eventos = $handler->load('eventos'); $e = $eventos[$evento]; $imagenes = $loader->load($e); diff --git a/common/Controller/Web/Home.php b/common/Controller/Web/Home.php index eb22c3d..dfca757 100644 --- a/common/Controller/Web/Home.php +++ b/common/Controller/Web/Home.php @@ -6,10 +6,10 @@ use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Slim\Views\Blade as View; use ProVM\TotalSport\Common\Service\DataHandler; -use ProVM\TotalSport\Common\Service\ImageLoader; +use ProVM\TotalSport\Common\Service\MediaLoader; class Home { - public function __invoke(Request $request, Response $response, Container $container, View $view, DataHandler $handler, ImageLoader $loader): Response { + public function __invoke(Request $request, Response $response, Container $container, View $view, DataHandler $handler, MediaLoader $loader): Response { $banner = (object) [ 'title' => 'BUSCAMOS LA MEJOR EXPERIENCA', 'contenido' => 'Eventos hechos a tu medida' @@ -28,10 +28,10 @@ class Home { $eventos = $handler->load('eventos'); foreach ($eventos as &$evento) { if (!isset($evento->imagen)) { - $evento->imagen = '#'; + $evento->imagen = 'Imagen no encontrada'; $imagenes = $loader->load($evento); if ($imagenes !== false) { - $evento->imagen = $imagenes[0]; + $evento->imagen = array_values($imagenes)[0]->thumb->html; } } if (!isset($evento->servicio)) { diff --git a/common/Service/DataHandler.php b/common/Service/DataHandler.php index d5bcb05..5cf4197 100644 --- a/common/Service/DataHandler.php +++ b/common/Service/DataHandler.php @@ -15,4 +15,11 @@ class DataHandler { ]); return json_decode(json_encode(Spyc::YAMLLoad($filename))); } + public function save(string $file_name, $data) { + $filename = implode(DIRECTORY_SEPARATOR, [ + $this->folder, + $file_name . '.yml' + ]); + return (file_put_contents($filename, Spyc::YAMLDump($data)) !== false); + } } diff --git a/common/Service/ImageLoader.php b/common/Service/ImageLoader.php index 2885233..6121931 100644 --- a/common/Service/ImageLoader.php +++ b/common/Service/ImageLoader.php @@ -10,8 +10,8 @@ class ImageLoader { $this->folder = $images_folder; $this->assets_folder = $images_assets_folder; } - public function load($event) { - $folder = implode(DIRECTORY_SEPARATOR, [ + protected function getFolder($event) { + return implode(DIRECTORY_SEPARATOR, [ $this->folder, 'eventos', s($event->servicio)->removeLeft('Eventos '), @@ -20,6 +20,9 @@ class ImageLoader { $event->empresa ]), ', ') ]); + } + public function load($event) { + $folder = $this->getFolder($event); if (!file_exists($folder)) { return false; } @@ -29,6 +32,18 @@ class ImageLoader { if ($file->isDir()) { continue; } + $name = $file->getBasename('.' . $file->getExtension()); + $org = false; + $thumb = false; + if (strpos($name, '_') !== false) { + $name = explode('_', $name)[0]; + if (strpos($name, '_org') !== false) { + $org = true; + } + if (strpos($name, '_thumb') !== false) { + $thumb = true; + } + } $images []= implode('/', [ $this->assets_folder, 'eventos', @@ -42,4 +57,28 @@ class ImageLoader { } return $images; } + public function add($event, $file) { + $folder = $this->getFolder($event); + if (!file_exists($folder)) { + mkdir($folder); + chmod($folder, 777); + } + $images = $this->load($event); + $base_name = '01'; + if ($images !== false and count($images) > 0) { + $base_name = str_pad(count($images), 2, '0', \STR_PAD_LEFT); + } + $extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); + $filename = implode(DIRECTORY_SEPARATOR, [ + $folder, + implode('.', [ + implode('_', [ + $base_name, + 'org' + ]), + $extension + ]) + ]); + $file->moveTo($filename); + } } diff --git a/common/Service/MediaLoader.php b/common/Service/MediaLoader.php new file mode 100644 index 0000000..8b157ad --- /dev/null +++ b/common/Service/MediaLoader.php @@ -0,0 +1,303 @@ +folder = $media_folder; + $this->media_url = $media_assets_url; + } + protected $ffmpeg; + public function setFFMpeg(FFMpeg $ffmpeg) { + $this->ffmpeg = $ffmpeg; + } + protected function getFolder($event) { + return implode(DIRECTORY_SEPARATOR, [ + $this->folder, + 'eventos', + s($event->servicio)->removeLeft('Eventos '), + rtrim(implode(', ', [ + $event->titulo, + $event->empresa + ]), ', ') + ]); + } + protected function buildHtml($file, $filename) { + switch ($file->getExtension()) { + default: + return implode('', [ + '' + ]); + case 'mkv': + case 'mp4': + case 'mov': + case 'avi': + case 'ogg': + case 'webm': + return implode(PHP_EOL, [ + '' + ]); + } + } + public function load($event) { + $folder = $this->getFolder($event); + if (!file_exists($folder)) { + return false; + } + $files = new \DirectoryIterator($folder); + $medias = []; + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + $name = $file->getBasename('.' . $file->getExtension()); + $type = 'media'; + if (strpos($name, '_') !== false) { + if (strpos($name, '_org') !== false) { + $type = 'original'; + } + if (strpos($name, '_thumb') !== false) { + $type = 'thumb'; + } + $name = explode('_', $name)[0]; + } + $filename = implode('/', [ + $this->media_url, + 'eventos', + s($event->servicio)->removeLeft('Eventos '), + ($event->empresa != '') ? + rtrim(implode(', ', [ + $event->titulo, + $event->empresa + ]), ', ') : + $event->titulo, + $file->getFilename() + ]); + $obj = (object) [ + 'n' => $name, + 'filename' => $filename, + 'type' => $type, + 'html' => $this->buildHtml($file, $filename) + ]; + if (!isset($medias[$name])) { + $medias[$name] = (object) [ + 'media' => null, + 'thumb' => null, + 'original' => null + ]; + } + $medias[$name]->{$type} = $obj; + } + array_walk($medias, function(&$item) { + if ($item->thumb === null) { + $item->thumb = $item->media; + } + }); + return $medias; + } + public function add($event, $file) { + $folder = $this->getFolder($event); + if (!file_exists($folder)) { + mkdir($folder); + chmod($folder, 777); + } + $extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); + switch ($extension) { + default: + return $this->addImage($event, $file); + case 'mkv': + case 'mp4': + case 'mov': + case 'avi': + case 'ogg': + case 'webm': + return $this->addVideo($event, $file); + } + } + public function addImage($event, $file) { + $folder = $this->getFolder($event); + $medias = $this->load($event); + $base_name = '01'; + if ($medias !== false and count($medias) > 0) { + $base_name = str_pad(count($medias) + 1, 2, '0', \STR_PAD_LEFT); + } + $extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); + $filename = implode(DIRECTORY_SEPARATOR, [ + $folder, + implode('.', [ + implode('_', [ + $base_name, + 'org' + ]), + $extension + ]) + ]); + $file->moveTo($filename); + + $thumb = implode(DIRECTORY_SEPARATOR, [ + $folder, + implode('.', [ + implode('_', [ + $base_name, + 'thumb' + ]), + 'jpg' + ]) + ]); + $this->copyResize($filename, $thumb, 50, 300); + $media = implode(DIRECTORY_SEPARATOR, [ + $folder, + implode('.', [ + $base_name, + 'jpg' + ]) + ]); + $this->copyResize($filename, $media, 75, 1024); + + return file_exists($filename); + } + protected function resize_image($source, $w, $h, $crop = FALSE) { + list($width, $height) = getimagesize($source); + $r = $width / $height; + if ($crop) { + if ($width > $height) { + $width = ceil($width-($width*abs($r-$w/$h))); + } else { + $height = ceil($height-($height*abs($r-$w/$h))); + } + $newwidth = $w; + $newheight = $h; + } else { + if ($w/$h > $r) { + $newwidth = $h*$r; + $newheight = $h; + } else { + $newheight = $w/$r; + $newwidth = $w; + } + } + $src = imagecreatefromjpeg($file); + $dst = imagecreatetruecolor($newwidth, $newheight); + imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); + + return $dst; + } + protected function copyResize($source, $destination, $quality, $w, $h = 0) { + $info = getimagesize($source); + if ($info['mime'] == 'image/jpeg') { + $image = imagecreatefromjpeg($source); + } elseif ($info['mime'] == 'image/gif') { + $image = imagecreatefromgif($source); + } elseif ($info['mime'] == 'image/png') { + $image = imagecreatefrompng($source); + } + + list($width, $height) = getimagesize($source); + $r = $width / $height; + if ($h == 0) { + $h = $w * $r; + } + if ($crop) { + if ($width > $height) { + $width = ceil($width-($width*abs($r-$w/$h))); + } else { + $height = ceil($height-($height*abs($r-$w/$h))); + } + $newwidth = $w; + $newheight = $h; + } else { + if ($w/$h > $r) { + $newwidth = $h*$r; + $newheight = $h; + } else { + $newheight = $w/$r; + $newwidth = $w; + } + } + $dst = imagecreatetruecolor($newwidth, $newheight); + imagecopyresampled($dst, $image, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); + imagejpeg($dst, $destination, $quality); + } + public function addVideo($event, $file) { + $folder = $this->getFolder($event); + $medias = $this->load($event); + $base_name = '01'; + if ($medias !== false and count($medias) > 0) { + $base_name = str_pad(count($medias) + 1, 2, '0', \STR_PAD_LEFT); + } + $extension = pathinfo($file->getClientFilename(), PATHINFO_EXTENSION); + $filename = implode(DIRECTORY_SEPARATOR, [ + $folder, + implode('.', [ + implode('_', [ + $base_name, + 'org' + ]), + $extension + ]) + ]); + $file->moveTo($filename); + + $thumb = implode(DIRECTORY_SEPARATOR, [ + $folder, + implode('.', [ + implode('_', [ + $base_name, + 'thumb' + ]), + 'jpg' + ]) + ]); + + $video + ->filters() + ->resize(new FFMpeg\Coordinate\Dimension(320, 240)) + ->synchronize(); + $video + ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(1)) + ->save($thumb); + $media = implode(DIRECTORY_SEPARATOR, [ + $folder, + implode('.', [ + $base_name, + $extension + ]) + ]); + $video + ->save(new FFMpeg\Format\Video\X264(), $media); + } + public function delete($event, $filename) { + $folder = $this->getFolder($event); + $media = implode(DIRECTORY_SEPARATOR, [ + $folder, + $filename . '*.*' + ]); + $files = glob($media); + foreach ($files as $filename) { + unlink($filename); + } + if (count(scandir($folder)) <= 2) { + rmdir($folder); + } + $filename = implode(DIRECTORY_SEPARATOR, [ + $folder, + $filename . '.jpg' + ]); + return file_exists($filename); + } +} diff --git a/composer.json b/composer.json index 35a350e..c6152a5 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,8 @@ "rubellum/slim-blade-view": "^0.1.1", "mustangostang/spyc": "^0.6.3", "voku/stringy": "^6.2", - "vlucas/phpdotenv": "^4.1" + "vlucas/phpdotenv": "^4.1", + "php-ffmpeg/php-ffmpeg": "^0.16.0" }, "require-dev": { "phpunit/phpunit": "^8.5", diff --git a/public/assets/styles/home.css b/public/assets/styles/home.css index 069efd1..4d72ff1 100644 --- a/public/assets/styles/home.css +++ b/public/assets/styles/home.css @@ -11,6 +11,7 @@ } #banner .header { font-family: inherit; + line-height: 2rem; } #servicios { @@ -87,6 +88,19 @@ background-color: white; padding: 0; } +#eventos .segment .image { + height: 14rem; + overflow: hidden; +} +#eventos .segment .image img { + height: 100%; + max-width: none !important; +} +#eventos .segment .header { + margin-top: 0; + padding-top: 1rem; + height: 7rem; +} #contacto { padding-top: 4rem; diff --git a/resources/data/clientes.yml b/resources/data/clientes.yml deleted file mode 100644 index e69de29..0000000 diff --git a/resources/data/eventos.yml b/resources/data/eventos.yml index a8bd1ad..7f27127 100644 --- a/resources/data/eventos.yml +++ b/resources/data/eventos.yml @@ -1,68 +1,171 @@ -- titulo: Activación Olimpiadas del Seguro 2019 +--- +- + titulo: Activación Olimpiadas del Seguro 2019 empresa: Consorcio servicio: Eventos Calidad de Vida - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Día del niño 2017 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Día del niño 2017 empresa: Fresenius Kabi servicio: Eventos Calidad de Vida - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Fiestras patrias 2019 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Fiestras patrias 2019 empresa: Consorcio servicio: Eventos Calidad de Vida - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Olimpiadas del Seguro 2019 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Olimpiadas del Seguro 2019 empresa: Intervención Chilena Consolidada servicio: Eventos Calidad de Vida - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Pausas Activas 2018 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Pausas Activas 2018 empresa: Dimeiggs servicio: Eventos Calidad de Vida - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Campeonato baby Futbol 2018 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Campeonato baby Futbol 2018 empresa: AZA servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Campeonato Futbol Varones 2019 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Campeonato Futbol Varones 2019 empresa: Chilena Consolidada servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Campeonato Voleibol 2019 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Campeonato Voleibol 2019 empresa: Dimerc servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Campeonato Futbolito 2017 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Campeonato Futbolito 2017 empresa: Dimerc servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Final Nacional Campeonato Futbolito 2012 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Final Nacional Campeonato Futbolito 2012 empresa: Gildemeister servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Futbol Varones senior 2019 + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Futbol Varones senior 2019 empresa: Olimpiadas del Seguro servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Liga Consumidores + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Liga Consumidores empresa: "" servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Liga Futbar + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Liga Futbar empresa: "" servicio: Eventos Deportivos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: 2da Corrida Familiar Inclusiva + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: 2da Corrida Familiar Inclusiva empresa: DIMERC servicio: Eventos Recreativos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Dia de la Familia + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Dia de la Familia empresa: BUPA servicio: Eventos Recreativos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Fiestas Patrias + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Fiestas Patrias empresa: CONSORCIO servicio: Eventos Recreativos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" -- titulo: Pausas Activas + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos +- + titulo: Pausas Activas empresa: DIMEIGGS servicio: Eventos Recreativos - descripcion: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos" + descripcion: > + Lorem ipsum dolor sit amet, consectetur + adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis + nos diff --git a/resources/data/imagenes.yml b/resources/data/imagenes.yml new file mode 100644 index 0000000..4f1afba --- /dev/null +++ b/resources/data/imagenes.yml @@ -0,0 +1,9 @@ +- evento: Activación Olimpiadas del Seguro 2019, Consorcio + imagenes: + - P1040997.JPG + - P1040998.JPG + - P1040999.JPG + - P1050003.JPG + - P1050006.JPG + - P1050008.JPG + - P1050010.JPG diff --git a/resources/routes/web/admin.php b/resources/routes/web/admin.php new file mode 100644 index 0000000..517d4e9 --- /dev/null +++ b/resources/routes/web/admin.php @@ -0,0 +1,16 @@ +group('/admin', function($app) { + $folder = implode(DIRECTORY_SEPARATOR, [ + __DIR__, + 'admin' + ]); + if (file_exists($folder)) { + $files = new DirectoryIterator($folder); + foreach ($files as $file) { + if ($file->isDir()) { + continue; + } + include_once $file->getRealPath(); + } + } +}); diff --git a/resources/routes/web/admin/eventos.php b/resources/routes/web/admin/eventos.php new file mode 100644 index 0000000..e1d2085 --- /dev/null +++ b/resources/routes/web/admin/eventos.php @@ -0,0 +1,17 @@ +group('/eventos', function($app) { + $app->group('/add', function($app) { + $app->get('[/]', [Eventos::class, 'add']); + $app->post('[/]', [Eventos::class, 'do_add']); + }); + $app->get('[/]', Eventos::class); +}); +$app->group('/evento/{evento}', function($app) { + $app->post('/edit', [Eventos::class, 'edit']); + $app->post('/add', [Eventos::class, 'addImage']); + $app->get('/delete', [Eventos::class, 'delete']); + $app->post('/image/delete', [Eventos::class, 'deleteImage']); + $app->get('[/]', [Eventos::class, 'show']); +}); diff --git a/resources/views/admin/eventos.blade.php b/resources/views/admin/eventos.blade.php new file mode 100644 index 0000000..ade3ce6 --- /dev/null +++ b/resources/views/admin/eventos.blade.php @@ -0,0 +1,46 @@ +@extends('admin.layout.base') + +@section('page_content') +
+
+ Eventos +
+ + + + + + + + + + + + + @foreach ($eventos as $i => $evento) + + + + + + @endforeach + +
+ + + +
EventoEditarBorrar
+ {{($evento->empresa != '') ? implode(', ', [$evento->titulo, $evento->empresa]) : $evento->titulo}} + + + + + + + + +
+
+@endsection diff --git a/resources/views/admin/eventos/add.blade.php b/resources/views/admin/eventos/add.blade.php new file mode 100644 index 0000000..9a236e7 --- /dev/null +++ b/resources/views/admin/eventos/add.blade.php @@ -0,0 +1,77 @@ +@extends('admin.layout.base') + +@section('page_content') +
+

+ Evento +

+
+
+
+
+
+
+ Titulo +
+
+
+
+ +
+
+
+
+
+
+ Empresa +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ Descripcion +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/admin/eventos/show.blade.php b/resources/views/admin/eventos/show.blade.php new file mode 100644 index 0000000..dbbb5c6 --- /dev/null +++ b/resources/views/admin/eventos/show.blade.php @@ -0,0 +1,190 @@ +@extends('admin.layout.base') + +@section('page_content') +
+

+ Evento +

+
+
+
+
+
+
+ Titulo +
+
+
+
+ +
+
+
+
+
+
+ Empresa +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ Descripcion +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ Media +
+ + + + + + + + + + + + @if ($imagenes) + @foreach (array_values($imagenes) as $i => $imagen) + + + + + @endforeach + @endif + +
+ +
ArchivoBorrar
{{$imagen->media->n}} + +
+
+@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/admin/layout/base.blade.php b/resources/views/admin/layout/base.blade.php new file mode 100644 index 0000000..1fbf83a --- /dev/null +++ b/resources/views/admin/layout/base.blade.php @@ -0,0 +1,5 @@ + + +@include('admin.layout.head') +@include('admin.layout.body') + diff --git a/resources/views/admin/layout/body.blade.php b/resources/views/admin/layout/body.blade.php new file mode 100644 index 0000000..ad7048e --- /dev/null +++ b/resources/views/admin/layout/body.blade.php @@ -0,0 +1,6 @@ + + @include('admin.layout.header') + @yield('page_content') +
+ @include('admin.layout.footer') + diff --git a/resources/views/admin/layout/footer.blade.php b/resources/views/admin/layout/footer.blade.php new file mode 100644 index 0000000..efe56ab --- /dev/null +++ b/resources/views/admin/layout/footer.blade.php @@ -0,0 +1,21 @@ + +@include('admin.layout.scripts') diff --git a/resources/views/admin/layout/footer/contacto.blade.php b/resources/views/admin/layout/footer/contacto.blade.php new file mode 100644 index 0000000..4c618f3 --- /dev/null +++ b/resources/views/admin/layout/footer/contacto.blade.php @@ -0,0 +1,15 @@ +
+ + +

+ + CONTACTO + +

+
+

+ +56 9 9334 3645 +
+ mauriciogonzalez@totalsport.cl +

+
diff --git a/resources/views/admin/layout/footer/menu.blade.php b/resources/views/admin/layout/footer/menu.blade.php new file mode 100644 index 0000000..92ca4cf --- /dev/null +++ b/resources/views/admin/layout/footer/menu.blade.php @@ -0,0 +1,24 @@ +
+ +
diff --git a/resources/views/admin/layout/footer/redes.blade.php b/resources/views/admin/layout/footer/redes.blade.php new file mode 100644 index 0000000..4f81745 --- /dev/null +++ b/resources/views/admin/layout/footer/redes.blade.php @@ -0,0 +1,17 @@ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
diff --git a/resources/views/admin/layout/footer/ubicacion.blade.php b/resources/views/admin/layout/footer/ubicacion.blade.php new file mode 100644 index 0000000..7a9eec2 --- /dev/null +++ b/resources/views/admin/layout/footer/ubicacion.blade.php @@ -0,0 +1,17 @@ +
+ + +

+ + UBICACIÓN + +

+
+ +

+ Av. Nueva Providencia 1945, Of. 919, +
+ Las Condes. +

+
+
diff --git a/resources/views/admin/layout/head.blade.php b/resources/views/admin/layout/head.blade.php new file mode 100644 index 0000000..eb5ac1e --- /dev/null +++ b/resources/views/admin/layout/head.blade.php @@ -0,0 +1,8 @@ + + + + Total Sport + @yield('page_title') + + @include('admin.layout.styles') + diff --git a/resources/views/admin/layout/header.blade.php b/resources/views/admin/layout/header.blade.php new file mode 100644 index 0000000..3b0fcf0 --- /dev/null +++ b/resources/views/admin/layout/header.blade.php @@ -0,0 +1,3 @@ +
+ @include('admin.layout.menu') +
diff --git a/resources/views/admin/layout/menu.blade.php b/resources/views/admin/layout/menu.blade.php new file mode 100644 index 0000000..7713a3e --- /dev/null +++ b/resources/views/admin/layout/menu.blade.php @@ -0,0 +1,13 @@ + diff --git a/resources/views/admin/layout/scripts.blade.php b/resources/views/admin/layout/scripts.blade.php new file mode 100644 index 0000000..da3033c --- /dev/null +++ b/resources/views/admin/layout/scripts.blade.php @@ -0,0 +1,7 @@ +@if (isset($assets->scripts)) + @foreach ($assets->scripts as $script) + + @endforeach +@endif + +@stack('scripts') diff --git a/resources/views/admin/layout/styles.blade.php b/resources/views/admin/layout/styles.blade.php new file mode 100644 index 0000000..819182b --- /dev/null +++ b/resources/views/admin/layout/styles.blade.php @@ -0,0 +1,14 @@ +@if (isset($assets->styles)) + @foreach ($assets->styles as $style) + + @endforeach +@endif +@if (isset($assets->fonts)) + @foreach ($assets->fonts as $type => $fs) + @foreach ($fs as $font) + + @endforeach + @endforeach +@endif + +@stack('styles') diff --git a/resources/views/evento.blade.php b/resources/views/evento.blade.php index 117bccd..86898f7 100644 --- a/resources/views/evento.blade.php +++ b/resources/views/evento.blade.php @@ -5,8 +5,12 @@
-
- +
+ @if ($imagenes !== false) + {!!array_values($imagenes)[0]->media->html!!} + @else + Imagen no encontrada. + @endif
@@ -25,13 +29,19 @@ {{$evento->descripcion}}

- @foreach ($imagenes as $imagen) -
-
- + @if ($imagenes !== false) + @foreach (array_values($imagenes) as $i => $imagen) +
+
+ {!!$imagen->thumb->html!!} +
+ @endforeach + @else +
+ No hay imagenes.
- @endforeach + @endif
@@ -45,10 +55,16 @@ @push('scripts') diff --git a/resources/views/home/eventos.blade.php b/resources/views/home/eventos.blade.php index 9a9ceee..3ea4b00 100644 --- a/resources/views/home/eventos.blade.php +++ b/resources/views/home/eventos.blade.php @@ -19,7 +19,7 @@
- + {!!$evento->imagen!!}
{{$evento->titulo}} @@ -36,56 +36,61 @@ @push('scripts') @endpush