2011-09-28 3 views
2

Je sais que je dois utiliser spl_autoload_register avec Smarty 3. J'enregistre ma fonction de chargement automatique après l'initialisation de smarty. Mais smarty essaie d'utiliser ma propre fonction de chargement automatique au lieu de la fonction smartyAutoload définie. Provoquer une erreur, car il ne peut évidemment pas trouver les fichiers smarty en utilisant mon autoload. Voici le code avec tout le reste découpé pour montrer comment il est mis en place actuellement. Je suis sûr que c'est juste un problème de placement de commande ou quelque chose comme ça.Smarty 3 et spl_autoload_register

<?php 
class application { 

    // include smarty 
    require_once(SMARTY_DIR.'Smarty.class.php'); 

    // init controller class which initializes smarty 
    $controller = new Controller(); 
} 

function autoLoader($class) { 

    // determine what type class it is and call from that directory 
    $dir = strtolower(strstr($class, '_', true)); 
    $name = substr(strtolower(strstr($class, '_')), 1); 

    switch($dir) { 

     case 'component': 

      break; 

     default: 
      require_once(LIB_PATH.DS.$name.'.class.php'); 
      break; 

    } 
} 

spl_autoload_register("autoLoader"); 

?> 
+0

peut-être un bug Smarty? Je suis tombé sur le même problème, mais en fait trouvé que le chargeur automatique Smarty allait bien. Il ne trouvait tout simplement pas la classe qu'il cherchait, et a donc passé l'appel à mon autoloader à la place. Mon autochargeur déclenche une erreur lorsque le fichier n'est pas trouvé, mais pas le Smarty. – cartbeforehorse

Répondre

2

Vous pouvez rendre votre chargeur automatique compatbile (c'est ce que spl_autoload_register est en fait pour) par ne ont besoin d'un fichier si c'est l'un de vos classes.

Vous pouvez le faire en vérifiant le nom de classe contre un espace de noms ou une liste blanche ou avec is_file (stocker la liste blanche dans le système de fichiers):

default: 
     $path = LIB_PATH.DS.$name.'.class.php'; 
     if (is_file($path)) require_once($path); 
     break; 
+0

Ah oui, même pas sûr pourquoi je n'ai pas pensé à ça. Mais je suis toujours curieux de la question sous-jacente. Parce que je pensais que les fonctions étaient appelées dans leur ordre enregistré. Depuis smartys était le premier, ne devrait-il pas appeler smartyAutoload d'abord en évitant l'erreur que je reçois? –

+0

Je ne connais pas spécifiquement la commande, mais 'require' fera une erreur fatale si le fichier n'existe pas/ne peut pas être inclus et s'arrête alors. Cela a-t-il résolu votre problème? – hakre

+0

Je viens de noter que même si j'appelle spl_autoload_register après mon initialisation smarty, il apparaît toujours comme la première fonction de chargement automatique lorsque j'appelle spl_autload_functions(). Je ne sais pas ce qui cause cela. –

0

Je ne sais pas si elle est pertinente pour vous , mais j'ai suivi mon problème jusqu'à un fichier appelé smarty_internal_templatecompilerbase.php, fonction callTagCompiler().

Mon code (à l'intérieur d'un fichier * .tpl) appelle une fonction plugin smarty. Ma fonction plugin est appelée Load_PO, ce qui signifie que le moteur Smarty recherche alors une classe nommée Smarty_Internal_Compile_Load_PO.

Bien sûr, ni le chargeur automatique Smarty, ni mon chargeur automatique personnalisé ne trouvent ce modèle. Le problème, en fait, était que mes erreurs de chargeur automatique quand un fichier n'est pas trouvé.

Le problème peut être résolu de 2 façons:

  1. Modifier mon auto-chargeur pour ignorent les recherches if (substr($class_name,0,24) = 'Smarty_Internal_Compile_')

  2. Modifier le fichier smarty_internal_templatecompilerbase.php et changement fonction callTagCompiler() comme indiqué ci-dessous

Modifier le code

class_exists ($class_name) 

Pour

class_exists ($class_name, false)