Sessions, pragma 0.11.3 und osc4pragmamx

Begonnen von AlternativeComputing, 24 August 2011, 21:13:13

⏪ vorheriges - nächstes ⏩

0 Mitglieder und 2 Gäste betrachten dieses Thema.

AlternativeComputing

Moin Moin,

Nun habe ich einige Probleme gefunden, die von der pragma Sessionverwaltung verursacht werden.

Dies mach ich mal mit der Original session und der vom pragma geschriebenen deutlich:

Original osCommerce Session:


sessiontoken|s:32:"b7cc61efcd00417b2ceeb2fcf0497abf";SESSION_USER_AGENT|s:64:"Opera/9.80 (X11; Linux i686; U; de) Presto/2.9.168 Version/11.50";SESSION_IP_ADDRESS|s:12:"92.76.77.218";cart|O:12:"shoppingCart":5:{s:8:"contents";a:2:{i:27;a:1:{s:3:"qty";i:1;}i:28;a:1:{s:3:"qty";i:3;}}s:5:"total";d:2749.9600000000000363797880709171295166015625;s:6:"weight";d:48;s:6:"cartID";s:5:"96877";s:12:"content_type";b:0;}language|s:7:"english";languages_id|s:1:"1";currency|s:3:"USD";navigation|O:17:"navigationHistory":2:{s:4:"path";a:3:{i:0;a:4:{s:4:"page";s:9:"index.php";s:4:"mode";s:6:"NONSSL";s:3:"get";a:0:{}s:4:"post";a:0:{}}i:1;a:4:{s:4:"page";s:16:"product_info.php";s:4:"mode";s:6:"NONSSL";s:3:"get";a:2:{s:11:"products_id";s:2:"28";s:6:"action";s:11:"add_product";}s:4:"post";a:1:{s:11:"products_id";s:2:"28";}}i:2;a:4:{s:4:"page";s:17:"shopping_cart.php";s:4:"mode";s:6:"NONSSL";s:3:"get";a:0:{}s:4:"post";a:0:{}}}s:8:"snapshot";a:4:{s:4:"page";s:21:"checkout_shipping.php";s:4:"mode";s:6:"NONSSL";s:3:"get";a:0:{}s:4:"post";a:0:{}}}


die Session vom pragma:


mxSVlang%7Cs%3A6%3A%22german%22%3BmxSVlasttime%7Ci%3A1314211334%3BmxSVlastmodu%7Cs%3A7%3A%22Catalog%22%3BmxSVck2%7Ci%3A1498942479%3BmxSVadmin%7Cs%3A64%3A%22xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx6%22%3BmxSVpanel%7Ci%3A1%3BmxSVsessiontoken%7Cs%3A32%3A%2291309a35c0199a499efa68175fa0b780%22%3BmxSVSESSION_USER_AGENT%7Cs%3A64%3A%22Opera%2F9.80%20%28X11%3B%20Linux%20i686%3B%20U%3B%20de%29%20Presto%2F2.9.168%20Version%2F11.50%22%3BmxSVSESSION_IP_ADDRESS%7Cs%3A11%3A%22192.168.1.2%22%3BmxSVcart%7CO%3A12%3A%22shoppingCart%22%3A5%3A%7Bs%3A8%3A%22contents%22%3Ba%3A4%3A%7Bs%3A7%3A%2222%7B5%7D10%22%3Ba%3A2%3A%7Bs%3A3%3A%22qty%22%3Bs%3A1%3A%221%22%3Bs%3A10%3A%22attributes%22%3Ba%3A1%3A%7Bi%3A5%3Bs%3A2%3A%2210%22%3B%7D%7Ds%3A6%3A%2226%7B3%7D8%22%3Ba%3A2%3A%7Bs%3A3%3A%22qty%22%3Bs%3A1%3A%221%22%3Bs%3A10%3A%22attributes%22%3Ba%3A1%3A%7Bi%3A3%3Bs%3A1%3A%228%22%3B%7D%7Di%3A23%3Ba%3A1%3A%7Bs%3A3%3A%22qty%22%3Bs%3A1%3A%221%22%3B%7Di%3A19%3Ba%3A1%3A%7Bs%3A3%3A%22qty%22%3Bs%3A1%3A%221%22%3B%7D%7Ds%3A5%3A%22total%22%3Bd%3A304.92000000000001591615728102624416351318359375%3Bs%3A6%3A%22weight%22%3Bd%3A32%3Bs%3A12%3A%22content_type%22%3Bb%3A0%3Bs%3A6%3A%22cartID%22%3Bs%3A5%3A%2274028%22%3B%7DmxSVlanguage%7Cs%3A6%3A%22german%22%3BmxSVlanguages_id%7Cs%3A1%3A%221%22%3BmxSVcurrency%7Cs%3A3%3A%22EUR%22%3BmxSVnavigation%7CO%3A17%3A%22navigationHistory%22%3A2%3A%7Bs%3A4%3A%22path%22%3Ba%3A1%3A%7Bi%3A0%3Ba%3A4%3A%7Bs%3A4%3A%22page%22%3Bs%3A11%3A%22modules.php%22%3Bs%3A4%3A%22mode%22%3BN%3Bs%3A3%3A%22get%22%3Ba%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A7%3A%22Catalog%22%3Bs%3A4%3A%22file%22%3Bs%3A12%3A%22product_info%22%3Bs%3A11%3A%22products_id%22%3Bs%3A1%3A%229%22%3B%7Ds%3A4%3A%22post%22%3Ba%3A0%3A%7B%7D%7D%7Ds%3A8%3A%22snapshot%22%3Ba%3A0%3A%7B%7D%7DmxSVuid%7Cs%3A1%3A%222%22%3BmxSVsendto%7Cs%3A1%3A%221%22%3BmxSVuser%7Cs%3A84%3A%22xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%3D%22%3BmxSVuser_uid%7Ci%3Axxx%3BmxSVuser_uname%7Cs%3A9%3A%22xxxxxxxxxx%22%3BmxSVck1%7Ci%3A1419549449%3BmxSVcustomer_default_address_id%7Cs%3A1%3A%221%22%3BmxSVcustomer_first_name%7Cs%3A3%3A%22Max%22%3BmxSVcustomer_country_id%7Cs%3A2%3A%2281%22%3BmxSVcustomer_zone_id%7Cs%3A2%3A%2279%22%3BmxSVnew_products_id_in_cart%7Ci%3A19%3B


Nun lieg der Fehler ab der "navigationHistory":
Hier müßten eigendlich nun alle im Modul besuchten Seiten auftauchen so wie hier:


"navigationHistory":2:{s:4:"path";a:3:{i:0;a:4:{s:4:"page";s:9:"index.php";s:4:"mode";s:6:"NONSSL";s:3:"get";a:0:{}s:4:"post";a:0:{}}i:1;a:4:{s:4:"page";s:16:"product_info.php";s:4:"mode";s:6:"NONSSL";s:3:"get";a:2:{s:11:"products_id";s:2:"28";s:6:"action";s:11:"add_product";}s:4:"post";a:1:{s:11:"products_id";s:2:"28";}}i:2;a:4:{s:4:"page";s:17:"shopping_cart.php";s:4:"mode";s:6:"NONSSL";s:3:"get";a:0:{}s:4:"post";a:0:{}}}


und nicht so:


%22navigationHistory%22%3A2%3A%7Bs%3A4%3A%22path%22%3Ba%3A1%3A%7Bi%3A0%3Ba%3A4%3A%7Bs%3A4%3A%22page%22%3Bs%3A11%3A%22modules.php%22%3Bs%3A4%3A%22mode%22%3BN%3Bs%3A3%3A%22get%22%3Ba%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A7%3A%22Catalog%22%3Bs%3A4%3A%22file%22%3Bs%3A12%3A%22product_info%22%3Bs%3A11%3A%22products_id%22%3Bs%3A1%3A%229%22%3B%7Ds%3A4%3A%22post%22%3Ba%3A0%3A%7B%7D%7D%7Ds


In der Original session sieht man deutlich, das alle besuchten Seiten in die Session geschrieben werden und beim pmx nur die letzte.

Vieleicht fällt Euch ja was auf oder ein.
MfG

Peter

AlternativeComputing

Die dazugehörige Codzeile in der application_top ist folgende:


  if (!mxSessionGetVar('navigation') || !is_object($navigation)) {
  $navigation = new navigationHistory;
  mxSessionSetVar('navigation', $navigation);
  }
$navigation->add_current_page();


nun ist es egal wie rum ich das mxSessionSet setze:


  if (!mxSessionGetVar('navigation') || !is_object($navigation)) {
  $navigation = new navigationHistory;
  }
$navigation->add_current_page();
  mxSessionSetVar('navigation', $navigation);


In beiden Fällen wird nur die letzte Seite in die Session geschrieben, was mir nun beim "$_POST" probleme macht, da keine Daten weitergegeben werden.

Die dazugehörige Classesdatei:

"modules/Catalog/includes/classes/navigation_history.php"


<?php
/**
 * This file is part of 
 * pragmaMx - Web Content Management System.
 * Copyright by pragmaMx Developer Team - http://www.pragmamx.org
 *
 * pragmaMx is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 ***************************************************************************************
 *
 * osCommerce, Open Source E-Commerce Solutions
 * http://www.oscommerce.com
 *
 * Copyright (c) 2010 osCommerce
 *
 * Converted to pragmaMX 0.1.11
 *
 * By Peter Stein aka BdMdesigN Copyright (c) 2009 - 2011
 * http://www.osc4pragmamx.org
 *
 * Released under the GNU General Public License V2 ONLY
 */

  
class navigationHistory {
    var 
$path$snapshot;

    function 
navigationHistory() {
      
$this->reset();
    }

    function 
reset() {
      
$this->path = array();
      
$this->snapshot = array();
    }

    function 
add_current_page() {
      global 
$PHP_SELF$request_type$cPath;

      
$set 'true';
      for (
$i=0$n=sizeof($this->path); $i<$n$i++) {
        if ( (
$this->path[$i]['page'] == basename($PHP_SELF)) ) {
          if (isset(
$cPath)) {
            if (!isset(
$this->path[$i]['get']['cPath'])) {
              continue;
            } else {
              if (
$this->path[$i]['get']['cPath'] == $cPath) {
                
array_splice($this->path, ($i+1));
                
$set 'false';
                break;
              } else {
                
$old_cPath explode('_'$this->path[$i]['get']['cPath']);
                
$new_cPath explode('_'$cPath);

                for (
$j=0$n2=sizeof($old_cPath); $j<$n2$j++) {
                  if (
$old_cPath[$j] != $new_cPath[$j]) {
                    
array_splice($this->path, ($i));
                    
$set 'true';
                    break 
2;
                  }
                }
              }
            }
          } else {
            
array_splice($this->path, ($i));
            
$set 'true';
            break;
          }
        }
      }

      if (
$set == 'true') {
        
$this->path[] = array('page' => basename($PHP_SELF),
                              
'mode' => $request_type,
                              
'get' => $this->filter_parameters($_GET),
                              
'post' => $this->filter_parameters($_POST));
      }
    }

    function 
remove_current_page() {
      global 
$PHP_SELF;

      
$last_entry_position sizeof($this->path) - 1;
      if (
$this->path[$last_entry_position]['page'] == basename($PHP_SELF)) {
        unset(
$this->path[$last_entry_position]);
      }
    }

    function 
set_snapshot($page '') {
      global 
$PHP_SELF$request_type;

      if (
is_array($page)) {
        
$this->snapshot = array('page' => $page['page'],
                                
'mode' => $page['mode'],
                                
'get' => $this->filter_parameters($page['get']),
                                
'post' => $this->filter_parameters($page['post']));
      } else {
        
$this->snapshot = array('page' => basename($PHP_SELF),
                                
'mode' => $request_type,
                                
'get' => $this->filter_parameters($_GET),
                                
'post' => $this->filter_parameters($_POST));
      }
    }

    function 
clear_snapshot() {
      
$this->snapshot = array();
    }

    function 
set_path_as_snapshot($history 0) {
      
$pos = (sizeof($this->path)-1-$history);
      
$this->snapshot = array('page' => $this->path[$pos]['page'],
                              
'mode' => $this->path[$pos]['mode'],
                              
'get' => $this->path[$pos]['get'],
                              
'post' => $this->path[$pos]['post']);
    }

    function 
debug() {
      for (
$i=0$n=sizeof($this->path); $i<$n$i++) {
        echo 
$this->path[$i]['page'] . '?';
        while (list(
$key$value) = each($this->path[$i]['get'])) {
          echo 
$key '=' $value '&';
        }
        if (
sizeof($this->path[$i]['post']) > 0) {
          echo 
'<br />';
          while (list(
$key$value) = each($this->path[$i]['post'])) {
            echo 
'&nbsp;&nbsp;<strong>' $key '=' $value '</strong><br />';
          }
        }
        echo 
'<br />';
      }

      if (
sizeof($this->snapshot) > 0) {
        echo 
'<br /><br />';

        echo 
$this->snapshot['mode'] . ' ' $this->snapshot['page'] . '?' tep_array_to_string($this->snapshot['get'], array(session_name())) . '<br />';
      }
    }

    function 
filter_parameters($parameters) {
      
$clean = array();

      if (
is_array($parameters)) {
        
reset($parameters);
        while (list(
$key$value) = each($parameters)) {
          if (
strpos($key'_nh-dns') < 1) {
            
$clean[$key] = $value;
          }
        }
      }

      return 
$clean;
    }

    function 
unserialize($broken) {
      for(
reset($broken);$kv=each($broken);) {
        
$key=$kv['key'];
        if (
gettype($this->$key)!="user function")
        
$this->$key=$kv['value'];
      }
    }
  }
?>

MfG

Peter

Andi

Moin :)

so ganz blick ich nicht durch....

Aber in der osc Klasse findet sich folgender Konstruktor:
    function navigationHistory() {
      $this->reset();
    }
 
und die ruft folgendes auf: function reset() {
      $this->path = array();
      $this->snapshot = array();
    }
... wo alles zurückgesetzt wird.

Bei jedem Aufruf von $navigation = new navigationHistory; wird also alles zurückgesetzt. Vermutlich liegt der Hund also schon vorher begraben...


Bitte entferne vor Veröffentlichung des Scriptes folgende Kommentare aus den Dateien: * This file is part of
* pragmaMx - Web Content Management System.
* Copyright by pragmaMx Developer Team - http://www.pragmamx.org
*
* pragmaMx is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.

... denn das stimmt ja so nicht,,,
schön´s Grüssle, Andi

AlternativeComputing

Moin Andi,

Auch wenn ich die reset Anweisung und die reset Funktion auskommentiere, komme ich zum selben Ergebnis.

Und wegen dem


* This file is part of
* pragmaMx - Web Content Management System.
* Copyright by pragmaMx Developer Team - http://www.pragmamx.org
*
* pragmaMx is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.


mach Dir keine Sorgen, ich überarbeite eh alle Kopfzeilen, bevor ich das Modul auf den Markt werfe.

Der Witz ist ja der:

mit der "osc_mainfile" funtioniert es, die löst aber ja konflikte mit der Original PMX "mailfile" aus. So wollte ich den weg über die Original "application_top" gehen. Aber halt mit der PMX Sessionverwaltung.

Die "application_top" habe ich mal hier angehängt, damit Du die von mir gemachten Streichungen und modifizierungen sehen kannst.
MfG

Peter