ConfigParameter liefern bei Modulaktivierung falsche Werte

Hallo zusammen,

zurzeit arbeit ich an einem Modul, welches eine zweite Datenbank auf dem Host mit der OXID-Db synchronisiert. Nach viel Recherchearbeit funktioniert das Modul an für sich nun auch sehr gut.

Ein letztes Problem bleibt:
Die Verbindungsdetails für die zu synchronisierende Datenbank sind vom Anwender in den Moduleinstellungen vor Benutzung anzugeben. Die Aktivierung des Moduls stößt direkt die initiale Synchronisation an (danach werden nur noch DB-Änderungen erfasst). Hierfür is im onActivate()-Event des Moduls eine DB-Verbindung auf Basis der besagten Verbindungsdaten in den Moduleinstellungen aufzubauen.
Leider scheint es so, als wäre ein Auslesen der Configs getConfigParam() zu diesem Zeitpunkt nicht möglich, denn als Ergebnis erhalte ich entweder leere oder sogar falsche Strings. Bei der späteren Synchronisationen funktioniert der Abruf einwandfrei, obwohl in beiden Fällen die Funktion _connectToSendyDb verwendet wird.

Nachfolgend die Funktion _connectToSendyDb()

  /**
   * Get sendy credentials from module configs and establish connection with mysqli drivers.
   *
   * @return mysqli $sendyDB connection object to sendy database
   */
  protected function _connectToSendyDb()
    {
    // get sendy database creds from module settings and connect
    $configs    = Registry::getConfig();
    $servername = $configs->getConfigParam('sHost');
    $username   = $configs->getConfigParam('sUsername');
    $password   = $configs->getConfigParam('sPassword');
    $dbname     = $configs->getConfigParam('sDbname');

    // TODO remove debugging line
    echo '$servername = ' . $servername . '<br>';
    echo '$username = '   . $username   . '<br>';
    echo '$password = '   . $password   . '<br>';
    echo '$dbname = '     . $dbname     . '<br>';

    //$sendyDB    = new mysqli($servername, $username, $password, $dbname);
    $sendyDB    = new mysqli('localhost', 'root', '', 'dbsendy');  //<- funktioniert auch im Call von onActivate() einwandfrei
    return $sendyDB;
    }

Ausgabe wenn ich im BackEnd auf den Aktivieren-Button des Moduls klicke:

$servername = https://txms.gzs.de:51384/
$username =
$password =
$dbname =

($servername sollte localhost sein, woher dieser value kommt, weiß ich nicht)

Ausgabe, wenn ich in der Moduleinstellungen auf Speichern klicke:

$servername = https://txms.gzs.de:51384/
$username = root
$password =
$dbname = dbsendy

(korrekte) Ausgabe, zu jedem anderen Zeitpunkt:

$servername = localhost
$username = root
$password =
$dbname = dbsendy

→ Ist das ein bekanntes Problem? Falls ja, gibt es gänige Lösungen?


Vielen Dank vorab und beste Grüße!




Falls weiterer Input nötig ist:

onActivate-Event

  public function onActivate()
    {
    // alter sendy userID field to fit in oxID's
    self::_executeSqlFile('install.sql');

    // execute initial sync of databases
    $oMaintenance = new kcs_sendysync__oxmaintenance();
    $oMaintenance->setCurrentTimestamp();
    $oMaintenance->syncAllUser();
    }

Die entsprechenden Settings in der metadata.php:

    'settings'     => array(
      array('group' => 'kcs_sendysync_sendydb',      'name' => 'sDbname',     'type' => 'str',  'value' => 'dbsendy'),
      array('group' => 'kcs_sendysync_sendydb',      'name' => 'sHost',       'type' => 'str',  'value' => 'localhost'),
      array('group' => 'kcs_sendysync_sendydb',      'name' => 'sUsername',   'type' => 'str',  'value' => 'root'),
      array('group' => 'kcs_sendysync_sendydb',      'name' => 'sPassword',   'type' => 'str',  'value' => '')
    )

Die 1.yaml ist bezüglich der Settings identisch.

Die Logs zeigen keinerlei Fehler an.

oxid 6.2+?
dann musst du ModuleSettingBridge verwenden, wie hier beschrieben:
https://docs.oxid-esales.com/developer/en/6.2/development/modules_components_themes/module/module_settings.html

1 Like

Achsoo, okay :slight_smile:
Danke für den Hinweis! Werde ich direkt ausprobieren

Funktioniert einwandfrei mit dem ModuleSettingBridgeInterface. Tja, lesen hätte wohl geholfen :sweat_smile:

Für’s Archiv hier die funktionierende Funktion:

  /**
   * Get sendy credentials from module configs and establish connection with mysqli drivers.
   *
   * @return mysqli $sendyDB connection object to sendy database
   */
  protected function _connectToSendyDb()
    {
    // get sendy database creds from module settings by use of settingBridge (OXID v6.2+)
    $moduleSettingBridge = ContainerFactory::getInstance()
      ->getContainer()
      ->get(ModuleSettingBridgeInterface::class);
    $servername = $moduleSettingBridge->get('sHost', self::$moduleName);
    $username   = $moduleSettingBridge->get('sUsername', self::$moduleName);
    $password   = $moduleSettingBridge->get('sPassword', self::$moduleName);
    $dbname     = $moduleSettingBridge->get('sDbname', self::$moduleName);

    $sendyDB = new mysqli($servername, $username, $password, $dbname);
    return $sendyDB;
    }
1 Like