Mise à jour automatique de LDAP?

Bonjour,

J’ai mis en placer un « travail planifié » qui met à jour la base de donnée de dolibarr (changement de type d’adhérent en fonction de la date de fin d’adhésion) comme expliqué ici.
Ça fonctionne parfaitement, la bdd se met à jour comme je le souhaite.
En revanche, la synchro dolibarr vers LDAP n’est pas faite puisque la modification de bdd est faite en dehors d’une modification par « triggers ».

Je pense qu’il faut que j’appelle le fichier adherents/type_ldap.php dans un « travail planifié » mais je ne sais pas comment remplir les autres champs.

Module adherents
Nom de fichier intégrant la classe adherents/type_ldap.php

ça ok mais ensuite…?

Instance/objet à créer ???
Méthode ???
Paramètres ???

Sachant que l’idée serait de mettre à jour tous les types d’adhérents chaque soir après le travail planifié de mise àç jour de la bdd.

Merci par avance pour vos éclairement et votre aide.

en me basant sur le fichier adherents/type_ldap.php, j’ai créé le fichier suivant adherents/updateLDAPTypeAdherents.php

    <?php
    require '../main.inc.php';
    require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php';
    require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';
    require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php';
    require_once DOL_DOCUMENT_ROOT.'/core/class/ldap.class.php';
    require_once DOL_DOCUMENT_ROOT.'/core/lib/ldap.lib.php';

    public function updateLDAPTypeAdherents() {
      $action = 'dolibarr2ldap';
      $object = new AdherentType($db);
      foreach ($object->liste_array() as $idOfTypeAdherent => $TypeAdherent) {

       $object->fetch($idOfTypeAdherent);

       // Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
       $hookmanager->initHooks(array('membertypeldapcard', 'globalcard'));

       $parameters = array();
       $reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
       if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');

       if (empty($reshook)) {
         $ldap = new Ldap();
         $result = $ldap->connect_bind();

         if ($result > 0) {
           $object->listMembersForMemberType('', 1);
           $info = $object->_load_ldap_info();
           $dn = $object->_load_ldap_dn($info);
           $olddn = $dn; // We can say that old dn = dn as we force synchro

           $result = $ldap->update($dn, $info, $user, $olddn);
         }

         if ($result >= 0) {
           setEventMessages($langs->trans("MemberTypeSynchronized"), null, 'mesgs');
         }
         else {
           setEventMessages($ldap->error, $ldap->errors, 'errors');
         }
       }
     }
     $db->close();
    }
    ?>

En paramétrant un « travail planifié » de cette façon :

Libellé maj LDAP Type adhérents vers non-adhérents
Type de travail planifié Appelle d’une méthode d’une classe Dolibarr
Module adherents
Nom de fichier intégrant la classe adherents/updateLDAPTypeAdherents.php
Instance/objet à créer Adherent
Méthode updateLDAPTypeAdherents

je peux lancer le « travail planifié », je ne reçoit aucune erreur mais il reste sur l’état « Actif (En cours) » et ne semble jamais finir.
Qu’en pensez-vous?

J’ai trouvé.
Voici le script que j’ai créé à partir du script /var/www/html/dolibarr/scripts/members/sync_members_types_dolibarr2ldap.php et que j’ai appelé /var/www/html/dolibarr/scripts/members/update_members_types_dolibarr2ldap.php :

<?php
/**
 * \file scripts/members/update_members_types_dolibarr2ldap.php
 * \ingroup ldap core
 * \brief Script de mise a jour des types de membres dans LDAP depuis base Dolibarr
 */
$sapi_type = php_sapi_name();
$script_file = basename(__FILE__);
$path = __DIR__ . '/';

// Test if batch mode
if (substr($sapi_type, 0, 3) == 'cgi') {
    echo "Error: You are using PHP for CGI. To execute " . $script_file . " from command line, you must use PHP for CLI mode.\n";
    exit(- 1);
}

if (! isset($argv[1]) || ! $argv[1]) {
    print "Usage: " . $script_file . " now\n";
    exit(- 1);
}
$now = $argv[1];

require_once $path . "../../htdocs/master.inc.php";
require_once DOL_DOCUMENT_ROOT . "/core/class/ldap.class.php";
require_once DOL_DOCUMENT_ROOT . "/adherents/class/adherent_type.class.php";
require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php';

// Global variables
$version = DOL_VERSION;
$error = 0;

/*
 * Main
 */

@set_time_limit(0);
print "***** " . $script_file . " (" . $version . ") pid=" . dol_getmypid() . " *****\n";
dol_syslog($script_file . " launched with arg " . join(',', $argv));

$sql = "SELECT rowid";
$sql .= " FROM " . MAIN_DB_PREFIX . "adherent_type";

$resql = $db->query($sql);
if ($resql) {
    $num = $db->num_rows($resql);
    $i = 0;

    $ldap = new Ldap();
    $result = $ldap->connect_bind();

    if ($result > 0) {
        while ($i < $num) {
            $ldap->error = "";

            $obj = $db->fetch_object($resql);

            $membertype = new AdherentType($db);
            $membertype->id = $obj->rowid;
            $membertype->fetch($membertype->id);
            $membertype->listMembersForMemberType('', 1);

            $info = $membertype->_load_ldap_info();
            $dn = $membertype->_load_ldap_dn($info);
            $olddn = $dn; // We can say that old dn = dn as we force synchro

            $result = $ldap->update($dn, $info, $user, $olddn);
            if ($result >= 0) {
                setEventMessages($langs->trans("MemberTypeSynchronized"), null, 'mesgs');
            }
            else {
                setEventMessages($ldap->error, $ldap->errors, 'errors');
            }
            $i ++;
        }

        $ldap->unbind();
        $ldap->close();
    } else {
      setEventMessages($ldap->error, $ldap->errors, 'errors');
    }
} else {
    return "Issue with the database";
}

et j’ai paramétré mon « travail planifié » ainsi :

Libellé maj LDAP Type adhérents vers non-adhérents
Type de travail planifié Commande terminal
Commande php /var/www/html/dolibarr/scripts/members/update_members_types_dolibarr2ldap.php now
Commentaire Mise à jour de LDAP suite à la mise à jour de la base de données de Dolibarr du Type adhérents vers non-adhérents de tous les adhérents sauf bénévoles dont la date de fin adhésion est dépassé d’un mois.

Si je ne reviens pas demain pour dire que le cron n’a pas fonctionné cette nuit, c’est que ça fonctionne.

En espérant que cela aide d’autres personnes.

3 « J'aime »