Drupal 7: XT-Commerce Session Zugriff

Autor: Sven am Thu, 28.02.2013 - 21:36

XT-Commerce ist ein bekanntes und viel genutzes Shopsystem, bietet aber wenig Möglichkeiten im Bereich Onsite Content Management. Ausgangspunkt war eine Shopinstallation im Root-Verzeichnis und eine Drupal-Installation in einem Unterverzeichnis. In Drupal wurden nun die folgenden Daten benötigt:

  1. Warenkorb
  2. Kunde (eingeloggt oder nicht)

XT-Commerce verfügt über ein eigenes Session Handling. Die Daten werden "verschlüsselt" in der Datenbank gespeichert und müssen auf Drupalseite "entschlüsselt" werden. Das Tutorial zeigt die notwendigen Schritte um die Sessiondaten aus XT-Commerce in Drupal verfügbar zu machen. Dieses sollte sich von der Grundtechnik auch auf andere Content Management Systeme übertragen lassen.

Nun zu den einzelnen Schritten die für die Integration notwendig sind:

  1. Die Zugangsdaten zur XT-Commerce Datenbank müssen in der settings.php hinterlegt werden, diese sieht das in etwa so aus:
    $databases = array (
      'default' =>
      array (
        'default' =>
        array (
          'database' => 'DRUPAL_DB',
          'username' => 'DRUPAL_USER',
          'password' => 'DRUPAL_PASSWORD',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => 'DRUPAL_PREFIX',
        ),
      ),
      'shop' =>
      array (
        'default' =>
        array (
          'database' => 'SHOP_DB',
          'username' => 'SHOP_USER',
          'password' => 'SHOP_PASSWORD',
          'host' => 'localhost',
          'port' => '',
          'driver' => 'mysql',
          'prefix' => 'SHOP_PREFIX',
        ),
      ),
    );
    
  2. Nun zum eigentlichen Modul, benötigt werden die beiden Daten "shop.info" und "shop.module":

    shop.info:

    name = XT-Commerce
    description = Provides access to XT-Commerce shop session data
    version = 7.x-1.x
    core = 7.x
    

    shop.module:

    /**
     * Implements hook_boot().
     */
    function xtc_session_boot() {
      // Load stored store cart and login data
      // We need to login in to shop db and get session data from db directly
      $session = false;
      foreach ($_COOKIE as $value) {
        if (is_string($value) && strlen($value) == '32') {
          $session = $value;
          break;
        }
      }
    
      $shop = array();
      if ($session) {
        db_set_active('shop');
        $query = "SELECT sessdata FROM {xt_sessions2} WHERE sesskey = :key AND expiry > :time";
        $result = db_query($query, array(':key' => $session, ':time' => REQUEST_TIME))->fetchField();
        db_set_active();
    
        if ($result) {
          // Init classes to prevent errors
          class customer {
            var $customers_id;
          }
    
          class cart {
            var $content = array();
          }
    
          $a = preg_split("/(\w+)\|/", rawurldecode($result), -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
          for ($i = 0; $i < count($a); $i = $i + 2) {
            $shop[$a[$i]] = unserialize($a[$i + 1]);
          }
        }
      }
    
      $_SESSION['shop'] = $shop;
    }
    

    Erläuterungen warum hook_boot(): Dieser hook wird vor den Modulen und Themes ausgeführt und somit werden die Inhalte nicht gecachet was extrem wichtig ist.

  3. Ab jetzt stehen unter $_SESSION['shop'] alle Sessiondaten aus XT-Commerce zur Verfügung

Das Modul steht als bald als Sandboxprojekt auf Drupal.org zur Verfügung.