GeoPixel Posted August 8, 2019 Share Posted August 8, 2019 (edited) 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 September 4, 2019 by GeoPixel (see edit history) Link to comment Share on other sites More sharing options...
joseantgv Posted August 8, 2019 Share Posted August 8, 2019 Cron sirve para ejecutar URLs o scripts automáticamente. Pero para que el módulo haga eso tiene que estar preparado. Envía un mensaje al desarrollador. Link to comment Share on other sites More sharing options...
GeoPixel Posted August 8, 2019 Author Share Posted August 8, 2019 Entonces si en vez de un Módulo hago un Script con la misma funcionalidad si podría usarlo? Link to comment Share on other sites More sharing options...
joseantgv Posted August 8, 2019 Share Posted August 8, 2019 No había leído que eres el desarrollador. No te líes. Mira algún ejemplo de otro módulo que tire del cron y hazlo igual, es sencillo. Link to comment Share on other sites More sharing options...
GeoPixel Posted August 8, 2019 Author Share Posted August 8, 2019 (edited) 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 August 8, 2019 by GeoPixel (see edit history) Link to comment Share on other sites More sharing options...
ruthcast Posted February 14, 2020 Share Posted February 14, 2020 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 More sharing options...
Prestafan33 Posted February 15, 2020 Share Posted February 15, 2020 (edited) 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 February 15, 2020 by Prestafan33 (see edit history) Link to comment Share on other sites More sharing options...
ruthcast Posted February 16, 2020 Share Posted February 16, 2020 (edited) 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 February 16, 2020 by ruthcast (see edit history) Link to comment Share on other sites More sharing options...
Prestafan33 Posted February 16, 2020 Share Posted February 16, 2020 (edited) 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 February 16, 2020 by Prestafan33 (see edit history) 1 Link to comment Share on other sites More sharing options...
ruthcast Posted February 16, 2020 Share Posted February 16, 2020 Gracias @Prestafan33 ! Voy a hacerlo así para otra tarea que tengo que automatizar desde el modulo. 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