diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index ff9408a077..edf4bc635b 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -12,7 +12,6 @@ namespace Alchemy\Phrasea; use Alchemy\Geonames\GeonamesServiceProvider; -use Alchemy\Phrasea\ControllerProvider\Admin\Root as AdminRoot; use Alchemy\Phrasea\ControllerProvider\Admin\SearchEngine; use Alchemy\Phrasea\ControllerProvider\Admin\Setup; use Alchemy\Phrasea\ControllerProvider\Admin\Subdefs; @@ -312,6 +311,7 @@ class Application extends SilexApplication 'Alchemy\Phrasea\ControllerProvider\Admin\Databoxes' => [], 'Alchemy\Phrasea\ControllerProvider\Admin\Feeds' => [], 'Alchemy\Phrasea\ControllerProvider\Admin\Fields' => [], + 'Alchemy\Phrasea\ControllerProvider\Admin\Root' => [], 'Alchemy\Phrasea\ControllerProvider\Admin\Users' => [], 'Alchemy\Phrasea\ControllerProvider\Datafiles' => [], 'Alchemy\Phrasea\ControllerProvider\Lightbox' => [], @@ -669,6 +669,7 @@ class Application extends SilexApplication $this->mount('/xmlhttp', new ThesaurusXMLHttp()); $providers = [ + '/admin/' => 'Alchemy\Phrasea\ControllerProvider\Admin\Root', '/admin/collection' => 'Alchemy\Phrasea\ControllerProvider\Admin\Collection', '/admin/connected-users' => 'Alchemy\Phrasea\ControllerProvider\Admin\ConnectedUsers', '/admin/dashboard' => 'Alchemy\Phrasea\ControllerProvider\Admin\Dashboard', diff --git a/lib/Alchemy/Phrasea/Controller/Admin/RootController.php b/lib/Alchemy/Phrasea/Controller/Admin/RootController.php new file mode 100644 index 0000000000..c6ec19161e --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Admin/RootController.php @@ -0,0 +1,410 @@ +app, 3); + } catch (SessionNotFound $e) { + return $this->app->redirectPath('logout'); + } + + $params = $this->getSectionParameters($request->query->get('section', false)); + + return $this->render('admin/index.html.twig', array_merge([ + 'module' => 'admin', + 'events' => $this->app['events-manager'], + 'module_name' => 'Admin', + 'notice' => $request->query->get("notice"), + 'tree' => $this->render('admin/tree.html.twig', $params), + ], $params)); + } + + public function displayTreeAction(Request $request) + { + try { + \Session_Logger::updateClientInfos($this->app, 3); + } catch (SessionNotFound $e) { + return $this->app->redirectPath('logout'); + } + + $params = $this->getSectionParameters($request->query->get('position', false)); + + return $this->render('admin/tree.html.twig', $params); + } + + public function testPathsAction(Request $request) + { + if (!$request->isXmlHttpRequest()) { + $this->app->abort(400); + } + if (!array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) { + $this->app->abort(400, $this->app->trans('Bad request format, only JSON is allowed')); + } + + if (0 === count($tests = $request->query->get('tests', []))) { + $this->app->abort(400, $this->app->trans('Missing tests parameter')); + } + + if (null === $path = $request->query->get('path')) { + $this->app->abort(400, $this->app->trans('Missing path parameter')); + } + + $result = false; + foreach ($tests as $test) { + switch ($test) { + case 'writeable': + $result = is_writable($path); + break; + case 'readable': + default: + $result = is_readable($path); + } + } + + return $this->app->json(['results' => $result]); + } + + /** + * @param int $databox_id + * @return string + * @throws \Exception + */ + public function displayStatusBitAction($databox_id) + { + if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) { + $this->app->abort(403); + } + + return $this->render('admin/statusbit.html.twig', [ + 'databox' => $this->findDataboxById($databox_id), + ]); + } + + /** + * @param Request $request + * @param int $databox_id + * @return string + * @throws \Exception + */ + public function displayDataboxStructureAction(Request $request, $databox_id) + { + if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) { + $this->app->abort(403); + } + + $databox = $this->findDataboxById((int) $databox_id); + $structure = $databox->get_structure(); + $errors = \databox::get_structure_errors($this->app['translator'], $structure); + + if ($updateOk = !!$request->query->get('success', false)) { + $updateOk = true; + } + + if (false !== $errorsStructure = $request->query->get('error', false)) { + $errorsStructure = true; + } + + return $this->render('admin/structure.html.twig', [ + 'databox' => $databox, + 'errors' => $errors, + 'structure' => $structure, + 'errorsStructure' => $errorsStructure, + 'updateOk' => $updateOk + ]); + } + + public function submitDatabaseStructureAction(Request $request, $databox_id) + { + if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) { + $this->app->abort(403); + } + + if (null === $structure = $request->request->get('structure')) { + $this->app->abort(400, $this->app->trans('Missing "structure" parameter')); + } + + $errors = \databox::get_structure_errors($this->app['translator'], $structure); + + $domst = new \DOMDocument('1.0', 'UTF-8'); + $domst->preserveWhiteSpace = false; + $domst->formatOutput = true; + + if (count($errors) == 0 && $domst->loadXML($structure)) { + $databox = $this->findDataboxById($databox_id); + $databox->saveStructure($domst); + + return $this->app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 1]); + } + + return $this->app->redirectPath('database_display_stucture', [ + 'databox_id' => $databox_id, + 'success' => 0, + 'error' => 'struct', + ]); + } + + public function displayDatabaseStatusBitFormAction(Request $request, $databox_id, $bit) + { + if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) { + $this->app->abort(403); + } + + $databox = $this->findDataboxById($databox_id); + + $statusStructure = $databox->getStatusStructure(); + + switch ($errorMsg = $request->query->get('error')) { + case 'rights': + $errorMsg = $this->app->trans('You do not enough rights to update status'); + break; + case 'too-big': + $errorMsg = $this->app->trans('File is too big : 64k max'); + break; + case 'upload-error': + $errorMsg = $this->app->trans('Status icon upload failed : upload error'); + break; + case 'wright-error': + $errorMsg = $this->app->trans('Status icon upload failed : can not write on disk'); + break; + case 'unknow-error': + $errorMsg = $this->app->trans('Something wrong happend'); + break; + } + + if ($statusStructure->hasStatus($bit)) { + $status = $statusStructure->getStatus($bit); + } else { + $status = [ + "labeloff" => '', + "labelon" => '', + "img_off" => '', + "img_on" => '', + "path_off" => '', + "path_on" => '', + "searchable" => false, + "printable" => false, + ]; + + foreach ($this->app['locales.available'] as $code => $language) { + $status['labels_on'][$code] = null; + $status['labels_off'][$code] = null; + } + } + + return $this->render('admin/statusbit/edit.html.twig', [ + 'status' => $status, + 'errorMsg' => $errorMsg + ]); + } + + public function deleteStatusBitAction(Request $request, $databox_id, $bit) + { + if (!$request->isXmlHttpRequest() || !array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) { + $this->app->abort(400, $this->app->trans('Bad request format, only JSON is allowed')); + } + + if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) { + $this->app->abort(403); + } + + $databox = $this->findDataboxById($databox_id); + + $error = false; + + try { + $this->app['status.provider']->deleteStatus($databox->getStatusStructure(), $bit); + } catch (\Exception $e) { + $error = true; + } + + return $this->app->json(['success' => !$error]); + } + + public function submitStatusBitAction(Request $request, $databox_id, $bit) { + if (!$this->getAclForUser()->has_right_on_sbas($databox_id, 'bas_modify_struct')) { + $this->app->abort(403); + } + + $properties = [ + 'searchable' => $request->request->get('searchable') ? '1' : '0', + 'printable' => $request->request->get('printable') ? '1' : '0', + 'name' => $request->request->get('name', ''), + 'labelon' => $request->request->get('label_on', ''), + 'labeloff' => $request->request->get('label_off', ''), + 'labels_on' => $request->request->get('labels_on', []), + 'labels_off' => $request->request->get('labels_off', []), + ]; + + $databox = $this->findDataboxById($databox_id); + + /** @var StatusStructureProviderInterface $statusProvider */ + $statusProvider = $this->app['status.provider']; + $statusProvider->updateStatus($databox->getStatusStructure(), $bit, $properties); + + if (null !== $request->request->get('delete_icon_off')) { + \databox_status::deleteIcon($this->app, $databox_id, $bit, 'off'); + } + + if (null !== $file = $request->files->get('image_off')) { + try { + \databox_status::updateIcon($this->app, $databox_id, $bit, 'off', $file); + } catch (AccessDeniedHttpException $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'rights', + ]); + } catch (\Exception_InvalidArgument $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'unknow-error', + ]); + } catch (\Exception_Upload_FileTooBig $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'too-big', + ]); + } catch (\Exception_Upload_Error $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'upload-error', + ]); + } catch (\Exception_Upload_CannotWriteFile $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'wright-error', + ]); + } catch (\Exception $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'unknow-error', + ]); + } + } + + if (null !== $request->request->get('delete_icon_on')) { + \databox_status::deleteIcon($this->app, $databox_id, $bit, 'on'); + } + + if (null !== $file = $request->files->get('image_on')) { + try { + \databox_status::updateIcon($this->app, $databox_id, $bit, 'on', $file); + } catch (AccessDeniedHttpException $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'rights', + ]); + } catch (\Exception_InvalidArgument $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'unknow-error', + ]); + } catch (\Exception_Upload_FileTooBig $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'too-big', + ]); + } catch (\Exception_Upload_Error $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'upload-error', + ]); + } catch (\Exception_Upload_CannotWriteFile $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'wright-error', + ]); + } catch (\Exception $e) { + return $this->app->redirectPath('database_display_statusbit_form', [ + 'databox_id' => $databox_id, + 'bit' => $bit, + 'error' => 'unknow-error', + ]); + } + } + + return $this->app->redirectPath('database_display_statusbit', ['databox_id' => $databox_id, 'success' => 1]); + } + + /** + * @param string $section + * @return array + */ + private function getSectionParameters($section) + { + $available = [ + 'connected', + 'registrations', + 'taskmanager', + 'base', + 'bases', + 'collection', + 'user', + 'users', + ]; + + $feature = 'connected'; + $featured = false; + $position = explode(':', $section); + if (count($position) > 0) { + if (in_array($position[0], $available)) { + $feature = $position[0]; + + if (isset($position[1])) { + $featured = $position[1]; + } + } + } + + $databoxes = $off_databoxes = []; + $acl = $this->getAclForUser(); + foreach ($this->getApplicationBox()->get_databoxes() as $databox) { + try { + if (!$acl->has_access_to_sbas($databox->get_sbas_id())) { + continue; + } + $databox->get_connection(); + } catch (\Exception $e) { + $off_databoxes[] = $databox; + continue; + } + + $databoxes[] = $databox; + } + + return [ + 'feature' => $feature, + 'featured' => $featured, + 'databoxes' => $databoxes, + 'off_databoxes' => $off_databoxes, + ]; + } +} diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Admin/Root.php b/lib/Alchemy/Phrasea/ControllerProvider/Admin/Root.php index 8d043cb6cb..f65875328d 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Admin/Root.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Admin/Root.php @@ -11,443 +11,77 @@ namespace Alchemy\Phrasea\ControllerProvider\Admin; -use Alchemy\Phrasea\Exception\SessionNotFound; -use Alchemy\Phrasea\Helper\DatabaseHelper; -use Alchemy\Phrasea\Helper\PathHelper; +use Alchemy\Phrasea\Application as PhraseaApplication; +use Alchemy\Phrasea\Controller\Admin\RootController; +use Alchemy\Phrasea\Security\Firewall; use Silex\Application; +use Silex\ControllerCollection; use Silex\ControllerProviderInterface; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; +use Silex\ServiceProviderInterface; -class Root implements ControllerProviderInterface +class Root implements ControllerProviderInterface, ServiceProviderInterface { + public function register(Application $app) + { + $app['controller.admin.root'] = $app->share(function (PhraseaApplication $app) { + return new RootController($app); + }); + } + + public function boot(Application $app) + { + } + public function connect(Application $app) { - $app['controller.admin.root'] = $this; - + /** @var ControllerCollection $controllers */ $controllers = $app['controllers_factory']; - $app['firewall']->addMandatoryAuthentication($controllers); - $controllers->before(function (Request $request) use ($app) { - $app['firewall']->requireAccessToModule('admin'); + /** @var Firewall $firewall */ + $firewall = $app['firewall']; + $firewall->addMandatoryAuthentication($controllers); + + $controllers->before(function () use ($firewall) { + $firewall->requireAccessToModule('admin'); }); - $controllers->get('/', function (Application $app, Request $request) { - try { - \Session_Logger::updateClientInfos($app, 3); - } catch (SessionNotFound $e) { - return $app->redirectPath('logout'); - } + $controllers->get('/', 'controller.admin.root:indexAction') + ->bind('admin'); - $section = $request->query->get('section', false); + $controllers->get('/tree/', 'controller.admin.root:displayTreeAction') + ->bind('admin_display_tree'); - $available = [ - 'connected', - 'registrations', - 'taskmanager', - 'base', - 'bases', - 'collection', - 'user', - 'users' - ]; - - $feature = 'connected'; - $featured = false; - $position = explode(':', $section); - if (count($position) > 0) { - if (in_array($position[0], $available)) { - $feature = $position[0]; - - if (isset($position[1])) { - $featured = $position[1]; - } - } - } - - $databoxes = $off_databoxes = []; - foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) { - try { - if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_sbas($databox->get_sbas_id())) { - continue; - } - $databox->get_connection(); - } catch (\Exception $e) { - $off_databoxes[] = $databox; - continue; - } - - $databoxes[] = $databox; - } - - $params = [ - 'feature' => $feature, - 'featured' => $featured, - 'databoxes' => $databoxes, - 'off_databoxes' => $off_databoxes - ]; - - return $app['twig']->render('admin/index.html.twig', [ - 'module' => 'admin', - 'events' => $app['events-manager'], - 'module_name' => 'Admin', - 'notice' => $request->query->get("notice"), - 'feature' => $feature, - 'featured' => $featured, - 'databoxes' => $databoxes, - 'off_databoxes' => $off_databoxes, - 'tree' => $app['twig']->render('admin/tree.html.twig', $params), - ]); - })->bind('admin'); - - $controllers->get('/tree/', function (Application $app, Request $request) { - try { - \Session_Logger::updateClientInfos($app, 3); - } catch (SessionNotFound $e) { - return $app->redirectPath('logout'); - } - - $available = [ - 'connected', - 'registrations', - 'taskmanager', - 'base', - 'bases', - 'collection', - 'user', - 'users' - ]; - - $feature = 'connected'; - $featured = false; - - $position = explode(':', $request->query->get('position', false)); - if (count($position) > 0) { - if (in_array($position[0], $available)) { - $feature = $position[0]; - - if (isset($position[1])) { - $featured = $position[1]; - } - } - } - - $databoxes = $off_databoxes = []; - foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) { - try { - if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_sbas($databox->get_sbas_id())) { - continue; - } - - $databox->get_connection(); - } catch (\Exception $e) { - $off_databoxes[] = $databox; - continue; - } - - $databoxes[] = $databox; - } - - $params = [ - 'feature' => $feature, - 'featured' => $featured, - 'databoxes' => $databoxes, - 'off_databoxes' => $off_databoxes - ]; - - return $app['twig']->render('admin/tree.html.twig', $params); - })->bind('admin_display_tree'); - - $controllers->get('/test-paths/', function (Application $app, Request $request) { - if (!$request->isXmlHttpRequest()) { - $app->abort(400); - } - if (!array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) { - $app->abort(400, $app->trans('Bad request format, only JSON is allowed')); - } - - if (0 === count($tests = $request->query->get('tests', []))) { - $app->abort(400, $app->trans('Missing tests parameter')); - } - - if (null === $path = $request->query->get('path')) { - $app->abort(400, $app->trans('Missing path parameter')); - } - - foreach ($tests as $test) { - switch ($test) { - case 'writeable': - $result = is_writable($path); - break; - case 'readable': - default: - $result = is_readable($path); - } - } - - return $app->json(['results' => $result]); - }) + $controllers->get('/test-paths/', 'controller.admin.root:testPathsAction') ->bind('admin_test_paths'); - $controllers->get('/structure/{databox_id}/', function (Application $app, Request $request, $databox_id) { - if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) { - $app->abort(403); - } + $controllers->get('/structure/{databox_id}/', 'controller.admin.root:displayDataboxStructureAction') + ->assert('databox_id', '\d+') + ->bind('database_display_stucture'); - $databox = $app['phraseanet.appbox']->get_databox((int) $databox_id); - $structure = $databox->get_structure(); - $errors = \databox::get_structure_errors($app['translator'], $structure); + $controllers->post('/structure/{databox_id}/', 'controller.admin.root:submitDatabaseStructureAction') + ->assert('databox_id', '\d+') + ->bind('database_submit_stucture'); - if ($updateOk = !!$request->query->get('success', false)) { - $updateOk = true; - } + $controllers->get('/statusbit/{databox_id}/', 'controller.admin.root:displayStatusBitAction') + ->assert('databox_id', '\d+') + ->bind('database_display_statusbit'); - if (false !== $errorsStructure = $request->query->get('error', false)) { - $errorsStructure = true; - } + $controllers + ->get('/statusbit/{databox_id}/status/{bit}/', 'controller.admin.root:displayDatabaseStatusBitFormAction') + ->assert('databox_id', '\d+') + ->assert('bit', '\d+') + ->bind('database_display_statusbit_form'); - return $app['twig']->render('admin/structure.html.twig', [ - 'databox' => $databox, - 'errors' => $errors, - 'structure' => $structure, - 'errorsStructure' => $errorsStructure, - 'updateOk' => $updateOk - ]); - })->assert('databox_id', '\d+') - ->bind('database_display_stucture'); - - $controllers->post('/structure/{databox_id}/', function (Application $app, Request $request, $databox_id) { - if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) { - $app->abort(403); - } - - if (null === $structure = $request->request->get('structure')) { - $app->abort(400, $app->trans('Missing "structure" parameter')); - } - - $errors = \databox::get_structure_errors($app['translator'], $structure); - - $domst = new \DOMDocument('1.0', 'UTF-8'); - $domst->preserveWhiteSpace = false; - $domst->formatOutput = true; - - if (count($errors) == 0 && $domst->loadXML($structure)) { - $databox = $app['phraseanet.appbox']->get_databox($databox_id); - $databox->saveStructure($domst); - - return $app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 1]); - } else { - return $app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 0, 'error' => 'struct']); - } - })->assert('databox_id', '\d+') - ->bind('database_submit_stucture'); - - $controllers->get('/statusbit/{databox_id}/', function (Application $app, Request $request, $databox_id) { - if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) { - $app->abort(403); - } - - return $app['twig']->render('admin/statusbit.html.twig', [ - 'databox' => $app['phraseanet.appbox']->get_databox($databox_id), - ]); - })->assert('databox_id', '\d+') - ->bind('database_display_statusbit'); - - $controllers->get('/statusbit/{databox_id}/status/{bit}/', function (Application $app, Request $request, $databox_id, $bit) { - if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) { - $app->abort(403); - } - - $databox = $app['phraseanet.appbox']->get_databox($databox_id); - - $statusStructure = $databox->getStatusStructure(); - - switch ($errorMsg = $request->query->get('error')) { - case 'rights': - $errorMsg = $app->trans('You do not enough rights to update status'); - break; - case 'too-big': - $errorMsg = $app->trans('File is too big : 64k max'); - break; - case 'upload-error': - $errorMsg = $app->trans('Status icon upload failed : upload error'); - break; - case 'wright-error': - $errorMsg = $app->trans('Status icon upload failed : can not write on disk'); - break; - case 'unknow-error': - $errorMsg = $app->trans('Something wrong happend'); - break; - } - - if ($statusStructure->hasStatus($bit)) { - $status = $statusStructure->getStatus($bit); - } else { - $status = [ - "labeloff" => '', - "labelon" => '', - "img_off" => '', - "img_on" => '', - "path_off" => '', - "path_on" => '', - "searchable" => false, - "printable" => false, - ]; - - foreach ($app['locales.available'] as $code => $language) { - $status['labels_on'][$code] = null; - $status['labels_off'][$code] = null; - } - } - - return $app['twig']->render('admin/statusbit/edit.html.twig', [ - 'status' => $status, - 'errorMsg' => $errorMsg - ]); - })->assert('databox_id', '\d+') - ->assert('bit', '\d+') - ->bind('database_display_statusbit_form'); - - $controllers->post('/statusbit/{databox_id}/status/{bit}/delete/', function (Application $app, Request $request, $databox_id, $bit) { - if (!$request->isXmlHttpRequest() || !array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) { - $app->abort(400, $app->trans('Bad request format, only JSON is allowed')); - } - - if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) { - $app->abort(403); - } - - $databox = $app['phraseanet.appbox']->get_databox($databox_id); - - $error = false; - - try { - $app['status.provider']->deleteStatus($databox->getStatusStructure(), $bit); - } catch (\Exception $e) { - $error = true; - } - - return $app->json(['success' => !$error]); - }) + $controllers + ->post('/statusbit/{databox_id}/status/{bit}/delete/', 'controller.admin.root:deleteStatusBitAction') ->bind('admin_statusbit_delete') ->assert('databox_id', '\d+') ->assert('bit', '\d+'); - $controllers->post('/statusbit/{databox_id}/status/{bit}/', function (Application $app, Request $request, $databox_id, $bit) { - if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) { - $app->abort(403); - } - - $properties = [ - 'searchable' => $request->request->get('searchable') ? '1' : '0', - 'printable' => $request->request->get('printable') ? '1' : '0', - 'name' => $request->request->get('name', ''), - 'labelon' => $request->request->get('label_on', ''), - 'labeloff' => $request->request->get('label_off', ''), - 'labels_on' => $request->request->get('labels_on', []), - 'labels_off' => $request->request->get('labels_off', []), - ]; - - $databox = $app['phraseanet.appbox']->get_databox($databox_id); - - $app['status.provider']->updateStatus($databox->getStatusStructure(), $bit, $properties); - - if (null !== $request->request->get('delete_icon_off')) { - \databox_status::deleteIcon($app, $databox_id, $bit, 'off'); - } - - if (null !== $file = $request->files->get('image_off')) { - try { - \databox_status::updateIcon($app, $databox_id, $bit, 'off', $file); - } catch (AccessDeniedHttpException $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'rights', - ]); - } catch (\Exception_InvalidArgument $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'unknow-error', - ]); - } catch (\Exception_Upload_FileTooBig $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'too-big', - ]); - } catch (\Exception_Upload_Error $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'upload-error', - ]); - } catch (\Exception_Upload_CannotWriteFile $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'wright-error', - ]); - } catch (\Exception $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'unknow-error', - ]); - } - } - - if (null !== $request->request->get('delete_icon_on')) { - \databox_status::deleteIcon($app, $databox_id, $bit, 'on'); - } - - if (null !== $file = $request->files->get('image_on')) { - try { - \databox_status::updateIcon($app, $databox_id, $bit, 'on', $file); - } catch (AccessDeniedHttpException $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'rights', - ]); - } catch (\Exception_InvalidArgument $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'unknow-error', - ]); - } catch (\Exception_Upload_FileTooBig $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'too-big', - ]); - } catch (\Exception_Upload_Error $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'upload-error', - ]); - } catch (\Exception_Upload_CannotWriteFile $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'wright-error', - ]); - } catch (\Exception $e) { - return $app->redirectPath('database_display_statusbit_form', [ - 'databox_id' => $databox_id, - 'bit' => $bit, - 'error' => 'unknow-error', - ]); - } - } - - return $app->redirectPath('database_display_statusbit', ['databox_id' => $databox_id, 'success' => 1]); - })->assert('databox_id', '\d+') - ->assert('bit', '\d+') - ->bind('database_submit_statusbit'); + $controllers->post('/statusbit/{databox_id}/status/{bit}/', 'controller.admin.root:submitStatusBitAction') + ->assert('databox_id', '\d+') + ->assert('bit', '\d+') + ->bind('database_submit_statusbit'); return $controllers; } diff --git a/lib/classes/databox.php b/lib/classes/databox.php index af7ed71359..a17749aea4 100644 --- a/lib/classes/databox.php +++ b/lib/classes/databox.php @@ -12,6 +12,8 @@ use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Model\Entities\User; use Alchemy\Phrasea\Exception\InvalidArgumentException; +use Alchemy\Phrasea\Status\StatusStructure; +use Alchemy\Phrasea\Status\StatusStructureFactory; use Doctrine\DBAL\Connection; use Doctrine\DBAL\Driver\Statement; use Symfony\Component\Filesystem\Filesystem; @@ -305,12 +307,13 @@ class databox extends base } /** - * - * @return databox_status + * @return StatusStructure */ public function getStatusStructure() { - return $this->app['factory.status-structure']->getStructure($this); + /** @var StatusStructureFactory $structureFactory */ + $structureFactory = $this->app['factory.status-structure']; + return $structureFactory->getStructure($this); } /** @@ -1348,8 +1351,8 @@ class databox extends base } /** - * - * @param string $structure + * @param TranslatorInterface $translator + * @param string $structure * @return Array */ public static function get_structure_errors(TranslatorInterface $translator, $structure)