/** * {@inheritdoc} */ public function __invoke() { TwigHelper::addCss('file:///Admin/vendor/bootstrap/dist/css/bootstrap.min.css'); TwigHelper::addCss('file:///Admin/vendor/font-awesome/css/font-awesome.min.css'); TwigHelper::addCss('file:////code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css'); TwigHelper::addCss('file:///Admin/css/AdminLTE.min.css', 10); TwigHelper::addCss('file:///Admin/css/skins/skin-blue.min.css', 20); TwigHelper::addJs('file:////oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js'); TwigHelper::addJs('file:////oss.maxcdn.com/respond/1.4.2/respond.min.js', 10); TwigHelper::addJs('file:///Admin/vendor/jquery/dist/jquery.min.js', 20); TwigHelper::addJs('file:///Admin/vendor/bootstrap/dist/js/bootstrap.min.js', 30); TwigHelper::addJs('file:///Admin/js/app.min.js', 40); $template = 'dashboard'; $args = func_get_args(); TwigHelper::addMasterTwig('@Admin/master.twig'); /** @var \Twig_Environment $twig */ $twig = $this->getContainer()->get('twig'); $twig->addGlobal('menu', Menu::generate()); if (!empty($args) && $args[0] == 'bundles') { $this->getRouter()->setPrefix(['admin', 'bundles']); array_shift($args); $args = implode('/', $args); $response = $this->forward($args, $this->getRequest()->getMethod()); $this->getResponder()->setData('response', $response); } else { if ($args) { $template = implode('/', $args); } } $this->getResponder()->setData('template', $template); }
/** * Get DataTable * * @return Table * @throws \DataTable\Exception */ protected function getDataTable() { TwigHelper::addCss('file:///Admin/vendor/datatables/media/css/jquery.dataTables.min.css', 100); TwigHelper::addJs('file:///Admin/vendor/jquery/dist/jquery.min.js', 20); TwigHelper::addJs('file:///Admin/vendor/datatables/media/js/jquery.dataTables.min.js', 100); TwigHelper::addJs(' function deleteUser(id) { if (confirm(\'Delete this user?\')) { $.ajax({ type: "DELETE", url: \'users/\' + id, success: function(affectedRows) { if (affectedRows > 0) window.location = \'users\'; } }); } }', 110); $table = new Table(); $col = new Column(); $col->setTitle('Username')->setData('Users.username'); $table->addColumn($col); $col = new Column(); $col->setTitle('Email')->setData('Users.email'); $table->addColumn($col); $col = new Column(); $col->setTitle('Status')->setData('Users.status')->isSearchable(false)->setFormatter(function ($status, User $user) { $statuses = [0 => 'Inactive', 1 => 'Active', 2 => 'Banned']; return $statuses[$status]; }); $table->addColumn($col); $router = $this->getRouter(); $col = new Column\Action(); $col->setManager(function (Column\ActionBuilder $action, User $user) use($router) { /* TODO Admin RBAC */ if (true) { $action->addAction('edit', 'Edit', $router->generateUrl(['users', $user->get('id')])); $action->addAction('delete', 'Delete', 'javascript:deleteUser("' . $user->get('id') . '");'); } })->setTitle('Actions'); $table->addColumn($col); $table->setDataSource(new CakePHP($this->getUsers(), $this->getRequest()->getRequestTarget())); return $table; }
private function generateDatatable() { TwigHelper::addCss('file:///Admin/vendor/datatables/media/css/jquery.dataTables.min.css', 100); TwigHelper::addJs('file:///Admin/vendor/jquery/dist/jquery.min.js', 20); TwigHelper::addJs('file:///Admin/vendor/datatables/media/js/jquery.dataTables.min.js', 100); TwigHelper::addJs(' function deletePage(id) { if (confirm(\'Delete this user?\')) { $.ajax({ type: "DELETE", url: \'pages/\' + id, success: function(affectedRows) { if (affectedRows > 0) window.location = \'pages\'; } }); } }', 110); /** @var \Cake\ORM\Table $pagesTable */ $pagesTable = TableRegistry::get('Pages.Pages'); $pages = $pagesTable->find(); $table = new Table(); $col = new Column(); $col->setTitle('Title')->setData('Pages.title'); $table->addColumn($col); $col = new Column(); $col->setTitle('Slug')->setData('Pages.slug'); $table->addColumn($col); $router = $this->getRouter(); $col = new Column\Action(); $col->setManager(function (Column\ActionBuilder $action, Entity $page) use($router) { if (true) { $action->addAction('edit', 'Edit', $router->generateUrl(['pages', $page->get('slug'), 'edit'])); $action->addAction('delete', 'Delete', 'javascript:deletePage("' . $page->get('slug') . '");'); } })->setTitle('Actions'); $table->addColumn($col); $table->setDataSource(new CakePHP($pages, $this->getRequest()->getRequestTarget())); if ($this->getRequest()->isAjax()) { die($table->getResponse()); } $this->getResponder()->setData('table', $table->render()); $this->getResponder()->setData('pages', $pages); }
/** * Get DataTable * * @return Table * @throws \DataTable\Exception */ protected function getDataTable() { TwigHelper::addCss('file:///Admin/vendor/datatables/media/css/jquery.dataTables.min.css', 100); TwigHelper::addJs('file:///Admin/vendor/jquery/dist/jquery.min.js', 20); TwigHelper::addJs('file:///Admin/vendor/datatables/media/js/jquery.dataTables.min.js', 100); TwigHelper::addJs(' function deleteRole(id) { if (confirm(\'Delete this role?\')) { $.ajax({ type: "DELETE", url: \'roles/\' + id, success: function(affectedRows) { if (affectedRows > 0) window.location = \'users/roles\'; } }); } }', 110); $table = new Table(); $col = new Column(); $col->setTitle('name')->setData('Roles.name'); $table->addColumn($col); $col = new Column(); $col->setTitle('title')->setData('Roles.title'); $table->addColumn($col); $router = $this->getRouter(); $col = new Column\Action(); $col->setManager(function (Column\ActionBuilder $action, Role $role) use($router) { /* TODO Admin RBAC */ if (true) { $action->addAction('edit', 'Edit', $router->generateUrl(['users', 'roles', $role->get('id')])); $action->addAction('delete', 'Delete', 'javascript:deleteRole("' . $role->get('id') . '");'); } })->setTitle('Actions'); $table->addColumn($col); $table->setDataSource(new CakePHP($this->getRoles(), $this->getRequest()->getRequestTarget())); return $table; }
/** * {@inheritdoc} */ public function loadService() { $this->getContainer()->setShared('twig', function () { $loader = new \Twig_Loader_Filesystem([]); $loader->addPath(SRC_DIR . "/App/Resource/template"); foreach (Bundles::getLoaded() as $bundleName) { if (is_dir(SRC_DIR . "/{$bundleName}/Resource/template/")) { $loader->addPath(SRC_DIR . "/{$bundleName}/Resource/template", $bundleName); } } $loader->addPath(ROOT_DIR . '/vendor/symfony/twig-bridge/Resources', 'TwigBridgeTemplates'); if (Config::get('debug', false)) { $options = ['debug' => true, 'cache' => false]; } else { $options = ['debug' => false, 'cache' => CACHE_DIR . '/twig/']; } $twig = new \Twig_Environment($loader, $options); if (Config::get('debug', false)) { $twig->addExtension(new Twig_Extension_Debug()); } // add route generator function $twig->addFunction(new \Twig_SimpleFunction('generateUrl', function ($url = null, $withParams = true, $withLanguage = true, $incDomain = true) { $router = $this->getRouter(); return $router->generateUrl($url, [Router::GEN_OPT_LANGUAGE => $withLanguage, Router::GEN_OPT_WITH_PARAMS => $withParams, Router::GEN_OPT_INC_DOMAIN => $incDomain]); })); $twig->addFunction(new \Twig_SimpleFunction('getService', function ($name, array $args = []) { return $this->getContainer()->get($name, $args); })); /** @var Registry $registry */ $registry = $this->getContainer()->get('registry'); // return css tags $twig->addFunction(new \Twig_SimpleFunction('getCss', function ($css = null, $priority = 0) use($registry) { $result = $registry->get(TwigHelper::GLOBAL_CSS, TwigHelper::TWIG_REGISTRY_SCOPE); if (null !== $css) { $result = [['css' => $css, 'priority' => $priority]]; } if (is_array($result)) { foreach ($result as $row) { $order[] = $row['priority']; } array_multisort($order, $result); array_walk($result, function (&$item) { $item = $item['css']; // if it is direct link to file if (strpos($item, 'file://') === 0) { $item = substr($item, 7); $item = "<link rel=\"stylesheet\" href=\"{$item}\">"; } else { $item = "<style>\n{$item}\n</style>"; } }); $result = implode("\n", $result); } return strval($result); }, ['is_safe' => ['html']])); // return js tags $twig->addFunction(new \Twig_SimpleFunction('getJs', function ($js = null, $priority = 0) use($registry) { $result = $registry->get(TwigHelper::GLOBAL_JS, TwigHelper::TWIG_REGISTRY_SCOPE); if (null !== $js) { $result = [['js' => $js, 'priority' => $priority]]; } if (is_array($result)) { foreach ($result as $row) { $order[] = $row['priority']; } array_multisort($order, $result); array_walk($result, function (&$item) { $item = $item['js']; // if it is direct link to file if (strpos($item, 'file://') === 0) { $item = substr($item, 7); $item = "<script src=\"{$item}\"></script>"; } else { $item = "<script>\n{$item}\n</script>"; } }); $result = implode("\n", $result); } return strval($result); }, ['is_safe' => ['html']])); $twig->addFunction(new \Twig_SimpleFunction('addCss', function ($css, $priority = 0) { TwigHelper::addCss($css, $priority); })); $twig->addFunction(new \Twig_SimpleFunction('addJs', function ($js, $priority = 0) { TwigHelper::addJs($js, $priority); })); // return master twig $twig->addFunction(new \Twig_SimpleFunction('getMasterTwig', function () use($registry) { $result = $registry->get(TwigHelper::MASTER_TWIG, TwigHelper::TWIG_REGISTRY_SCOPE); $item = array_pop($result); $registry->set(TwigHelper::MASTER_TWIG, $result, TwigHelper::TWIG_REGISTRY_SCOPE); return strval($item); }, ['is_safe' => ['html']])); Library\Helper::addMasterTwig('@App/master.twig'); $renderer = new TwigRendererEngine(['@TwigBridgeTemplates/views/Form/form_div_layout.html.twig']); $renderer->setEnvironment($twig); $twig->addExtension(new FormExtension(new TwigRenderer($renderer))); $twig->addExtension(new TranslationExtension(new IdentityTranslator())); return $twig; }); $this->getContainer()->setShared('form_factory', function () { if (class_exists('Symfony\\Component\\Validator\\Mapping\\Factory\\LazyLoadingMetadataFactory')) { $metadataFactory = new LazyLoadingMetadataFactory(new StaticMethodLoader()); } else { $metadataFactory = new ClassMetadataFactory(new StaticMethodLoader()); } $builder = Validation::createValidatorBuilder()->setConstraintValidatorFactory(new ConstraintValidatorFactory())->setTranslationDomain('validators')->setMetadataFactory($metadataFactory); $extensions = [new HttpFoundationExtension(), new ValidatorExtension($builder->getValidator())]; return Forms::createFormFactoryBuilder()->addExtensions($extensions)->setResolvedTypeFactory(new ResolvedFormTypeFactory())->getFormFactory(); }); }
/** * Get DataTable * * @return Table * @throws \DataTable\Exception */ protected function getDataTable() { TwigHelper::addCss('file:///Admin/vendor/datatables/media/css/jquery.dataTables.min.css', 100); TwigHelper::addJs('file:///Admin/vendor/datatables/media/js/jquery.dataTables.min.js', 100); TwigHelper::addJs(' function deleteCategory(id) { if (confirm(\'Delete this category?\')) { $.ajax({ type: "DELETE", url: \'categories/\' + id, success: function(affectedRows) { if (affectedRows > 0) window.location = \'categories\'; } }); } }', 110); $table = new Table(); $col = new Column(); $col->setTitle('Slug')->setData('Categories.slug'); $table->addColumn($col); $col = new Column(); $col->setTitle('Title')->setData('Categories.title'); $table->addColumn($col); $col = new Column(); $col->setTitle('Scope')->setData('Categories.scope'); $table->addColumn($col); $col = new Column(); $col->setTitle('Parent')->setData('Categories.parent_id')->isSearchable(false)->setFormatter(function ($parentId, Category $category) { if (null === $parentId) { return '-'; } return $category->parentCategory->get('title'); }); $table->addColumn($col); $router = $this->getRouter(); $col = new Column\Action(); $col->setManager(function (Column\ActionBuilder $action, Category $category) use($router) { /* TODO Admin RBAC */ if (true) { $action->addAction('edit', 'Edit', $router->generateUrl(['categories', $category->get('id')])); $action->addAction('delete', 'Delete', 'javascript:deleteCategory("' . $category->get('id') . '");'); } })->setTitle('Actions'); $table->addColumn($col); $table->setDataSource(new CakePHP($this->getCategories(), $this->getRequest()->getRequestTarget())); return $table; }