Jump to content

Recherche moyen d' Activer/Désactier module automatiquement durant plage horaire


ced13

Recommended Posts

Bonjour, comme décrit dans le titre je cherche un code overdrive afin d' éviter des erreur lors de synchronisation fournisseur/produit car 1 module en synchro permanente et un module en synchro tache cron de 00h00 a 8h00 du matin, un petit peu d'aide serait la bien venu Svp en vous remerciant d'avance du temps que vous allez m'accorder

Link to comment
Share on other sites

J'ai fait un test php avec ce code mais j"obtiens une erreur 500 

<?php
require_once(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');

$module_name = 'spmgsnipreview';
$start_time = strtotime('08:00:00'); // heure de début
$end_time = strtotime('14:25:00'); // heure de fin

if (Module::isEnabled($module_name)) {
    $current_time = strtotime(date('H:i:s'));
    if ($current_time < $start_time || $current_time > $end_time) {
        Module::disable($module_name);
    }
} else {
    $current_time = strtotime(date('H:i:s'));
    if ($current_time >= $start_time && $current_time <= $end_time) {
        Module::enable($module_name);
    }
}

Auriez vous une piste de travail

Link to comment
Share on other sites

18 hours ago, Mediacom87 said:

Erreur 500 = activer mode debug pour identifier et corriger l'erreur.

Voici les erreur que j'obtiens en debug, J'ai essayé avec un autre module spmgsnipreview/ps_categoryproducts pour voir mais même résultat

(1/1) FatalThrowableError

Using $this when not in object context

in Module.php line 955

at ModuleCore::disable('ps_categoryproducts')in activedesactivemodule.php line 12

 

Merci

 

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

Normal, vous n'utilisez pas les méthodes static.

Il faut utiliser les bonnes méthodes et pour ce faire, il suffit de lire la classe à laquelle vous faites référence.

Par exemple, vous cherchez à utiliser

public function disable($force_all = false)

$force_all est booléen et vous lui attribuez le nom du module, donc encore plus incohérent.

Certainement que vous vouliez utiliser cette méthode

public static function disableByName($name)

Qui est annoncé comme déprécié depuis la 1.7

Mais comme vous ne semblez pas passer par un controller propre, on ne va pas s'offusquer plus que cela.

Link to comment
Share on other sites

27 minutes ago, Mediacom87 said:

Certainement que vous vouliez utiliser cette méthode

public static function disableByName($name)

Qui est annoncé comme déprécié depuis la 1.7

Mais comme vous ne semblez pas passer par un controller propre, on ne va pas s'offusquer plus que cela.

J' ai trouver une méthode simple avec un fichier simple qui fonctionne pour l'activation :

<?php
require_once(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');

// on récupère l'instance de la classe "Module"
$module = Module::getInstanceByName('Nomdevotremodule');

// on vérifie si le module est installé
if ($module->active) {
    // on désactive le module
    $module->disable();
    echo "Module désactivé.";
} else {
    echo "Le module est déjà désactivé.";
}

?>

et un fichier qui fonctionne pour la désactivation

<?php
require_once(dirname(__FILE__).'/config/config.inc.php');
require_once(dirname(__FILE__).'/init.php');

// on récupère l'instance de la classe "Module"
$module = Module::getInstanceByName('nomdevotremodule');

// on vérifie si le module est installé
if (!$module->active) {
    // on active le module
    $module->enable();
    echo "Module activé.";
} else {
    echo "Le module est déjà activé.";
}

?>

et je fait ensuite 2 appel via tache cron une pour l'activation et une pour la désactivation,

 

Ps: si vous avez des observations je suis preneur (sécurité - optimisation ou autres ) Merci Mediacom87

Link to comment
Share on other sites

51 minutes ago, Mediacom87 said:

Le token ne sécurise pas réellement, juste, il identifie l'appel.

Vous auriez dû faire un module avec un controller.

je vais essayé si j'y arrive je mettrais le lien du module 

Link to comment
Share on other sites

On 1/28/2023 at 8:07 PM, doekia said:

Le plus simple et surement le plus efficace est d'injecter dans le constructeur du module la plage horaire et de changer le status actif/inactif dans l'instance

auriez vous une piste de travail car pour l'instant je galère un peu, voila ce que j 'ai fait comme code :  

<?php

class ps_disablemodule extends Module
{
    public function __construct()
    {
        $this->name = 'ps_disablemodule';
        $this->tab = 'administration';
        $this->version = '1.0.0';
        $this->author = 'Vous-même';
        $this->need_instance = 0;
        $this->ps_versions_compliancy = array('min' => '1.7.0.0', 'max' => _PS_VERSION_);
        $this->bootstrap = true;

        parent::__construct();

        $this->displayName = $this->l('Désactiver le module');
        $this->description = $this->l('Permet de désactiver le module ps_mmoconnector');

        $this->confirmUninstall = $this->l('Êtes-vous sûr de vouloir désinstaller ce module?');

        if (!Configuration::get('PS_DISABLEMODULE_NAME')) {
            $this->warning = $this->l('Aucun nom de module n\'a été configuré');
        }
    }

    public function install()
    {
        return parent::install() && $this->registerHook('displayBackOfficeHeader');
    }

    public function uninstall()
    {
        return parent::uninstall();
    }

    public function getContent()
    {
        $output = null;
        if (Tools::isSubmit('submit'.$this->name)) {
            $module_name = strval(Tools::getValue('PS_DISABLEMODULE_NAME'));
            if (!$module_name || empty($module_name) || !Validate::isModuleName($module_name)) {
                $output .= $this->displayError($this->l('Invalid module name'));
            } else {
                Configuration::updateValue('PS_DISABLEMODULE_NAME', $module_name);
                $output .= $this->displayConfirmation($this->l('Settings updated'));
            }
        }
        return $output.$this->displayForm();
    }

    public function displayForm()
    {
        // Get default language
        $default_lang = (int)Configuration::get('PS_LANG_DEFAULT');

        // Init Fields form array
        $fields_form[0]['form'] = [
            'legend' => [
                'title' => $this->l('Settings'),
            ],
            'input' => [
                [
                    'type' => 'text',
                    'label' => $this->l('Module name'),
                    'name' => 'PS_DISABLEMODULE_NAME',
                    'size' => 20,
                    'required' => true
                ]
            ],
			
			$fields_form[0]['form']['input'][] = array(
    'type' => 'select',
    'label' => $this->l('Select hour'),
    'name' => 'PS_DISABLEMODULE_HOUR',
    'options' => array(
        'query' => array(
            array('id_option' => '0', 'name' => '12 AM'),
            array('id_option' => '1', 'name' => '1 AM'),
            array('id_option' => '2', 'name' => '2 AM'),
            // ...
            array('id_option' => '22', 'name' => '10 PM'),
            array('id_option' => '23', 'name' => '11 PM'),
        ),
        'id' => 'id_option',
        'name' => 'name'
    )
);
			
            'submit' =>[
'title' => $this->l('Save'),
'class' => 'btn btn-default pull-right'
]
];
    $helper = new HelperForm();

    // Module, token and currentIndex
    $helper->module = $this;
    $helper->name_controller = $this->name;
    $helper->token = Tools::getAdminTokenLite('AdminModules');
    $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name;

    // Language
    $helper->default_form_language = $default_lang;
    $helper->allow_employee_form_lang = $default_lang;

    // Title and toolbar
    $helper->title = $this->displayName;
    $helper->show_toolbar = true;        // false -> remove toolbar
    $helper->toolbar_scroll = true;      // yes - > Toolbar is always visible on the top of the screen.
    $helper->submit_action = 'submit'.$this->name;
    $helper->toolbar_btn = [
        'save' => [
            'desc' => $this->l('Save'),
            'href' => AdminController::$currentIndex.'&configure='.$this->name.'&save'.$this->name.
            '&token='.Tools::getAdminTokenLite('AdminModules'),
        ],
        'back' => [
            'href' => AdminController::$currentIndex.'&token='.Tools::getAdminTokenLite('AdminModules'),
            'desc' => $this->l('Back to list')
        ]
    ];

    // Load current value
    $helper->fields_value['PS_DISABLEMODULE_NAME'] = Configuration::get('PS_DISABLEMODULE_NAME');

    return $helper->generateForm($fields_form);
}

public function hookDisplayBackOfficeHeader()
{
    $module_name = Configuration::get('PS_DISABLEMODULE_NAME');
    if ($module_name) {
        $module = Module::getInstanceByName($module_name);
        if ($module) {
            $module->disable();
        }
    }
}
}

 

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...