Smarty Forum Index Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon.

erreur configuration smarty3

 
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: French
View previous topic :: View next topic  
Author Message
gtraxx
Smarty Regular


Joined: 08 Jan 2008
Posts: 56

PostPosted: Thu Oct 01, 2009 11:36 am    Post subject: erreur configuration smarty3 Reply with quote

Bonjour,
je tend désespérément d'utiliser ma classe d'extension de smarty 2 avec smarty 3.
Ce message apparais :

Quote:
Fatal error: Uncaught exception 'Exception' with message 'Sysplugin file method.smarty.php does not exist' in /var/www/html/monsite/lib/smarty3/Smarty.class.php:521 Stack trace: #0 [internal function]: Smarty->__call('smarty', Array) #1 /var/www/html/monsite/app/config/class.smarty.php(40): Smarty->smarty() #2 /var/www/html/monsite/app/admin/controller/admin.php(61): mySmarty->__construct() #3 /var/www/html/monsite/management/login.php(19): admin_controller_admin->__construct() #4 {main} thrown in /var/www/html/monsite/lib/smarty3/Smarty.class.php on line 521


Voila ma classe pour étendre smarty (elle fonctionne avec le 2)

Code:
class MySmarty extends Smarty{
   /**
    * var root url
    *
    * @var string
    */
   public $root;
   public $serv;
   /**
    * function construct class
    *
    */
   public function __construct(){
      /**
       * include parent var smarty
       */
      parent::Smarty();
      $this->serv = $_SERVER['DOCUMENT_ROOT'];
      self::setParams();
      /*
       You can remove this comment, if you prefer this JSP tag style
       instead of the default { and }
       $this->left_delimiter =  '<%';
       $this->right_delimiter = '%>';
       */
   }
   protected function setParams() {
      /**
       * Path -> configs
       */
      $this->config_dir = $this->serv."/app/config/configs/";
      /**
       * Path -> templates
       */
      $this->template_dir = $this->serv."/skin/";
      /**
       * path plugins
       * @var void
       */
      $this->plugins_dir = array($this->serv.'/lib/smarty3/plugins/', $this->serv.'/lib/extends/');
      /**
       * Path -> compile
       */
      $this->compile_dir = $this->serv."/var/templates_c/";
      /**
       * debugging (true/false)
       */
      $this->debugging = false;
      /**
       * compile (true/false)
       */
      $this->compile_check = true;
      /**
       * caching (true/false)
       */
      $this->caching = false;
      /**
       * Use sub dirs (true/false)
       */
      $this->use_sub_dirs = false;
      /**
       * cache_dir -> cache
       */
      $this->cache_dir = $this->serv.'/var/cache/';
      /**
       * Security
       */
      $this->security = false;
   }
}
Back to top
View user's profile Send private message
Gowser
Smarty Pro


Joined: 19 Feb 2008
Posts: 104
Location: Nantes (France)

PostPosted: Fri Oct 02, 2009 7:16 am    Post subject: Reply with quote

Bonjour,

Il faudrait que vous modifiez à la ligne 17

Code:

/**
* include parent var smarty
*/
parent::__construct();


plutôt que

Code:

/**
* include parent var smarty
*/
parent::Smarty();


Cela permet de ne plus avoir le message d'erreur.

Testé avec ce fichier :
Code:

<?php
require_once 'Smarty.class.php';

class MySmarty extends Smarty{
   /**
    * var root url
    *
    * @var string
    */
   public $root;
   public $serv;
   /**
    * function construct class
    *
    */
   public function __construct(){
      /**
       * include parent var smarty
       */
      parent::__construct();
      $this->serv = $_SERVER['DOCUMENT_ROOT'];
      self::setParams();
      /*
       You can remove this comment, if you prefer this JSP tag style
       instead of the default { and }
       $this->left_delimiter =  '<%';
       $this->right_delimiter = '%>';
       */
   }
   protected function setParams() {
      /**
       * Path -> configs
       */
      $this->config_dir = $this->serv."/app/config/configs/";
      /**
       * Path -> templates
       */
      $this->template_dir = $this->serv."/skin/";
      /**
       * path plugins
       * @var void
       */
      $this->plugins_dir = array($this->serv.'/lib/smarty3/plugins/', $this->serv.'/lib/extends/');
      /**
       * Path -> compile
       */
      $this->compile_dir = $this->serv."/var/templates_c/";
      /**
       * debugging (true/false)
       */
      $this->debugging = false;
      /**
       * compile (true/false)
       */
      $this->compile_check = true;
      /**
       * caching (true/false)
       */
      $this->caching = false;
      /**
       * Use sub dirs (true/false)
       */
      $this->use_sub_dirs = false;
      /**
       * cache_dir -> cache
       */
      $this->cache_dir = $this->serv.'/var/cache/';
      /**
       * Security
       */
      $this->security = false;
   }
}

$smarty = new MySmarty();
$smarty->display('index.tpl');
?>


++
Back to top
View user's profile Send private message Send e-mail
gtraxx
Smarty Regular


Joined: 08 Jan 2008
Posts: 56

PostPosted: Fri Oct 02, 2009 11:28 am    Post subject: Reply with quote

Merci,
maintenant il ne reconnais pas mes plugins perso de smarty 2

Quote:
Fatal error: Uncaught exception 'Exception' with message 'Syntax Error in template "/var/www/html/monsite/skin/frontend/common/head.phtml" on line 13 " <link rel="alternate" type="application/rss+xml" title="RSS" href="{getUrl}/rss.xml" /> " unknown tag "getUrl"' in /var/www/html/monsite/lib/smarty3/sysplugins/internal.templatecompilerbase.php:253 Stack trace: #0 /var/www/html/monsite/lib/smarty3/sysplugins/internal.templatecompilerbase.php(178)

Mes plugins perso se trouve dans un autre dossier :
Code:
$this->plugins_dir = array($this->serv.'/lib/smarty3/plugins/', $this->serv.'/lib/extends/');

La variable plugins_dir existe elle toujours ?
Car logiquement il devrait interpréter mes plugins même s'il comporte une ou deux erreurs à corriger pour l'update.[/code]
Back to top
View user's profile Send private message
Gowser
Smarty Pro


Joined: 19 Feb 2008
Posts: 104
Location: Nantes (France)

PostPosted: Fri Oct 02, 2009 11:53 am    Post subject: Reply with quote

Oui elle existe toujours.

Concernant les plugins_dir, ceux définit dans votre constructeur font référence à $_SERVER['DOCUMENT_ROOT'] qui renvoie un chemin avec un '/' final ce qui peut avoir un impact car les chemin référencé par la suite seront interprétés de la sorte :

$this->serv.'/lib/smarty3/plugins/' => /chemin_root//lib/smarty3/plugins/

et

$this->serv.'/lib/extends/' => /chemin_root//lib/extends/

(un double slashe en plein milieu)

donc si vous êtes sous linux, il y aura une patate (sous windaube, je suis pas sur du résultat)

PS : Pour voir le résultat du chargement des plugins, j'ai fait un petit echo de la variable '$_plugin_dir . $_plugin_filename' à la ligne 471 du fichier Smarty.class.php
Back to top
View user's profile Send private message Send e-mail
gtraxx
Smarty Regular


Joined: 08 Jan 2008
Posts: 56

PostPosted: Fri Oct 02, 2009 1:38 pm    Post subject: Reply with quote

J'ai fais ce qu'il fallais pour voir d'ou peux provenir le bug !
En affichant les deux variables, smarty retourne un truc plutôt curieux :

Quote:

/var/www/html/monsite/lib/smarty/plugins/function.geturl.php
/var/www/html/monsite/lib/extends/function.geturl.php
/var/www/html/monsite/lib/smarty/plugins/block.geturl.php
/var/www/html/monsite/lib/extends/block.geturl.php
/var/www/html/monsite/lib/smarty/plugins/compiler.geturl.php
/var/www/html/monsite/lib/extends/compiler.geturl.php
/var/www/html/monsite/lib/smarty/plugins/class.geturl.php
/var/www/html/monsite/lib/extends/class.geturl.php

Bon normalement il doit en principe retourner le nom que j'ai donner getUrl.php et non geturl.php.
Mes plugins fonctionnent bien sous la dernière version de la 2
Dois je modifier tous mes plugins et faire un nommage sans majuscule ?
Back to top
View user's profile Send private message
Gowser
Smarty Pro


Joined: 19 Feb 2008
Posts: 104
Location: Nantes (France)

PostPosted: Mon Oct 12, 2009 8:58 am    Post subject: Reply with quote

Je viens de tester et j'ai du renommer du coup le plugin de function.getUrl.php en function.geturl.php (en minuscule)

J'ai trouvé dans le fichier Smarty.class.php ligne 448 ceci :
Code:

$plugin_name = strtolower($plugin_name);


Ca serait pas mal d'avertir les dev de smarty de ne pas changer la casse des plugins (j'ai du faire la même boulette dans des projets que j'ai du faire Confused ).
Back to top
View user's profile Send private message Send e-mail
gtraxx
Smarty Regular


Joined: 08 Jan 2008
Posts: 56

PostPosted: Mon Oct 12, 2009 4:18 pm    Post subject: Reply with quote

effectivement, sa pose probléme surtout que j'ai développer une trentaine de plugin Confused
Mais s'il l'on implémenter c'est que cela posais certainement des problèmes.
Les prévenir semblent une très bonne chose Wink
merci, je vais basculer mes dev vers smarty 3 Very Happy
Back to top
View user's profile Send private message
gtraxx
Smarty Regular


Joined: 08 Jan 2008
Posts: 56

PostPosted: Wed Oct 28, 2009 11:06 am    Post subject: Reply with quote

au faites j'essaie de faire un appel via :: et non this
donc pouvoir appeller smarty comme ceci :
Code:
MySmarty::display('mon.tpl');

Mais il me dit que je doit utiliser this , comment faire pour adapter cette class afin de pouvoir faire mes appels avec des fonctions static.
peut être créer une instance
Back to top
View user's profile Send private message
Gowser
Smarty Pro


Joined: 19 Feb 2008
Posts: 104
Location: Nantes (France)

PostPosted: Thu Oct 29, 2009 1:47 pm    Post subject: Reply with quote

Bonjour,

Je reviens sur le coup de la casse des plugins, c'est effectivement bien un choix de leur part de mettre désormais les noms des fichiers en minuscule

http://www.smarty.net/forums/viewtopic.php?t=16163

Sinon concernant ta demande, il y a un point à souligner :
si tu veux avoir une méthode static 'display' tu ne pourra par faire un extends de smarty (sinon il va y avoir un conflit de canard avec la méthode public 'display' existante)

Donc 2 solutions se propose :
- Soit garder l'extends de smarty afin d'avoir les fonctions de smarty lors de l'instance de la classe (mais du coup il va falloir se faire une autre fonction display comme par exemple displayView)

Code:


<?php
require_once 'Smarty.class.php';

class MySmarty extends Smarty{
   /**
    * var root url
    *
    * @var string
    */
   public $root;
   public $serv;
   
   /**
    * function construct class
    *
    */
   public function __construct(){
      /**
       * include parent var smarty
       */
      parent::__construct();
      //$this->serv = $_SERVER['DOCUMENT_ROOT'];
      $this->serv = 'C:/wamp/www/smarty3';
      self::setParams();
      /*
       You can remove this comment, if you prefer this JSP tag style
       instead of the default { and }
       $this->left_delimiter =  '<%';
       $this->right_delimiter = '%>';
      */
   }
   
   /**
    * Fonction permettant de recuperer un singleton de l'instance de smarty (pour eviter de reinstancier la classe)
    */
   protected function getInstance(){
      static $instance = null;
     
      if ($instance === null) {
         $instance = new self();
      }
      return $instance;
   }
   
   protected function setParams() {
      /**
       * Path -> configs
       */
      $this->config_dir = $this->serv."/app/config/configs/";
      /**
       * Path -> templates
       */
      $this->template_dir = $this->serv;
      /**
       * path plugins
       * @var void
       */
      $this->plugins_dir = array($this->serv.'/plugins/', $this->serv.'/extra/');
      /**
       * Path -> compile
       */
      $this->compile_dir = $this->serv."/templates_c/";
      /**
       * debugging (true/false)
       */
      $this->debugging = false;
      /**
       * compile (true/false)
       */
      $this->compile_check = true;
      /**
       * caching (true/false)
       */
      $this->caching = false;
      /**
       * Use sub dirs (true/false)
       */
      $this->use_sub_dirs = false;
      /**
       * Security
       */
      $this->security = false;
   }
   
   public static function displayView($view){
      self::getInstance()->display($view);
   }
}

MySmarty::displayView('index.tpl');

// verification que l'on puisse toujours instancier la classe et avoir les fonction de smarty
$smarty = new MySmarty();
$smarty->display('index.tpl');
?>


- soit de ne plus étendre la classe smarty ce qui permettrait d'avoir la fonction 'display' de disponible (qui est pour moi la plus pratique)

Code:

<?php
require_once 'Smarty.class.php';

class MySmarty{
   /**
    * var root url
    *
    * @var string
    */
   protected $root;
   protected $serv;
   protected $smarty;
   
   /**
    * function construct class
    *
    */
   protected function __construct(){
      /**
       * include parent var smarty
       */
      $this->smarty = new Smarty();
      //$this->serv = $_SERVER['DOCUMENT_ROOT'];
      $this->serv = 'C:/wamp/www/smarty3';
      
      self::setParams();
      /*
       You can remove this comment, if you prefer this JSP tag style
       instead of the default { and }
       $this->left_delimiter =  '<%';
       $this->right_delimiter = '%>';
      */
   }
   
   /**
    * Fonction permettant de recuperer un singleton de l'instance de smarty (pour eviter de reinstancier la classe)
    */
   protected function getInstance(){
      static $instance = null;
      
      if ($instance === null) {
         $instance = new self();
      }
      
      return $instance;
   }
   
   protected function getSmarty(){
      return $this->smarty;
   }
   
   protected function setParams() {
      /**
       * Path -> configs
       */
      $this->smarty->config_dir = $this->serv."/app/config/configs/";
      /**
       * Path -> templates
       */
      $this->smarty->template_dir = $this->serv;
      /**
       * path plugins
       * @var void
       */
      $this->smarty->plugins_dir = array($this->serv.'/plugins/', $this->serv.'/extra/');
      /**
       * Path -> compile
       */
      $this->smarty->compile_dir = $this->serv."/templates_c/";
      /**
       * debugging (true/false)
       */
      $this->smarty->debugging = false;
      /**
       * compile (true/false)
       */
      $this->smarty->compile_check = true;
      /**
       * caching (true/false)
       */
      $this->smarty->caching = false;
      /**
       * Use sub dirs (true/false)
       */
      $this->smarty->use_sub_dirs = false;
      /**
       * Security
       */
      $this->smarty->security = false;
   }
   
   public static function display($view){
      self::getInstance()->getSmarty()->display($view);
   }
}

MySmarty::display('index.tpl');
?>


Voilou, j'espère
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
This forum is locked: you cannot post, reply to, or edit topics.   This topic is locked: you cannot edit posts or make replies.    Smarty Forum Index -> Language: French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP