Categories > TinyButStrong general (FR) >

Bug TBS avec php 5.2.1

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: nohrad
Date: 2007-06-18
Time: 14:13

Bug TBS avec php 5.2.1

Bonjour,

Depuis la mise à jour de php par mon hébergeur (OVH, phpinfo --> http://90plan.ovh.net/infos/test.beta), j'obtiens une erreur de type NOTICE avec TBS :

Error 8 (E_NOTICE)
Indirect modification of overloaded property Page::$_UserFctLst has no effect.
Dans le fichier /xxx/class.template.php à la ligne 2333

J'ai trouvé quelque chose lié à php à propos de cette erreur, mais je ne sais pas encore ce qu'il faut modifier dans la clas TBS.
http://www.nexen.net/actualites/trucs/heritage_des_tableaux_en_php_5.2.0.php

Voilà, si quelqu'un sait comment "patcher" la class TBS je suis preneur ;-)
By: Skrol29
Date: 2007-06-18
Time: 15:24

Re: Bug TBS avec php 5.2.1

Salut,

Est ce-que ton script surcharge la classe TBS ?
Peux-tu fournir un petit script qui permettrait de reproduire le message ?

By: nohrad
Date: 2007-06-18
Time: 16:08

Re: Bug TBS avec php 5.2.1

J'ai effectivement une classe nommée page qui étend la class TBS.

Voici un bout de cette class qui pose peut-être problème
class page extends clsTinyButStrong
{
   // instructions

   public function __get($var)
   {
      $var = strtolower($var);
      $arr = array_change_key_case($this->PageInfo);
      if($var == 'id') $var = 'id_page';

      return isset($arr[$var]) ? $arr[$var] : null;
   }

   public function __isset($var)
   {
       $var = strtolower($var);
       $arr = array_change_key_case($this->PageInfo);
       if($var == 'id') $var = 'id_page';

       if (!$isset = isset($this->$var)) {
           $isset = array_key_exists($var,$arr);
       }
       return $isset;
   }
  
   // instructions
}
By: Skrol29
Date: 2007-06-20
Time: 17:26

Re: Bug TBS avec php 5.2.1

Salut,

Ton extension n'y est probablement pour rien.
Mais je n'arrive pas à reproduire le bug. Je suis pourtant sur la bonne version de PHP.
Pourrais-tu donner plus d'indications sur ton code ? Le message d'erreur semble indiqué que tu fais appel à une fonction personnalisée sur "onload", "onformat" ou autre.
By: nohrad
Date: 2007-06-20
Time: 19:18

Re: Bug TBS avec php 5.2.1

J'ai un peu avancé sur l'origine de l'erreur. Cela vient à mon avis de la fusion avec une fonction utilisateur qui permet de faire des traductions.

Je te donne tout d'abord la trace retourné par mon gestionnaire d'exception

MyException Object
(
    [level] => 8
    [message] => Indirect modification of overloaded property Page::$_UserFctLst has no effect
    [file] => /XXX/lib/class.template.php
    [line] => 2338
    [string:private] =>
    [trace:private] => Array
        (
            [0] => Array
                (
                    [file] => /XXX/lib/class.template.php
                    [line] => 2338
                    [function] => error_handler
                    [args] => Array
                        (
                            [0] => 8
                            [1] => Indirect modification of overloaded property Page::$_UserFctLst has no effect
                            [2] => /XXX/lib/class.template.php
                            [3] => 2338
                            [4] => Array
                                (
                                    [FctInfo] => translate
                                    [FctCat] => f
                                    [FctObj] =>
                                    [ErrMsg] =>
                                    [FctId] => f:translate
                                    [FctStr] => translate
                                    [IsData] =>
                                    [Save] => 1
                                )

                        )

                )

            [1] => Array
                (
                    [file] => /XXX/lib/class.template.php
                    [line] => 637
                    [function] => meth_Misc_UserFctCheck
                    [class] => clsTinyButStrong
                    [type] => ->
                    [args] => Array
                        (
                            [0] => translate
                            [1] => f
                            [2] =>
                            [3] =>
                        )

                )

            [2] => Array
                (
                    [file] => /XXX/lib/class.page.php
                    [line] => 356
                    [function] => MergeField
                    [class] => clsTinyButStrong
                    [type] => ->
                    [args] => Array
                        (
                            [0] => lang
                            [1] => translate
                            [2] => 1
                        )

                )

            [3] => Array
                (
                    [file] => /XXX/lib/append.php
                    [line] => 2
                    [function] => CloseTemplate
                    [class] => Page
                    [type] => ->
                    [args] => Array
                        (
                        )

                )

            [4] => Array
                (
                    [file] => /XXX/index.php
                    [line] => 14
                    [args] => Array
                        (
                            [0] => /XXX/lib/append.php
                        )

                    [function] => require_once
                )

        )

)

Ensuite voilà comment interprété tout ça :
La page index.php inclut le fichier append.php.
Ce fichier permet notamment de lancer une méthode de la classe Page appelé CloseTemplate (la classe Page est ma classe qui étend la classe TBS).

Voilà la méthode close Template

public function CloseTemplate($show=true)
{
       global $user;

       $this->MergeField('user',$user);
       $this->MergeField('cst',get_defined_constants());
       $this->MergeField('lang','translate',true);
       $this->MergeBlock('js',$this->Js);
       $this->MergeBlock('css',$this->Css);
       $this->MergeFinal();

       if ($show == true)
       {
          header('Content-Type: text/html; charset='.$this->encoding.'');
          $this->Show();
          exit();
       }

          return $this->Source();
   }

D'après la trace l'erreur vient de la fonction translate que j'utilise lors de la fusion du champs lang ($this->MergeField('lang','translate',true);)

Voici le code de cette fonction :
function translate($Subname)
{
   $upper = ereg('^[A-Z]{1}.+',$Subname);
   $Subname = strtolower($Subname);

   if (isset($GLOBALS['translation'][$Subname]))
      return $upper ? ucfirst($GLOBALS['translation'][$Subname]) : $GLOBALS['translation'][$Subname];
   else
      return $Subname;

}

Voilà pour l'instant ce que j'ai réussit à identifier, mais je ne voit toujours pas pourquoi j'ai une telle erreur qui se produit.
By: nohrad
Date: 2007-07-01
Time: 10:22

Re: Bug TBS avec php 5.2.1

Voilà j'ai trouvé d'où venait le problème. C'était lié à la fonction magique __get que j'utilisais dans ma class page qui étendait la classe TBS.

En fait, si on fait un objet qui utilise ces fonctions, qu'une des propriétés indirecte de cet objet est un array, il ne faut pas utiliser directement cette table mais l'assigner a la fin...

Plus d'infos sur l'erreur : http://blog.thepimp.net/index.php/tag/overloaded%20property.

Et la modification du code TBS (ligne 2333)
if ($Save) $this->_UserFctLst[$FctId] = $FctInfo;
if($Save) $this->_UserFctLst = array_merge((array)$this->_UserFctLst,array($FctId => $FctInfo));
By: nohrad
Date: 2007-07-01
Time: 12:26

Re: Bug TBS avec php 5.2.1

Il semblerait qu'il y ai encore des problèmes avec TBS et des erreurs "overloaded property".

Error 8 (E_NOTICE)
Attention : Indirect modification of overloaded property user::$email has no effect.
Dans le fichier C:\wamp\www\Portalpes\_lib\class.template.php à la ligne 900

Le fichier class.template.php est toujours le fichier de la classe TBS.
Dans mon template j'ai un simple champs TBS du type [user.login].
En mon code de fusion est tout simplement le suivant
$TBS->MergeField('user',$user);

La subtilité de la chose c'est que $user est une instance de la classe user dont voici une partie du code
class user
{
   private $db;

   public $UserInfo;

   public function __construct($userId=0)
   {
       // mon constructeur
   }

   public function __get($var)
   {
      $var = strtolower($var);
      if($var == 'id') $var = 'id_user';
      return isset($this->UserInfo[$var]) ? $this->UserInfo[$var] : null;
   }

   public function __isset($var)
   {
       $var = strtolower($var);
       if($var == 'id') $var = 'id_user';
       if (!$isset = isset($this->$var)) {
           $isset = array_key_exists($var, $this->UserInfo);
       }
       return $isset;
   }
  
   // méthodes de la classe
   // ...
}

Encore une fois j'utilise les méthodes magiques __get et __isset.
Voilà, un exemple de ce que permet de faire la méthode __get
$user = new user($userId);
echo $user->id; // renvoie $userInfo['id_user'];
echo $user->id_user; // renvoie $userInfo['id_user'];
echo $user->name; // renvoie $userInfo['name'];
echo $user->Name; // renvoie $userInfo['name'];

Ainsi dans mon template TBS je peux avoir les champs suivants :
[user.id] / [user.id_user] / [user.name] / [user.Name]...

Mais comme tu voix cela bloque au niveau de la classe avec ces méthodes magiques... Est-ce que tu as des idées ???

PS : la solution que j'ai trouvé pour l'instant c'est de faire un $TBS->MergeField('user',$user->UserInfo) et de reformater tous les champs de mon templates (id devient id_user ; Name devient name...). Mais cela n'est pas l'idéla, car cela devait permettre d'avoir une liberté de notation pour l'utilisateur final qui peut modifier les templates...