3 votes

Comment construire un nouvel objet à partir d'un modèle Smarty ?

Ce que je veux faire, c'est ça :

{myfunc myattribute=new MyClass('arg1', 'arg2')}

Mais j'obtiens une erreur lorsque j'essaie, disant que la fonction MyClass n'est pas définie.

La solution de rechange que j'ai utilisée consiste à créer une fonction de premier niveau comme celle-ci :

function MyClass($arg1, $arg2) { return new MyClass($arg1, $arg2); }

Puis dans le modèle faire :

{myfunc myattribute=MyClass('arg1', 'arg2')}

Mais existe-t-il un moyen d'éviter de créer une nouvelle fonction de haut niveau pour chaque classe que je veux rendre contrastée à partir de Smarty ?

Je suppose que je pourrais aussi créer une fonction qui prendrait simplement le nom d'une classe pour me permettre de construire n'importe quelle classe, mais c'est une solution plutôt moche.

Éditer : Pour tous ceux qui m'accusent de violer les meilleures pratiques, peut-être que ceci vous fera vous sentir mieux :

L'objet que je construis est un widget pour rendre du html. Le code actuel ressemble à ceci :

{render_widget widget=new MyWidget() id="myid" name="myname"}

De plus, je suis malheureusement bloqué sur PHP 5.2, et je ne peux donc pas utiliser les fermetures. Je peux utiliser la dernière version de Smarty3, bien que j'utilise actuellement une version de Smarty 3.0.

4voto

v2p Points 2196

Desde http://www.smarty.net/best_practices

  1. Ne pas intégrer PHP
  2. Gardez les constructions PHP séparées
  3. Garder la logique métier séparée

Dans votre cas, vous mélangez la logique de présentation avec la logique métier - et c'est mauvais.

Cependant, vous pouvez écrire votre propre plugin Smarty (wrapper) pour la création d'objets personnalisés - et (je pense) que c'est une solution plus appropriée "Smarty-way".

Voir http://www.smarty.net/docsv2/en/plugins.tpl et http://www.smarty.net/docsv2/en/plugins.functions.tpl

Par exemple.

Définition :

function smarty_function_custom_class($params, &$smarty)
{
    $class = $params['class'];       
    $smarty->assign($params['var'], new $class());  
}    

Utilisation :

{custom_class var='myObject' class='MyClass'}

Mise à jour

Donc, si vous avez une telle construction :

{render_widget widget=new MyWidget() id="myid" name="myname"}

Vous pouvez modifier votre render_widget de cette façon :

function smarty_function_render_widget($params, &$smarty)
{
    $class = $params['widget'];       

    $id = $params['id'];
    $name = $params['name'];

    $widget = new $class($id, $name);

    /**
     *  if you need object in your template, assign it to same variable:
     */
    $smarty->assign($params['widget'], $widget);
    // rest of your code    
}    

Et après cela, vous pouvez l'utiliser de cette façon :

{render_widget widget="MyWidget" id="myid" name="myname"}

2voto

Mahn Points 5565

Que diriez-vous d'utiliser fermetures ?

{myfunc myattribute=function() { return new MyClass('arg1', 'arg2'); }}

Ce n'est pas la plus belle chose qui soit, mais ça devrait faire l'affaire. (Soit dit en passant, vous pourriez envisager de passer à l'option Langage de modélisation PHP à l'avenir)

1voto

Bono Points 1567

A moins que je n'interprète mal la question, vous vous y prenez de la mauvaise façon. Smarty ne devrait contenir que du html et les variables smarty (avec très peu d'exceptions). Vous devez écrire votre classe en PHP, y instancier un objet et le passer à Smarty. Voici un exemple :

Php :

class Class_name
{
    private $int;

    public function funtion_name()
    {
        $this->int = 1;
        return $this->int;
    }
}

//instantiate the object  

$obj = new Class_name();

$smarty->('smarty_variable_name', $obj);

Smarty :

$smarty_variable_name->funtion_name()}

Cela devrait donner 1.

Soyez indulgent avec moi, j'ai écrit ceci sur mon téléphone :(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X