Manuel_GT Posted August 7, 2023 Share Posted August 7, 2023 Buenas tardes. Supongo que es fruto de un aprendizaje desordenado y a base de golpes, prueba y error, pero lo cierto es que ya llevo 6 módulos desarrollados para mi tienda (1.7.8.8), de lo más diferentes y me acabo de encontrar con un problema que debe ser de principiante total. Resulta que en un módulo tengo un javascript que hace una llamada ajax para recuperar los datos de un selector en un formulario de configuración. Acabo de descubrir que todos mis módulos, cuando entro en sus páginas de BO, hacen esa llamada. Y es que claro, el javascript está en una función hookBackOfficeHeader con lo que se carga en el header de todas las páginas del admin. Y mi pregunta es, ¿como puedo limitar la carga de este javascript SOLO al BO de su módulo? Alguna comprobación que añadir en el hook para evitar su carga en otros módulos. Estoy empleando $this->context->controller->addJS para añadirlo. Gracias. Link to comment Share on other sites More sharing options...
ventura Posted August 8, 2023 Share Posted August 8, 2023 Lo mejor es condicionar la carga a la pagina de configuración del módulo o al controlador en concreto, ejemplo if ((Tools::getValue('controller') == 'AdminOrders' || Tools::getValue('configure') == $this->name ) { .................. .............. } 2 Link to comment Share on other sites More sharing options...
Manuel_GT Posted August 8, 2023 Author Share Posted August 8, 2023 Gracias @ventura Lo cierto es que así lo puse ayer como parche temporal después de publicar el post, pero me inspiré en la linea del addJS para la condición. // Solo cargamos el js si estamos en el controller del módulo if ($this->context->controller->controller_name == 'AdminCalculator') { $this->context->controller->addJS($this->_path . 'views/js/back.js'); ... Pensaba que me había equivocado de hook y que quizás había uno más correcto o específico. Link to comment Share on other sites More sharing options...
ventura Posted August 8, 2023 Share Posted August 8, 2023 El mas recomendable seria actionAdminControllerSetMedia Link to comment Share on other sites More sharing options...
ExpertoPrestaShop Posted August 8, 2023 Share Posted August 8, 2023 46 minutes ago, Manuel_GT said: // Solo cargamos el js si estamos en el controller del módulo if ($this->context->controller->controller_name == 'AdminCalculator') { $this->context->controller->addJS($this->_path . 'views/js/back.js'); Si quieres cargar el JS desde un AdminController, este código no es necesario en el archivo principal del módulo, porque los AdminControllers tiene un metodo llamado setMedia que es donde debes cargar todos sus JS. Link to comment Share on other sites More sharing options...
Manuel_GT Posted August 8, 2023 Author Share Posted August 8, 2023 Hola @ExpertoPrestaShop Tu aportación me resulta muy interesante, pero tengo una duda. Mis controladores del BO ya son Symfony y extienden FrameworkBundleAdminController, y esa clase no tiene el método que comentas. ¿Acaso se llama de otra forma? Entiendo que el código anterior dejará de funcionar (como tantas otras cosas) cuando las clases principales de un modulo se implementen por completo en Symfony. Mientras tanto, vivimos en una mezcla de dos mundos (legacy <-> Symfony) bastante difícil de manejar. Yo intento implementar en Symfony todo lo que puedo y me machaca la moral tener que meter código legacy de vez en cuando porque aún es la única manera de hacerlo. Por ejemplo, los permisos de acceso a los métodos en el BO, o las definiciones de las rutas con coletillas legacy: defaults: _controller: 'mymodule\Controller\AdminMymoduleController::indexAction' _legacy_controller: AdminMymodule _legacy_link: AdminMymodule Me he planteado eliminar el hook y poner el js directamente en las plantillas que lo necesitan {% block javascripts %} {{ parent() }} <script src="{{ asset('../modules/mymodule/views/js/back.js') }}"></script> {% endblock %} Link to comment Share on other sites More sharing options...
ventura Posted August 8, 2023 Share Posted August 8, 2023 En un admin controller legacy, public function setMedia($isNewTheme = false) { // setMedia MUST be called before postProcess parent::setMedia($isNewTheme); $this->addJS(_MODULE_DIR_ . $this->module->name . '/views/js/mimodulo.js'); } En un controller de admin que extienda FrameworkBundleAdminController, algo asi public function init() { parent::init(); $this->addJS(__PS_BASE_URI__.'modules/mimodulo/js/miarchivo.js'); } 1 Link to comment Share on other sites More sharing options...
ExpertoPrestaShop Posted August 9, 2023 Share Posted August 9, 2023 On 8/8/2023 at 10:41 AM, Manuel_GT said: {% block javascripts %} {{ parent() }} <script src="{{ asset('../modules/mymodule/views/js/back.js') }}"></script> {% endblock %} Esto es lo que hacen otros modulos como por ejemplo el ps_linklist. Para saber como hacer algo en Prestashop, siempre recomiendo revisar como lo hacen otros modulos, de preferencia los nativos, porque normalmente son desarrollados por el mismo equipo que desarrolla el PS. 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now