2009-06-21 7 views
1

Y at-il un moyen pour que je puisse profiter d'une fonction decodeValue() en PHP? Je poste ces valeurs encodedValue dans un fichier PHP et j'ai besoin de travailler avec eux en PHP en tant que tableau.ExtJS: DecodeValue en PHP

Comment puis-je me retrouver avec un tableau PHP ou quelque chose de l'état codé dans Ext? Ou, y a-t-il un autre moyen de travailler les valeurs encodées pour pouvoir les lire facilement en PHP? Voici le code de fonction:

decodeValue : function(cookie){ 
     var re = /^(a|n|d|b|s|o)\:(.*)$/; 
     var matches = re.exec(unescape(cookie)); 
     if(!matches || !matches[1]) return; // non state cookie 
     var type = matches[1]; 
     var v = matches[2]; 
     switch(type){ 
      case "n": 
       return parseFloat(v); 
      case "d": 
       return new Date(Date.parse(v)); 
      case "b": 
       return (v == "1"); 
      case "a": 
       var all = []; 
       var values = v.split("^"); 
       for(var i = 0, len = values.length; i < len; i++){ 
        all.push(this.decodeValue(values[i])); 
       } 
       return all; 
      case "o": 
       var all = {}; 
       var values = v.split("^"); 
       for(var i = 0, len = values.length; i < len; i++){ 
        var kv = values[i].split("="); 
        all[kv[0]] = this.decodeValue(kv[1]); 
       } 
       return all; 
      default: 
       return v; 
     } 
    } 

Merci.

Répondre

1

Voici mon port pour PHP. J'ai utilisé la classe DateTime au lieu de Date car c'est l'équivalent PHP le plus proche, mais vous pouvez aussi utiliser strftime() pour obtenir un horodatage Unix, ou n'importe quelle méthode que vous préférez. De même, pour le type 'o', je renvoie un tableau plutôt qu'un objet, saisi par les noms de paramètres de l'objet.

Voici le code:

function decodeValue($cookie) { 
    $cookie = urldecode($cookie); 
    $re = '/^(a|n|d|b|s|o)\:(.*)$/'; 
    $matches = array(); 
    preg_match($re, $cookie, $matches); 
    if(!$matches || !$matches[1]) return; // non state cookie 
    $type = $matches[1]; 
    $v = $matches[2]; 
    switch ($type){ 
     case "n": 
      return floatval($v); 
     case "d": 
      return new DateTime($v); 
     case "b": 
      return ($v == "1" ? true : false); 
     case "a": 
      $all = array(); 
      $values = explode('^', $v); 
      $len = count($values); 
      for ($i = 0; $i < $len; $i++) { 
       $all.push(decodeValue($values[$i])); 
      } 
      return $all; 
     case "o": 
      $all = array(); 
      $values = explode('^', $v); 
      $len = count($values); 
      for($i = 0; $i < $len; $i++){ 
       $kv = explode('=', $values[$i]); 
       $all[$kv[0]] = decodeValue($kv[1]); 
      } 
      return $all; 
     default: 
      return $v; 
    } 
} 
1

Correction d'un bug dans le code. Maintenant, le deuxième niveau/troisième tableau de niveau devrait fonctionner correctement.

function decodeValue($cookie) { 
    $cookie = urldecode($cookie); 
    $re = '/^(a|n|d|b|s|o)\:(.*)$/'; 
    $matches = array(); 
    preg_match($re, $cookie, $matches); 
    if(!$matches || !$matches[1]) return $cookie; // non state cookie 
    $type = $matches[1]; 
    $v = $matches[2]; 

    switch ($type){ 
     case "n": 
      return floatval($v); 
     case "d": 
      return new DateTime($v); 
     case "b": 
      return ($v == "1" ? true : false); 
     case "a": 
      $all = array(); 
      $values = explode('^', $v); 
      $len = count($values); 
      for ($i = 0; $i < $len; $i++) { 
       $all.array_push(decodeValue($values[$i])); 
      } 
      return $all; 
     case "o": 
      $all = array(); 
      $values = explode('^', $v); 
      $len = count($values); 
      for($i = 0; $i < $len; $i++){ 
       $kv = explode('=', $values[$i],2); 
       if(count($kv)==1){ 
        $all[] = decodeValue($kv[0]); 
       }else{ 
        $all[$kv[0]] = decodeValue($kv[1]); 
       } 
      } 
      return $all; 
     default: 
      return $v; 
    } 
} 
1
$all.array_push(decodeValue($values[$i])); 

besoin d'être remplacé par

$all[] = decodeValue($values[$i]);