Jump to content

Limitar la carga de un javascript exclusivamente al BO de su módulo


Recommended Posts

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

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 ) {

..................

..............

}

 

  • Like 2
Link to comment
Share on other sites

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

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

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

 

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');
  } 

 

  • Thanks 1
Link to comment
Share on other sites

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.

  • Like 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...