182 lines
6.8 KiB
PHP
182 lines
6.8 KiB
PHP
<?php
|
|
namespace ProVM\Projects\Common\Controller\Web;
|
|
|
|
use Psr\Container\ContainerInterface as Container;
|
|
use Psr\Http\Message\RequestInterface as Request;
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
use ProVM\Common\Alias\View;
|
|
use ProVM\Common\Define\Controller\Redirect;
|
|
use ProVM\Projects\Common\Service\Projects;
|
|
use ProVM\Projects\Common\Factory\Project as Factory;
|
|
|
|
class Project {
|
|
use Redirect;
|
|
|
|
public function __invoke(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
|
$p = $service->get($project);
|
|
$p->config = $this->reduceFiles($p->config, '/setup', '', '/');
|
|
$p->controllers = $this->reduceFiles($p->controllers, ['/common', 'ProVM/' . ucwords($project) . '/Common'], '.php', '/');
|
|
foreach ($p->routes as $space => $routes) {
|
|
$p->routes->$space = $this->reduceFiles($routes, '/resources/routes', '', '/');
|
|
}
|
|
$p->views = $this->reduceFiles($p->views, '/resources/views/', '.blade.php', '.');
|
|
return $view->render($response, 'projects.show', ['project' => $p]);
|
|
}
|
|
protected function reduceFiles($array, $prefix, $suffix, $glue) {
|
|
if (!is_array($prefix)) {
|
|
$prefix = [$prefix];
|
|
}
|
|
if (!is_array($suffix)) {
|
|
$suffix = [$suffix];
|
|
}
|
|
$arr = [];
|
|
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array), \RecursiveIteratorIterator::SELF_FIRST);
|
|
$pk = '';
|
|
foreach ($it as $k => $v) {
|
|
if (is_array($v)) {
|
|
$pk = str_replace($prefix[0], $prefix[1] ?? '', $k);
|
|
continue;
|
|
}
|
|
$arr []= str_replace($suffix[0], $suffix[1] ?? '', implode($glue, [$pk, $v]));
|
|
}
|
|
return $arr;
|
|
}
|
|
public function addView(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
|
$folder = implode(DIRECTORY_SEPARATOR, [
|
|
$service->getFolder($project),
|
|
'resources',
|
|
'views'
|
|
]);
|
|
$files = new \DirectoryIterator($folder);
|
|
$subfolders = [];
|
|
foreach ($files as $file) {
|
|
if (!$file->isDir() or $file->isDot()) {
|
|
continue;
|
|
}
|
|
$subfolders []= $file->getBasename();
|
|
}
|
|
$factory = new Factory();
|
|
$p = $factory->find($service->getFolder($project))->getViews()->build();
|
|
$views = [];
|
|
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
|
|
$pk = '';
|
|
foreach ($it as $k => $v) {
|
|
if (is_array($v)) {
|
|
$pk = str_replace('/resources/views/', '', $k);
|
|
continue;
|
|
}
|
|
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
|
|
}
|
|
$project = $p;
|
|
return $view->render($response, 'projects.views.add', compact('project', 'subfolders', 'views'));
|
|
}
|
|
public function doAddView(Request $request, Response $response, Container $container, Projects $service, $project): Response {
|
|
$post = $request->getParsedBody();
|
|
$options = [];
|
|
if (trim($post['extends']) != '') {
|
|
$options['extends'] = $post['extends'];
|
|
}
|
|
if (trim($post['seccion']) != '') {
|
|
$options['section'] = $post['seccion'];
|
|
}
|
|
$location = $post['location'];
|
|
$status = $service->addView($project, $post['name'], $location, $options);
|
|
return $this->withRedirect($response, implode('/', [
|
|
$container->get('urls')->base,
|
|
'project',
|
|
$project
|
|
]));
|
|
}
|
|
public function addController(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
|
$folder = implode(DIRECTORY_SEPARATOR, [
|
|
$service->getFolder($project),
|
|
'common',
|
|
'Controller'
|
|
]);
|
|
$files = new \DirectoryIterator($folder);
|
|
$subfolders = [];
|
|
foreach ($files as $file) {
|
|
if (!$file->isDir() or $file->isDot()) {
|
|
continue;
|
|
}
|
|
$subfolders []= $file->getBasename();
|
|
}
|
|
$factory = new Factory();
|
|
$p = $factory->find($service->getFolder($project))->getViews()->build();
|
|
$views = [];
|
|
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
|
|
$pk = '';
|
|
foreach ($it as $k => $v) {
|
|
if (is_array($v)) {
|
|
$pk = str_replace('/resources/views/', '', $k);
|
|
continue;
|
|
}
|
|
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
|
|
}
|
|
$project = $p;
|
|
return $view->render($response, 'projects.controllers.add', compact('project', 'subfolders', 'views'));
|
|
}
|
|
public function doAddController(Request $request, Response $response, Container $container, Projects $service, $project): Response {
|
|
$post = $request->getParsedBody();
|
|
$name = str_replace(' ', '', ucwords($post['name']));
|
|
$status = $service->addController($project, $post['space'], $name, $post['template']);
|
|
return $this->withRedirect($response, implode('/', [
|
|
$container->get('urls')->base,
|
|
'project',
|
|
$project
|
|
]));
|
|
}
|
|
public function addRoute(Request $request, Response $response, Projects $service, View $view, $project): Response {
|
|
$folder = implode(DIRECTORY_SEPARATOR, [
|
|
$service->getFolder($project),
|
|
'resources',
|
|
'routes'
|
|
]);
|
|
$files = new \DirectoryIterator($folder);
|
|
$subfolders = [];
|
|
foreach ($files as $file) {
|
|
if (!$file->isDir() or $file->isDot()) {
|
|
continue;
|
|
}
|
|
$subfolders []= $file->getBasename();
|
|
}
|
|
$factory = new Factory();
|
|
$p = $factory->find($service->getFolder($project))->getViews()->getControllers()->build();
|
|
$views = [];
|
|
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->views), \RecursiveIteratorIterator::SELF_FIRST);
|
|
$pk = '';
|
|
foreach ($it as $k => $v) {
|
|
if (is_array($v)) {
|
|
$pk = str_replace('/resources/views/', '', $k);
|
|
continue;
|
|
}
|
|
$views []= str_replace('.blade.php', '', implode('.', [$pk, $v]));
|
|
}
|
|
$controllers = [];
|
|
$it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($p->controllers), \RecursiveIteratorIterator::SELF_FIRST);
|
|
$pk = '';
|
|
foreach ($it as $k => $v) {
|
|
if (is_array($v)) {
|
|
$pk = str_replace('/common', 'ProVM/Projects/Common', $k);
|
|
continue;
|
|
}
|
|
$controllers []= str_replace(['/', '.php'], ["\\", ''], implode('/', [$pk, $v]));
|
|
}
|
|
$project = $p;
|
|
return $view->render($response, 'projects.routes.add', compact('project', 'subfolders', 'views', 'controllers'));
|
|
}
|
|
public function doAddRoute(Request $request, Response $response, Container $container, Projects $service, $project): Response {
|
|
$post = $request->getParsedBody();
|
|
$space = $post['space'];
|
|
$name = $post['group'];
|
|
$route = $post['name'];
|
|
$callback = $post['controller'] . '::class';
|
|
$service->addRoute($project, $space, $name, $route, $callback);
|
|
return $this->withRedirect($response, implode('/', [
|
|
$container->get('urls')->base,
|
|
'project',
|
|
$project
|
|
]));
|
|
}
|
|
}
|