From 43149023840ce22dd977e674d96b2116a86b25db Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 17:44:34 -0300 Subject: [PATCH 01/13] Environment example --- .env.example | 1 + 1 file changed, 1 insertion(+) create mode 100644 .env.example diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ea0efb7 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +BASE_URL=/ From 0d8aee20da8d3b4013c3ca4590890a4cfd4ece82 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 17:44:52 -0300 Subject: [PATCH 02/13] Composer --- composer.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 composer.json diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..c0f5a1e --- /dev/null +++ b/composer.json @@ -0,0 +1,30 @@ +{ + "name": "provm/base_web", + "description": "Base web project", + "type": "project", + "license": "UNLICENSED", + "authors": [ + { + "name": "Aldarien", + "email": "aldarien85@gmail.com" + } + ], + "require": { + "slim/slim": "^4.7", + "nyholm/psr7": "^1.3", + "nyholm/psr7-server": "^1.0", + "rubellum/slim-blade-view": "^0.1.1", + "zeuxisoo/slim-whoops": "^0.7.3", + "php-di/slim-bridge": "^3.1", + "vlucas/phpdotenv": "^5.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5", + "kint-php/kint": "^3.3" + }, + "autoload": { + "psr-4": { + "ProVM\\Common\\": "common" + } + } +} From 559d287a3df9b2fd2aee6a9ab6b2553abf7167a8 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 17:45:02 -0300 Subject: [PATCH 03/13] Public folder --- public/.htaccess | 4 ++++ public/index.php | 9 +++++++++ 2 files changed, 13 insertions(+) create mode 100644 public/.htaccess create mode 100644 public/index.php diff --git a/public/.htaccess b/public/.htaccess new file mode 100644 index 0000000..66ef8f6 --- /dev/null +++ b/public/.htaccess @@ -0,0 +1,4 @@ +RewriteEngine On +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^ index.php [QSA,L] diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..159922a --- /dev/null +++ b/public/index.php @@ -0,0 +1,9 @@ +run(); From 736eb722548ac534b5b0f5df1606fbe146523c27 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 17:45:11 -0300 Subject: [PATCH 04/13] Base setup --- setup/app.php | 50 +++++++++++++++++++++++++++++++++++++++++ setup/common/config.php | 16 +++++++++++++ setup/composer.php | 6 +++++ setup/router.php | 5 +++++ setup/web/config.php | 49 ++++++++++++++++++++++++++++++++++++++++ setup/web/setup.php | 20 +++++++++++++++++ 6 files changed, 146 insertions(+) create mode 100644 setup/app.php create mode 100644 setup/common/config.php create mode 100644 setup/composer.php create mode 100644 setup/router.php create mode 100644 setup/web/config.php create mode 100644 setup/web/setup.php diff --git a/setup/app.php b/setup/app.php new file mode 100644 index 0000000..83cf9f3 --- /dev/null +++ b/setup/app.php @@ -0,0 +1,50 @@ +load(); + +$builder = new Builder(); + +$folders = [ + 'common', + $__environment +]; +$files = [ + 'config', + 'setup' +]; +foreach ($files as $file) { + foreach ($folders as $folder) { + $filename = implode(DIRECTORY_SEPARATOR, [ + __DIR__, + $folder, + $file . '.php' + ]); + if (!file_exists($filename)) { + continue; + } + $builder->addDefinitions($filename); + } +} + +$container = $builder->build(); +$app = Bridge::create($container); +$app->setBasePath($container->get('base_url')); + +foreach ($folders as $folder) { + $filename = implode(DIRECTORY_SEPARATOR, [ + __DIR__, + $folder, + 'middleware.php' + ]); + if (!file_exists($filename)) { + continue; + } + include_once $filename; +} + +include_once 'router.php'; diff --git a/setup/common/config.php b/setup/common/config.php new file mode 100644 index 0000000..0b1b9ad --- /dev/null +++ b/setup/common/config.php @@ -0,0 +1,16 @@ + true, + 'base_url' => $_ENV['BASE_URL'], + 'folders' => function() { + $directory = new Tree(DIRECTORY_SEPARATOR); + return $directory->build([ + [dirname(__DIR__, 2), null, 'base'], + ['public', 'base', 'public'], + ['resources', 'base', 'resources'], + ['routes', 'resources', 'routes'] + ]); + } +]; diff --git a/setup/composer.php b/setup/composer.php new file mode 100644 index 0000000..2d27ee1 --- /dev/null +++ b/setup/composer.php @@ -0,0 +1,6 @@ +getContainer()->get('folders')->routes, + $__environment . '.php' +]); diff --git a/setup/web/config.php b/setup/web/config.php new file mode 100644 index 0000000..5948859 --- /dev/null +++ b/setup/web/config.php @@ -0,0 +1,49 @@ + DI\decorate(function($prev, Container $c) { + $merger = new Merger(DIRECTORY_SEPARATOR); + $arr = (array) $prev; + $arr['templates'] = $merger->start()->add($prev->resources)->add('views')->merge(); + $arr['cache'] = $merger->start()->add($prev->base)->add('cache')->merge(); + return (object) $arr; + }), + 'urls' => function(Container $c) { + $tree = new Tree('/'); + return $tree->build([ + [$c->get('base_url'), null, 'base'], + ['assets', 'base', 'assets'], + ['images', 'assets', 'images'], + ['scripts', 'assets', 'scripts'], + ['styles', 'assets', 'styles'] + ]); + }, + 'assets' => function(Container $c) { + $arr = [ + 'links' => [ + '' + ], + 'fonts' => [ + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/icons.eot', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/icons.ttf', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/icons.woff', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/icons.woff2', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/outline-icons.eot', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/outline-icons.ttf', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/outline-icons.woff', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/outline-icons.woff2', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/brand-icons.eot', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/brand-icons.ttf', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/brand-icons.woff', + 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/brand-icons.woff2' + ], + 'scripts' => [ + '' + ] + ]; + return $arr; + } +]; diff --git a/setup/web/setup.php b/setup/web/setup.php new file mode 100644 index 0000000..c1071bd --- /dev/null +++ b/setup/web/setup.php @@ -0,0 +1,20 @@ + function(Container $c) { + if (!file_exists($c->get('folders')->cache)) { + mkdir($c->get('folders')->cache); + chmod($c->get('folders')->cache, 777); + } + return new ProVM\Common\Definition\View( + $c->get('folders')->templates, + $c->get('folders')->cache, + null, + [ + 'urls' => $c->get('urls'), + 'assets' => $c->get('assets') + ] + ); + } +]; From 6c945e915f4e0186b3c9eb5bacbcf85497eada01 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 17:45:27 -0300 Subject: [PATCH 05/13] Common files --- common/Alias/View.php | 5 ++++ common/Controller/Home.php | 12 ++++++++ common/Definition/View.php | 8 ++++++ common/Helper/Merger.php | 21 ++++++++++++++ common/Helper/Tree.php | 58 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+) create mode 100644 common/Alias/View.php create mode 100644 common/Controller/Home.php create mode 100644 common/Definition/View.php create mode 100644 common/Helper/Merger.php create mode 100644 common/Helper/Tree.php diff --git a/common/Alias/View.php b/common/Alias/View.php new file mode 100644 index 0000000..f28aeda --- /dev/null +++ b/common/Alias/View.php @@ -0,0 +1,5 @@ +render($response, 'home'); + } +} diff --git a/common/Definition/View.php b/common/Definition/View.php new file mode 100644 index 0000000..cfc21c6 --- /dev/null +++ b/common/Definition/View.php @@ -0,0 +1,8 @@ +separator = $separator; + } + protected $array; + public function start(): Merger { + $this->array = []; + return $this; + } + public function add($element): Merger { + $this->array []= $element; + return $this; + } + public function merge() { + return implode($this->separator, $this->array); + } +} diff --git a/common/Helper/Tree.php b/common/Helper/Tree.php new file mode 100644 index 0000000..38a9f00 --- /dev/null +++ b/common/Helper/Tree.php @@ -0,0 +1,58 @@ +merger = new Merger($separator); + } + protected $tree; + public function add($value, $parent = null, $alias = null): Tree { + if ($parent === null) { + if ($alias === null) { + $this->tree []= $value; + return $this; + } + $this->tree[$alias] = $value; + return $this; + } + if (!isset($this->tree[$parent])) { + return $this; + } + if ($alias === null) { + $this->tree []= $this->merger->start() + ->add($this->tree[$parent]) + ->add($value) + ->merge(); + return $this; + } + $this->tree[$alias] = $this->merger->start() + ->add($this->tree[$parent]) + ->add($value) + ->merge(); + return $this; + } + public function check_keys($tree) { + $bool = true; + foreach ($tree as $def) { + if (!isset($def[2])) { + continue; + } + $key = $def[2]; + $bool &= array_key_exists($key, $this->tree); + } + return $bool; + } + public function addTree($tree) { + while (!$this->check_keys($tree)) { + foreach ($tree as $def) { + $this->add($def[0], $def[1] ?? null, $def[2] ?? null); + } + } + } + public function build($tree) { + $this->tree = []; + $this->addTree($tree); + return (object) $this->tree; + } +} From acde7a5023bc32bbd10b99b07979984bcd9a24ed Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 17:45:45 -0300 Subject: [PATCH 06/13] Basic resources --- resources/routes/web.php | 16 ++++++++++++++++ resources/views/home.blade.php | 7 +++++++ resources/views/layout/base.blade.php | 5 +++++ resources/views/layout/body.blade.php | 5 +++++ resources/views/layout/footer.blade.php | 3 +++ resources/views/layout/head.blade.php | 5 +++++ resources/views/layout/header.blade.php | 2 ++ resources/views/layout/scripts.blade.php | 7 +++++++ resources/views/layout/styles.blade.php | 15 +++++++++++++++ 9 files changed, 65 insertions(+) create mode 100644 resources/routes/web.php create mode 100644 resources/views/home.blade.php create mode 100644 resources/views/layout/base.blade.php create mode 100644 resources/views/layout/body.blade.php create mode 100644 resources/views/layout/footer.blade.php create mode 100644 resources/views/layout/head.blade.php create mode 100644 resources/views/layout/header.blade.php create mode 100644 resources/views/layout/scripts.blade.php create mode 100644 resources/views/layout/styles.blade.php diff --git a/resources/routes/web.php b/resources/routes/web.php new file mode 100644 index 0000000..ce90c82 --- /dev/null +++ b/resources/routes/web.php @@ -0,0 +1,16 @@ +add(__DIR__)->add($__environment)->merge(); +if (file_exists($folder)) { + $files = new DirectoryIterator($folder); + foreach ($files as $file) { + if ($file->isDir() or $file->getExtension() != 'php') { + continue; + } + include_once $file->getRealPath(); + } +} + +$app->get('/', Home::class); diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php new file mode 100644 index 0000000..54d5dd5 --- /dev/null +++ b/resources/views/home.blade.php @@ -0,0 +1,7 @@ +@extends('layout.base') + +@section('page_content') +
+ Home +
+@endsection diff --git a/resources/views/layout/base.blade.php b/resources/views/layout/base.blade.php new file mode 100644 index 0000000..9deb8c1 --- /dev/null +++ b/resources/views/layout/base.blade.php @@ -0,0 +1,5 @@ + + +@include('layout.head') +@include('layout.body') + diff --git a/resources/views/layout/body.blade.php b/resources/views/layout/body.blade.php new file mode 100644 index 0000000..36dc72b --- /dev/null +++ b/resources/views/layout/body.blade.php @@ -0,0 +1,5 @@ + + @include('layout.header') + @yield('page_content') + @include('layout.footer') + diff --git a/resources/views/layout/footer.blade.php b/resources/views/layout/footer.blade.php new file mode 100644 index 0000000..348b9ab --- /dev/null +++ b/resources/views/layout/footer.blade.php @@ -0,0 +1,3 @@ +
+
+@include('layout.scripts') diff --git a/resources/views/layout/head.blade.php b/resources/views/layout/head.blade.php new file mode 100644 index 0000000..bcdbce6 --- /dev/null +++ b/resources/views/layout/head.blade.php @@ -0,0 +1,5 @@ + + + Control de Gestión + @include('layout.styles') + diff --git a/resources/views/layout/header.blade.php b/resources/views/layout/header.blade.php new file mode 100644 index 0000000..3306939 --- /dev/null +++ b/resources/views/layout/header.blade.php @@ -0,0 +1,2 @@ +
+
diff --git a/resources/views/layout/scripts.blade.php b/resources/views/layout/scripts.blade.php new file mode 100644 index 0000000..b84fe33 --- /dev/null +++ b/resources/views/layout/scripts.blade.php @@ -0,0 +1,7 @@ +@if (isset($assets) and isset($assets['scripts'])) + @foreach ($assets['scripts'] as $script) + {!!$script!!} + @endforeach +@endif + +@stack('scripts') diff --git a/resources/views/layout/styles.blade.php b/resources/views/layout/styles.blade.php new file mode 100644 index 0000000..23c8d33 --- /dev/null +++ b/resources/views/layout/styles.blade.php @@ -0,0 +1,15 @@ +@if (isset($assets)) + @foreach ($assets as $type => $list) + @foreach ($list as $style) + @if ($type == 'styles') + + @elseif ($type == 'fonts') + + @elseif ($type == 'links') + {!!$style!!} + @endif + @endforeach + @endforeach +@endif + +@stack('styles') From c8d122ce3f54cf9ee365a0764ea7eabcc890be1f Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 18:07:47 -0300 Subject: [PATCH 07/13] jQuery added --- setup/web/config.php | 1 + 1 file changed, 1 insertion(+) diff --git a/setup/web/config.php b/setup/web/config.php index 5948859..460c297 100644 --- a/setup/web/config.php +++ b/setup/web/config.php @@ -41,6 +41,7 @@ return [ 'https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.8.7/themes/default/assets/fonts/brand-icons.woff2' ], 'scripts' => [ + '', '' ] ]; From b9dc60592407c979e0ff2dd2f8bd2bfa862766e3 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Tue, 15 Dec 2020 18:07:53 -0300 Subject: [PATCH 08/13] Readme --- Readme.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Readme.md diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..407e75c --- /dev/null +++ b/Readme.md @@ -0,0 +1,17 @@ +# ProVM Basic Web Project + +Basic structure for files and folders common for every web project. + +## Includes + ++ [Slim](http://slimframework.com/) ++ [Nyholm/Psr7](https://github.com/Nyholm/psr7) ++ [Nyholm/Psr7-Server](https://github.com/Nyholm/psr7-server) ++ [PHP-DI/Slim-Bridge](https://github.com/PHP-DI/Slim-Bridge) ++ [Slim-Blade](https://github.com/rubellum/Slim-Blade-View) ++ [Slim-Whoops](https://github.com/zeuxisoo/php-slim-whoops) ++ [PHP dotenv](https://github.com/vlucas/phpdotenv) ++ [jQuery](https://jquery.com/) ++ [Fomantic-UI](https://github.com/fomantic/Fomantic-UI) ++ [PHPUnit](https://phpunit.de/) ++ [Kint](https://kint-php.github.io/kint/) From 031d184e271100c2be2e90f6a093b1c4df277156 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Fri, 18 Dec 2020 00:01:59 -0300 Subject: [PATCH 09/13] NPM + Blade ignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index af39706..eb1573f 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,12 @@ /vendor/ composer.lock +# NPM +/node_modules/ +package-lock.json + # Environment .env + +# Blade +/cache/ From 2584170ac9f87bafc925d214dcf25c02d7fb05e2 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Fri, 18 Dec 2020 00:02:10 -0300 Subject: [PATCH 10/13] NPM --- package.json | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 package.json diff --git a/package.json b/package.json new file mode 100644 index 0000000..3effc94 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "provm-base-web", + "version": "1.0.0", + "description": "Proyecto Base Web de ProVM", + "main": "index.js", + "scripts": { + "test": "mocha" + }, + "author": "Aldarien", + "license": "UNLICENSED", + "devDependencies": { + "browserify": "^17.0.0", + "gulp": "^4.0.2", + "gulp-babel": "^8.0.0", + "gulp-buffer": "^0.0.2", + "gulp-concat": "^2.6.1", + "gulp-dart-sass": "^1.0.2", + "gulp-rename": "^2.0.0", + "gulp-sourcemaps": "^3.0.0", + "gulp-tap": "^2.0.0", + "gulp-uglify": "^3.0.2", + "merge-stream": "^2.0.0", + "mocha": "^8.0.0" + } +} From 11db4c173a2f9d108f7e5953a056177977a41999 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Fri, 18 Dec 2020 00:03:17 -0300 Subject: [PATCH 11/13] Gulp for assets --- gulpfile.js | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 gulpfile.js diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..232a52b --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,66 @@ +const {src, dest, series, parallel} = require('gulp') +const fs = require('fs') +const path = require('path') +const concat = require('gulp-concat') +const sourcemaps = require('gulp-sourcemaps') +const babel = require('gulp-babel') +const uglify = require('gulp-uglify') +const rename = require('gulp-rename') +const merge = require('merge-stream') +const sass = require('gulp-dart-sass') + +let base_dir_js = 'resources/assets/scripts/' +let output_dir_js = 'public/assets/scripts/' + +function getFolders(dir) { + return fs.readdirSync(dir) + .filter(function(file) { + return fs.statSync(path.join(dir, file)).isDirectory() + }) +} + +function bundle_base_js(done) { + return src(base_dir_js + '*.js') + .pipe(concat('main.js')) + .pipe(dest(output_dir_js)) + .pipe(sourcemaps.init({loadMaps: true})) + .pipe(babel()) + .pipe(uglify()) + .pipe(rename('main.min.js')) + .pipe(sourcemaps.write('./')) + .pipe(dest(output_dir_js)) +} + +function bundle_js(done) { + let folders = getFolders(base_dir_js) + let tasks = folders.map(function(folder) { + return src(path.join(base_dir_js, folder, '**/*.js')) + .pipe(concat(folder + '.js', {newLine: ';'})) + .pipe(dest(output_dir_js)) + .pipe(sourcemaps.init({loadMaps: true})) + .pipe(babel()) + .pipe(uglify()) + .pipe(rename(folder + '.min.js')) + .pipe(sourcemaps.write('./')) + .pipe(dest(output_dir_js)) + }) + + return merge(tasks) +} + +let base_dir_sass = 'resources/assets/sass/' +let output_dir_css = 'public/assets/styles/' + +function bundle_base_sass(done) { + return src([base_dir_sass + '*.scss', '!' + base_dir_sass + '_*.scss']) + .pipe(sass()) + .pipe(rename({extname: '.css'})) + .pipe(dest(output_dir_css)) + .pipe(sourcemaps.init({loadMaps: true})) + .pipe(sass({outputStyle: 'compressed'}).on('error', sass.logError)) + .pipe(rename({extname: '.min.css'})) + .pipe(sourcemaps.write('./')) + .pipe(dest(output_dir_css)) +} + +exports.default = series(bundle_base_js, bundle_js, bundle_base_sass) From f5936c91ef803007f5b08ba6ec17852552031bf4 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Fri, 18 Dec 2020 00:03:33 -0300 Subject: [PATCH 12/13] Slim-Whoops --- setup/app.php | 2 ++ setup/web/middleware.php | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 setup/web/middleware.php diff --git a/setup/app.php b/setup/app.php index 83cf9f3..5a17d3c 100644 --- a/setup/app.php +++ b/setup/app.php @@ -47,4 +47,6 @@ foreach ($folders as $folder) { include_once $filename; } +$app->addRoutingMiddleware(); + include_once 'router.php'; diff --git a/setup/web/middleware.php b/setup/web/middleware.php new file mode 100644 index 0000000..94c3ce7 --- /dev/null +++ b/setup/web/middleware.php @@ -0,0 +1,2 @@ +add(new Zeuxisoo\Whoops\Slim\WhoopsMiddleware()); From c2e8979c38e2f3b29a2ace543617f5568b55e0d0 Mon Sep 17 00:00:00 2001 From: Aldarien Date: Fri, 18 Dec 2020 00:03:53 -0300 Subject: [PATCH 13/13] Route correction and Home --- resources/routes/web.php | 2 +- resources/views/home.blade.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/routes/web.php b/resources/routes/web.php index ce90c82..4300725 100644 --- a/resources/routes/web.php +++ b/resources/routes/web.php @@ -1,6 +1,6 @@ add(__DIR__)->add($__environment)->merge(); if (file_exists($folder)) { diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 54d5dd5..56a1681 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -1,7 +1,7 @@ @extends('layout.base') @section('page_content') -
- Home +
+

Home

@endsection