Jump to content

[SOLUCIONADO] Automatizar ejecución de Módulo


GeoPixel

Recommended Posts

Buenos días,

Tengo creado un módulo que tiene la funcionalidad de exportar un archivo .csv.

Necesito automatizar el proceso para que dicho módulo se ejecute una vez al día. En resumen que me exporte un .csv diariamente de manera automática.

He buscado formas de hacerlo y he encontrado un módulo llamado CronTab que serviría para ello, pero me pide una URL para ejecutarlo. El problema es que mi módulo no dispone de URL de ejecución o mejor dicho no se como crear dicha URL.

No se si hay alguna otra manera de automatizar el proceso o con el mismo CronTab.

Gracias

Edited by GeoPixel (see edit history)
Link to comment
Share on other sites

Lo he podido solucionar de la siguiente manera, por si a alguien le ayuda en un futuro:

He creado la siguiente función el mi módulo:

 public function getContent()
    {
        $store_url = $this->context->link->getBaseLink();
        $this->context->smarty->assign(array(
            'nombremodulo_cron' => $store_url . 'modules/nombremodulo/nombremodulo-cron.php?token=' . Tools::substr(Tools::encrypt('nombremodulo/cron'), 0, 10) . '&id_shop=' . $this->context->shop->id,

        ));

        /**
         * If values have been submitted in the form, process.
         */
        if (((bool)Tools::isSubmit('submitnombremoduloModule')) == true) {
            $this->postProcess();
        }

        $this->context->smarty->assign('module_dir', $this->_path);

        return $this->display(__FILE__, 'views/templates/admin/configuration.tpl'); 
        
    }

Y a continuación lo renderizo en el .tpl (en las views del módulo):

<div class="panel">
   <h3><i class="icon icon-tags"></i> {l s='URL Cron'}</h3>
   <p>
     <a href="{$nombremodulo_cron|escape:'htmlall':'UTF-8'}" target="_blank">{$nombremodulo_cron|escape:'htmlall':'UTF-8'}</a><br>
   </p>
</div>

 

Edited by GeoPixel (see edit history)
Link to comment
Share on other sites

  • 5 months later...

Hola @GeoPixel Antes que nada gracias por tu aporte, acabo de hacer un modulo que generar un archivo .csv con información de productos desde una api y actualiza el inventario. También necesito ejecutarlo con una tarea programada y estoy tratando de usar tu código pero no me ha funcionado. Como configuraste tu modulo? el script que ejecuta la tarea de exportacion en tu caso lo metiste dentro de una función en tu modulo?.

 

Agradecida de antemano.

Link to comment
Share on other sites

Yo creo que la forma más sencilla de hacerlo es creando un controlador que reciba la url y ejecute luego la función que necesites. De este modo lo puedes ejecutar tanto directamente desde el navegador tecleando la url como programarlo en el módulo de cron o en el programador de tareas del hosting (si lo tiene).

Ejemplo:

class MisFeedsFeedModuleFrontController extends ModuleFrontController
{
  
  public function initContent()
  {
    parent::initContent();
    if (!Configuration::get('MIS_FEEDS_ACTIVO')) {
      echo 'MODULO DESACTIVADO';
      die();
    }
    if (!Tools::isSubmit('key') || (Tools::getValue('key') != $this->module->secret_key)) {
      echo 'NO AUTORIZADO';
      die();
    }
    
    if (Tools::isSubmit('action')) {
      $action = Tools::getValue('action');
      switch ($action) {
        case 'generarFeed':
          $this->module->generateFeeds();
          echo 'FEEDS GENERADOS EL '.date('Y-m-d H:i:s');
          break;
      }
    }
    die();
  }
}

Y esto funcionaría usando la url:

https://tusitio.com/module/misFeeds/feed?action=generarFeed&key=mi_clave_secreta

Edited by Prestafan33 (see edit history)
Link to comment
Share on other sites

Hola @Prestafan33 Excelente tu aporte! Respecto a lo de realizarlo con un controlador desde el principio intente hacerlo de esa manera guiandome por un aporte que hiciste en otro hilo, aprovecho que estas por aqui  quiero consultarte algo (Y perdona pero es que soy nueva desarrollando en prestashop). Este controlador ¿donde estaría ubicado en la estructura del modulo? ¿En la raiz donde esta el archivo.php del modulo o en la carpeta controller? En ese ultimo caso, ¿sería un controlador Front o Admin?. Logré resolver lo de la llamada al cron con un script que desarrollé y coloque en un archivo.php en la raiz del modulo y al que solo le incluí los siguientes lineas antes del codigo:

require_once __DIR__ . '/../../config/config.inc.php';

require_once __DIR__ . '/miarchivoprincipal.php';

/*Mi codigo*/

Luego implementé lo compartido por @geoPixel haciendo referencia a ese archivo en donde el se refiere al archivo.php. Pero me encanta tambien tu aporte por la posibilidad de ejecutar el script con la URL desde el navegador.

Muchas Gracias.

Edited by ruthcast (see edit history)
Link to comment
Share on other sites

El controlador iría dentro del directorio de tu módulo, en controllers/front, en este caso sería controllers/front/feed.php. Y luego tendrías que declararlo dentro de la clase del módulo,  en el método __construct, por ejemplo:

public function __construct()
{
	...
	$this->controllers = array('feed');
}

Como es un controlador al que se va a acceder desde el front-end de la web (es decir, no requiere de estar logueado en el backend para poder usarlo), es un controlador "front". Eso sí, para que no lo pueda usar cualquier sin ningún control es por lo que es una buena idea usar un parámetro "key" en la URL que nos asegure su uso sólo conociendo la clave. En el código que he puesto en el mensaje anterior está implementada la comprobación de esa key.

Como tú indicas también funciona, es más, hay algunos módulos que lo hacen como tú lo has puesto, por lo que es un método perfectamente válido. Yo lo suelo meter en un controlador, porque así me da el juego de poder usar la variable "action" que le paso por GET mediante la URL para poder hacer más cosas. Por ejemplo:

action=generarFeed -> Generar el feed (manualmente desde el navegador o programándolo en algún gestor de tareas).

action=rutaFeed -> Ver la ruta donde se ha almacenado el feed.

action=infoFeed -> Mostrar el log de operaciones de creación del feed.

... y así lo que se te ocurra.

Edited by Prestafan33 (see edit history)
  • Thanks 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...