Compare commits

29 Commits

Author SHA1 Message Date
d5602c810a Galeria funcionando 2021-07-18 23:57:03 -04:00
0ae24f9644 Cleanup 2020-12-12 01:02:16 -03:00
8bc3037e13 Se agregan menus 2020-12-12 00:25:59 -03:00
decd1469b4 Limitado el listado de clientes 2020-12-11 20:33:09 -03:00
ef453fef56 FIX: no se podia subir los videos 2020-06-18 02:16:32 -04:00
0f26b53546 Imagenes proporcionales 2020-06-18 00:29:07 -04:00
b64185c0b7 FIX: No existia video para crear thumb 2020-06-18 00:28:44 -04:00
bbb12dc275 Imagenes chicas al editar 2020-06-17 23:52:56 -04:00
103e92176c FIX: buscaba evento al agregar nuevo 2020-06-17 23:50:26 -04:00
5967a6c931 Separacion de js a archivos por pagina 2020-06-17 23:16:29 -04:00
429e4187fb FIX: deleteImage tiraba error por no tener var file 2020-06-17 23:09:16 -04:00
a527cc032d FIX: que no aparezca el mensaje cuando funciona 2020-06-17 17:01:53 -04:00
4220efce1c Se agrega mensaje cuando no se carga los archivos 2020-06-17 16:57:45 -04:00
25cfefb73c Revisar si se puede crear elementos de las imagenes y videos 2020-06-16 23:36:08 -04:00
09e6e537b6 FIX: ordenar las imagenes 2020-06-16 23:24:16 -04:00
5c384fddd5 FIX: se borro flag crop 2020-06-16 23:17:41 -04:00
a2ce28e8c7 FIX: Cambio de usuario al crear archivo 2020-06-16 23:08:01 -04:00
50af0d7e9b FIX: Cuando no hay archivos en agregar imagen 2020-06-16 22:55:41 -04:00
b943a21890 Zona de administracion para agregar eventos y subir imagenes 2020-06-16 22:44:48 -04:00
c09165529f Imagenes ignoradas 2020-06-16 22:44:17 -04:00
e64c01edb7 Ignorar imagenes de eventos 2020-06-16 22:43:48 -04:00
796115fb9a Mas Eventos 2020-04-30 00:10:37 -04:00
3f13358761 FIX: Cuando no existe empresa en el evento 2020-04-30 00:10:21 -04:00
10343cbc88 Dot ENV 2020-04-29 23:47:01 -04:00
2a34fa368e Se agrega seccion de evento 2020-04-28 23:52:56 -04:00
a878d6bc77 Cambios al look sacando placeholders 2020-04-28 11:32:36 -04:00
dad50537b2 Las redes no se apilan 2020-04-10 15:01:43 -04:00
a1311ee250 Afinaciones 2020-04-10 14:39:18 -04:00
692c001cd5 Bosquejo 2020-04-10 02:21:25 -04:00
199 changed files with 4128 additions and 0 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
.ENV
/public/assets/images/eventos/*/
# Composer
/vendor/

51
bootstrap/app.php Normal file
View File

@ -0,0 +1,51 @@
<?php
use DI\ContainerBuilder as Builder;
use DI\Bridge\Slim\Bridge;
include_once 'composer.php';
include_once 'dotenv.php';
$builder = new Builder();
$folders = ['common'];
if (isset($__environment)) {
$folders []= $__environment;
}
$files = [
'config',
'setup'
];
foreach ($folders as $folder) {
foreach ($files as $file) {
$filename = implode(DIRECTORY_SEPARATOR, [
__DIR__,
$folder,
$file . '.php'
]);
if (file_exists($filename)) {
$builder->addDefinitions($filename);
}
}
}
$container = $builder->build();
$app = Bridge::create($container);
$app->setBasePath($container->get('urls.base'));
$app->addRoutingMiddleware();
$app->addErrorMiddleware(true, true, true);
foreach ($folders as $folder) {
$filename = implode(DIRECTORY_SEPARATOR, [
__DIR__,
$folder,
'middleware.php'
]);
if (file_exists($filename)) {
include_once $filename;
}
}
include_once implode(DIRECTORY_SEPARATOR, [
$container->get('folders.routes'),
'router.php'
]);

View File

@ -0,0 +1,19 @@
<?php
return [
'urls.base' => getenv('BASE_URL'),
'folders.base' => dirname(__DIR__, 2),
'folders.resources' => DI\string(implode(DIRECTORY_SEPARATOR, [
'{folders.base}',
'resources'
])),
'folders.routes' => DI\string(implode(DIRECTORY_SEPARATOR, [
'{folders.resources}',
'routes'
])),
'folders.images' => DI\string(implode(DIRECTORY_SEPARATOR, [
'{folders.base}',
'public',
'assets',
'images'
]))
];

View File

@ -0,0 +1,8 @@
<?php
use Psr\Container\ContainerInterface as Container;
return [
ProVM\TotalSport\Common\Service\DataHandler::class => function(Container $c) {
return new ProVM\TotalSport\Common\Service\DataHandler($c->get('folders.data'));
}
];

6
bootstrap/composer.php Normal file
View File

@ -0,0 +1,6 @@
<?php
require_once implode(DIRECTORY_SEPARATOR, [
dirname(__DIR__),
'vendor',
'autoload.php'
]);

3
bootstrap/dotenv.php Normal file
View File

@ -0,0 +1,3 @@
<?php
$dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));
$dotenv->load();

83
bootstrap/web/config.php Normal file
View File

@ -0,0 +1,83 @@
<?php
return [
'folders.cache' => DI\string(implode(DIRECTORY_SEPARATOR, [
'{folders.resources}',
'cache'
])),
'folders.templates' => DI\string(implode(DIRECTORY_SEPARATOR, [
'{folders.resources}',
'views'
])),
'folders.data' => DI\string(implode(DIRECTORY_SEPARATOR, [
'{folders.resources}',
'data'
])),
'urls' => [
'base' => DI\string('{urls.base}'),
'assets' => DI\string(implode('/', [
'{urls.base}',
'assets'
])),
'styles' => DI\string(implode('/', [
'{urls.base}',
'assets',
'styles'
])),
'scripts' => DI\string(implode('/', [
'{urls.base}',
'assets',
'scripts'
])),
'images' => DI\string(implode('/', [
'{urls.base}',
'assets',
'images'
])),
'servicios' => DI\string(implode('/', [
'{urls.base}',
'servicios'
])),
'eventos' => DI\string(implode('/', [
'{urls.base}',
'eventos'
])),
'admin' => DI\string(implode('/', [
'{urls.base}',
'admin'
])),
'map' => 'https://maps.google.com/maps?hl=es&amp;q=Avenida%20Nueva%20Providencia%201945,of.%20919,%20Providencia&amp;ie=UTF8&amp;z=16&amp;iwloc=B&amp;output=embed'
],
'assets' => [
'styles' => [
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.4/semantic.min.css',
DI\string(implode('/', [
'{urls.base}',
'assets',
'styles',
'main.css'
])),
DI\string(implode('/', [
'{urls.base}',
'assets',
'styles',
'header.css'
]))
],
'scripts' => [
'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js',
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.8/semantic.min.js'
],
'fonts' => (object) [
'text/css' => [
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.4/themes/default/assets/fonts/brand-icons.woff',
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.4/themes/default/assets/fonts/brand-icons.woff2',
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.4/themes/default/assets/fonts/icons.woff',
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.4/themes/default/assets/fonts/icons.woff2',
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.4/themes/default/assets/fonts/outline-icons.woff',
'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.4/themes/default/assets/fonts/outline-icons.woff2',
'https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;900&display=swap',
'https://fonts.googleapis.com/css2?family=Raleway:wght@800&display=swap'
]
]
]
];

22
bootstrap/web/setup.php Normal file
View File

@ -0,0 +1,22 @@
<?php
use Psr\Container\ContainerInterface as Container;
return [
ProVM\TotalSport\Common\Service\ImageLoader::class => function(Container $c) {
return new ProVM\TotalSport\Common\Service\ImageLoader($c->get('folders.images'), $c->get('urls')['images']);
},
Slim\Views\Blade::class => function(Container $c) {
return new Slim\Views\Blade(
$c->get('folders.templates'),
$c->get('folders.cache'),
null,
[
'urls' => (object) $c->get('urls'),
'assets' => (object) $c->get('assets')
]
);
},
ProVM\TotalSport\Common\Service\MediaLoader::class => function(Container $c) {
return new ProVM\TotalSport\Common\Service\MediaLoader($c->get('folders.images'), $c->get('urls')['images']);
}
];

View File

@ -0,0 +1,160 @@
<?php
namespace ProVM\TotalSport\Common\Controller\Web\Admin;
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\TotalSport\Common\Service\DataHandler;
use ProVM\TotalSport\Common\Service\MediaLoader;
class Eventos {
public function __invoke(Request $request, Response $response, View $view, DataHandler $handler): Response {
$eventos = $handler->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' => $evento,
'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' => $post,
'evento' => $e,
'estado' => !$status
];
$response->getBody()->write(json_encode($output));
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(201);
}
public function addVideo(Request $request, Response $response, Container $container, DataHandler $handler, MediaLoader $loader, $evento): Response {
$post = $request->getParsedBody();
$files = $request->getUploadedFiles();
if (count($files) == 0) {
$output = [
'informacion' => '',
'evento' => $evento,
'estado' => false
];
$response->getBody()->write(json_encode($output));
return $response->withHeader('Location', implode('/', [
$container->get('urls')['admin'],
'evento',
$evento
]));
}
$file = $files['video'];
$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);
}
$response->getBody()->write(json_encode($output));
return $response->withHeader('Location', implode('/', [
$container->get('urls')['admin'],
'evento',
$evento
]));
}
}

View File

@ -0,0 +1,160 @@
<?php
namespace ProVM\TotalSport\Common\Controller\Web\Admin;
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\TotalSport\Common\Service\DataHandler;
use ProVM\TotalSport\Common\Service\MediaLoader;
class Galeria {
public function __invoke(Request $request, Response $response, View $view, DataHandler $handler): Response {
$galeria = $handler->load('galeria');
return $view->render($response, 'admin.galeria', compact('galeria'));
}
public function show(Request $request, Response $response, View $view, DataHandler $handler, MediaLoader $loader, $evento): Response {
$galeria = $handler->load('galeria');
$e = $galeria[$evento];
$e->id = $evento;
$imagenes = $loader->load($e);
$servicios = $handler->load('servicios');
return $view->render($response, 'admin.galeria.show', ['evento' => $e, 'imagenes' => $imagenes, 'servicios' => $servicios]);
}
public function edit(Request $request, Response $response, Container $container, DataHandler $handler, $evento): Response {
$galeria = $handler->load('galeria');
$e = $galeria[$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) {
$galeria[$evento] = $e;
$handler->save('galeria', $galeria);
}
return $response->withHeader('Location', implode('/', [
$container->get('urls')['admin'],
'galeria'
]));
}
public function add(Request $request, Response $response, View $view, DataHandler $handler): Response {
$servicios = $handler->load('servicios');
return $view->render($response, 'admin.galeria.add', compact('servicios'));
}
public function do_add(Request $request, Response $response, Container $container, DataHandler $handler): Response {
$post = $request->getParsedBody();
$galeria = $handler->load('galeria');
$evento = [
'titulo' => $post['titulo'],
'empresa' => $post['empresa'],
'servicio' => $post['servicio'],
'descripcion' => $post['descripcion']
];
$galeria []= $evento;
$status = $handler->save('galeria', $galeria);
return $response->withHeader('Location', implode('/', [
$container->get('urls')['admin'],
'galeria'
]));
}
public function delete(Request $request, Response $response, Container $container, DataHandler $handler, MediaLoader $loader, $evento): Response {
$galeria = $handler->load('galeria');
unset($galeria[$evento]);
$galeria = array_values($galeria);
$handler->save('galeria', $galeria);
return $response->withHeader('Location', implode('/', [
$container->get('urls')['admin'],
'galeria'
]));
}
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' => $evento,
'estado' => false
];
$response->getBody()->write(json_encode($output));
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(201);
}
$file = $files['imagen'];
$galeria = $handler->load('galeria');
$e = $galeria[$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();
$galeria = $handler->load('galeria');
$e = $egaleria[$evento];
$status = $loader->delete($e, $post['media']);
$output = [
'informacion' => $post,
'evento' => $e,
'estado' => !$status
];
$response->getBody()->write(json_encode($output));
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(201);
}
public function addVideo(Request $request, Response $response, Container $container, DataHandler $handler, MediaLoader $loader, $evento): Response {
$post = $request->getParsedBody();
$files = $request->getUploadedFiles();
if (count($files) == 0) {
$output = [
'informacion' => '',
'evento' => $evento,
'estado' => false
];
$response->getBody()->write(json_encode($output));
return $response->withHeader('Location', implode('/', [
$container->get('urls')['admin'],
'evento',
$evento
]));
}
$file = $files['video'];
$galeria = $handler->load('galeria');
$e = $galeria[$evento];
if (is_array($file)) {
$status = false;
foreach ($file as $f) {
$status |= $loader->add($e, $f);
}
} else {
$status = $loader->add($e, $file);
}
$response->getBody()->write(json_encode($output));
return $response->withHeader('Location', implode('/', [
$container->get('urls')['admin'],
'evento',
$evento
]));
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace ProVM\TotalSport\Common\Controller\Web;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Views\Blade as View;
class Eventos {
public function deportivos(Request $request, Response $response, View $view): Response {
return $view->render($response, 'eventos.deportivos');
}
public function carreras(Request $request, Response $response, View $view): Response {
return $view->render($response, 'eventos.carreras');
}
public function bienestar(Request $request, Response $response, View $view): Response {
return $view->render($response, 'eventos.bienestar');
}
public function ligas(Request $request, Response $response, View $view): Response {
return $view->render($response, 'eventos.ligas');
}
public function team(Request $request, Response $response, View $view): Response {
return $view->render($response, 'eventos.team');
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace ProVM\TotalSport\Common\Controller\Web;
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\TotalSport\Common\Service\DataHandler;
use ProVM\TotalSport\Common\Service\MediaLoader;
class Galeria {
public function __invoke(Request $request, Response $response, View $view, DataHandler $handler, MediaLoader $loader, $evento): Response {
$galeria = $handler->load('galeria');
$e = $galeria[$evento];
$imagenes = $loader->load($e);
return $view->render($response, 'evento', ['evento' => $e, 'imagenes' => $imagenes]);
}
}

View File

@ -0,0 +1,45 @@
<?php
namespace ProVM\TotalSport\Common\Controller\Web;
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\TotalSport\Common\Service\DataHandler;
use ProVM\TotalSport\Common\Service\MediaLoader;
class Home {
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'
];
$resumen = $handler->load('resumen');
$servicios = $handler->load('servicios');
$frase = (object) [
'titulo' => 'Lorem ipsum dolor sit amet, consectetur adipiscing',
'contenido' => 'elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation'
];
$clientes = [];
for ($i = 0; $i < 20; $i ++) {
$clientes[$i] = '<div class="ui image"><img src="' . $container->get('urls')['images'] . '/clientes/logo_' . str_pad($i + 1, 2, '0', \STR_PAD_LEFT) . '.jpg" /></div>';
}
$testimonios = $handler->load('testimonios');
$galeria = $handler->load('galeria');
foreach ($galeria as &$evento) {
if (!isset($evento->imagen)) {
$evento->imagen = '<img src="#" alt="Imagen no encontrada" title="Imagen no encontrada" />';
$imagenes = $loader->load($evento);
if ($imagenes !== false) {
$evento->imagen = array_values($imagenes)[0]->thumb->html;
}
}
if (!isset($evento->servicio)) {
$evento->servicio = mt_rand(0, count($servicios) - 1);
}
}
return $view->render($response, 'home', compact('banner', 'resumen', 'servicios', 'frase', 'clientes', 'testimonios', 'galeria'));
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace ProVM\TotalSport\Common\Controller\Web;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use Slim\Views\Blade as View;
class Servicios {
public function deportivos(Request $request, Response $response, View $view): Response {
return $view->render($response, 'servicios.deportivos');
}
public function culturales(Request $request, Response $response, View $view): Response {
return $view->render($response, 'servicios.culturales');
}
public function animacion(Request $request, Response $response, View $view): Response {
return $view->render($response, 'servicios.animacion');
}
public function arriendos(Request $request, Response $response, View $view): Response {
return $view->render($response, 'servicios.arriendo');
}
}

View File

@ -0,0 +1,25 @@
<?php
namespace ProVM\TotalSport\Common\Service;
use Spyc;
class DataHandler {
protected $folder;
public function __construct(string $data_folder) {
$this->folder = $data_folder;
}
public function load(string $file_name) {
$filename = implode(DIRECTORY_SEPARATOR, [
$this->folder,
$file_name . '.yml'
]);
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);
}
}

View File

@ -0,0 +1,84 @@
<?php
namespace ProVM\TotalSport\Common\Service;
use function Stringy\create as s;
class ImageLoader {
protected $folder;
protected $assets_folder;
public function __construct(string $images_folder, string $images_assets_folder) {
$this->folder = $images_folder;
$this->assets_folder = $images_assets_folder;
}
protected function getFolder($event) {
return implode(DIRECTORY_SEPARATOR, [
$this->folder,
'eventos',
s($event->servicio)->removeLeft('Eventos '),
rtrim(implode(', ', [
$event->titulo,
$event->empresa
]), ', ')
]);
}
public function load($event) {
$folder = $this->getFolder($event);
if (!file_exists($folder)) {
return false;
}
$files = new \DirectoryIterator($folder);
$images = [];
foreach ($files as $file) {
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',
s($event->servicio)->removeLeft('Eventos '),
rtrim(implode(', ', [
$event->titulo,
$event->empresa
]), ', '),
$file->getFilename()
]);
}
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);
}
}

View File

@ -0,0 +1,319 @@
<?php
namespace ProVM\TotalSport\Common\Service;
use function Stringy\create as s;
use FFMpeg\FFMpeg;
class MediaLoader {
protected $folder;
protected $media_url;
public function __construct(string $media_folder, string $media_assets_url) {
$this->folder = $media_folder;
$this->media_url = $media_assets_url;
}
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('', [
'<img src="',
$filename,
'" class="media" />'
]);
case 'mkv':
case 'mp4':
case 'mov':
case 'avi':
case 'ogg':
case 'webm':
return implode('', [
'<video class="media" controls="controls">',
implode('', [
'<source src="',
$filename,
'" type="video/',
$file->getExtension(),
'" />'
]),
'No se soporta el elemento de video para HTML5 en este navegador.',
'</video>'
]);
}
}
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->media === null) {
$item->media = $item->original;
}
if ($item->thumb === null) {
$item->thumb = $item->media;
}
});
sort($medias);
return $medias;
}
public function add($event, $file) {
$folder = $this->getFolder($event);
if (!file_exists($folder)) {
mkdir($folder);
chmod($folder, 0777);
}
$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);
try {
gd_info();
} catch(\Exception $e) {
return file_exists($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, $crop = false) {
$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'
])
]);
$image = imagecreatetruecolor(300, 300);
$black = imagecolorallocate($image, 0, 0, 0);
imagefill($image, 0, 0, $black);
$pfile = implode(DIRECTORY_SEPARATOR, [
dirname($this->folder, 3),
'resources',
'data',
'play.png'
]);
$play = imagecreatefrompng($pfile);
list($w, $h) = getimagesize($pfile);
$r = $w / $h;
$w = 100;
$h = $r * $w;
$play = imagescale($play, $w, $h);
$x = (300 - $w) / 2;
$y = (300 - $h) / 2;
$x2 = (300 + $w) / 2 - $x;
$y2 = (300 + $h) / 2 - $y;
imagecopyresampled($image, $play, $x, $y, 0, 0, $x2, $y2, $w, $h);
imagejpeg($image, $thumb, 50);
return file_exists($filename);
}
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);
}
}

33
composer.json Normal file
View File

@ -0,0 +1,33 @@
{
"name": "provm/totalsport",
"description": "Web para Total Sport",
"type": "project",
"license": "UNLICENSED",
"authors": [
{
"name": "Aldarien",
"email": "aldarien85@gmail.com"
}
],
"require": {
"slim/slim": "^4.4",
"php-di/slim-bridge": "^3.0",
"nyholm/psr7": "^1.2",
"nyholm/psr7-server": "^0.4.1",
"rubellum/slim-blade-view": "^0.1.1",
"mustangostang/spyc": "^0.6.3",
"voku/stringy": "^6.2",
"vlucas/phpdotenv": "^4.1",
"php-ffmpeg/php-ffmpeg": "^0.16.0"
},
"require-dev": {
"phpunit/phpunit": "^8.5",
"kint-php/kint": "^3.3"
},
"autoload": {
"psr-4": {
"ProVM\\TotalSport\\Common\\": "common",
"ProVM\\TotalSport\\": "src"
}
}
}

5
public/.htaccess Normal file
View File

@ -0,0 +1,5 @@
RewriteEngine On
RewriteBase /totalsport/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 603 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 390 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Some files were not shown because too many files have changed in this diff Show More