diff --git a/config/routes.yml b/config/routes.yml index d9d7120f..153482fb 100644 --- a/config/routes.yml +++ b/config/routes.yml @@ -5,6 +5,15 @@ admin_prettyblocks: _controller: 'PrestaSafe\PrettyBlocks\Controller\AdminThemeManagerController::indexAction' _legacy_controller: AdminThemeManagerController _legacy_link: AdminThemeManagerController +# route generator (for opening custom page in prettyblocks) + +prettyblocks_route_generator: + path: prettyblocks/route_generator/ + methods: [GET,POST] + defaults: + _controller: 'PrestaSafe\PrettyBlocks\Controller\AdminThemeManagerController::routeGeneratorAction' + _legacy_controller: AdminThemeManagerControllerRouteGenerator + _legacy_link: AdminThemeManagerControllerRouteGenerator prettyblocks_block_render: path: prettyblocks/block/ @@ -88,4 +97,5 @@ prettyblocks_theme_settings: defaults: _controller: 'PrestaSafe\PrettyBlocks\Controller\AdminThemeManagerController::getSettingsAction' _legacy_controller: AdminThemeManagerController - _legacy_link: AdminThemeManagerController \ No newline at end of file + _legacy_link: AdminThemeManagerController + diff --git a/prettyblocks.php b/prettyblocks.php index 06441373..054ead65 100755 --- a/prettyblocks.php +++ b/prettyblocks.php @@ -19,6 +19,8 @@ */ use PrestaSafe\PrettyBlocks\Core\Components\Title; use PrestaShop\PrestaShop\Core\Module\WidgetInterface; +use PrestaShop\PrestaShop\Adapter\SymfonyContainer; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; if (!defined('_PS_VERSION_')) { exit; @@ -52,6 +54,7 @@ class PrettyBlocks extends Module implements WidgetInterface 'displayHeader', 'actionDispatcher', 'actionFrontControllerSetVariables', + 'displayBackOfficeHeader', ]; public function __construct() @@ -149,14 +152,21 @@ private function removeDb() } public function getContent() + { + return Tools::redirect($this->getPrettyBlocksUrl()); + } + + private function getPrettyBlocksUrl() { $domain = Tools::getShopDomainSsl(true); - $symfonyUrl = $domain . Link::getUrlSmarty([ + + return $domain . Link::getUrlSmarty([ 'entity' => 'sf', 'route' => 'admin_prettyblocks', + ]); + - return Tools::redirect($symfonyUrl); } private function loadDefault() @@ -164,6 +174,18 @@ private function loadDefault() return Configuration::updateGlobalValue('_PRETTYBLOCKS_TOKEN_', Tools::passwdGen(25)); } + public function hookdisplayBackOfficeHeader($params) + { + $route = (new \Link())->getAdminLink('AdminThemeManagerControllerRouteGenerator'); + Media::addJsDef([ + 'prettyblocks_route_generator' => $route, + 'prettyblocks_logo' => HelperBuilder::pathFormattedToUrl('$/modules/prettyblocks/logo.png'), + ]); + + $this->context->controller->addJS($this->_path.'views/js/back.js'); + } + + public function install() { return parent::install() diff --git a/src/Controller/AdminThemeManagerController.php b/src/Controller/AdminThemeManagerController.php index 6eb8330c..a0d15a5d 100644 --- a/src/Controller/AdminThemeManagerController.php +++ b/src/Controller/AdminThemeManagerController.php @@ -208,6 +208,21 @@ public function indexAction() // url to load at startup : provided url or shop home page $startup_url = \Tools::getValue('startup_url', $shop_url); + if(\Tools::getValue('endpoint')){ + switch(\Tools::getValue('endpoint')) + { + case 'product': + $startup_url = $link->getProductLink((int)\Tools::getValue('id')); + break; + case 'category': + $startup_url = $link->getCategoryLink((int)\Tools::getValue('id')); + break; + case 'cms': + $startup_url = $link->getCMSLink((int)\Tools::getValue('id')); + break; + } + } + return $this->render('@Modules/prettyblocks/views/templates/admin/index.html.twig', [ 'css_back_custom' => $uri, 'base_url' => $link->getBaseLink(), @@ -614,4 +629,24 @@ protected function getLangLink($idLang = null, \Context $context = null, $idShop return \Language::getIsoById($idLang) . '/'; } + + + public function routeGeneratorAction(Request $request) + { + $posts = json_decode($request->getContent(), true); + $endpoint = $posts['endpoint']; + $id = (int)$posts['id']; + + $router = $this->get('router'); + $url = $router->generate('admin_prettyblocks', [ + 'endpoint' => $endpoint, + 'id' => $id, + ]); + return (new JsonResponse())->setData([ + 'url' => $url, + ]); + + + } + } diff --git a/views/js/back.js b/views/js/back.js new file mode 100644 index 00000000..cf02b657 --- /dev/null +++ b/views/js/back.js @@ -0,0 +1,64 @@ + +const addPrettyButton = (btnGroupClass = '.btn-group-action', endpoint, idEndpointTarget) => { + let btnGroups = document.querySelectorAll(btnGroupClass); + btnGroups.forEach(btnGroup => { + let id_cms = parseInt(btnGroup.closest('tr').querySelector(idEndpointTarget).textContent); + + // Début de la sélection + let newElement = document.createElement('a'); + newElement.innerHTML = "edit in prettyblocks"; + newElement.dataset.endpoint = endpoint; + newElement.dataset.idEndpoint = id_cms; + newElement.dataset.action = "open_in_prettyblocks"; + // Fin de la sélection + btnGroup.prepend(newElement); + }); +} + +document.addEventListener('DOMContentLoaded', function() { + +// CMS LIST Button +if (document.body.classList.contains('admincmscontent')) { + addPrettyButton('.btn-group-action', 'cms', '.column-id_cms'); +} + +// Product LIST Button +if (document.body.classList.contains('adminproducts')) { + addPrettyButton('.btn-group-action', 'product', '.column-id_product'); +} +if (document.body.classList.contains('admincategories')) { + addPrettyButton('.btn-group-action', 'category', '.column-id_category'); +} + + +// Début de la sélection +let prettyBlocksButtons = document.querySelectorAll('[data-action="open_in_prettyblocks"]'); +// Fin de la sélection +prettyBlocksButtons.forEach(button => { + button.addEventListener('click', function(event) { + event.preventDefault(); + // Ajoutez ici le code à exécuter lors du clic sur le bouton + let endpoint = button.dataset.endpoint; + let idEndpoint = button.dataset.idEndpoint; + let action = button.dataset.action; + let url = prettyblocks_route_generator; + + // Début de la sélection + fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + endpoint: endpoint, + id: idEndpoint, + }), + }) + .then(response => response.json()) + .then(data => window.open(data.url, '_self')); + // Fin de la sélection + }); +}); + + +}) \ No newline at end of file