2011-08-10 10 views
6

Escribo mi propia administración y, por supuesto, estoy usando Smarty. Ahora, lo que me gustaría hacer es agregar una función de verificación de acceso muy similar a la etiqueta {if}.Cómo escribir mi propio Smarty If-case

Lo que me gustaría escribir es:

{userAccess module='MyModule' action='WriteMessage'} 
Yeey.. I can write something. My name is {$myName}. 
{/userAccess} 

pero no puedo encontrar la manera de. ¿Puede alguien señalarme en la dirección correcta? Además, si es posible, agregue y {else} a él. Por lo que el código sería:

{userAccess module='MyModule' action='WriteMessage'} 
Yeey.. I can write something. My name is {$myName}. 
{else} 
Nooo.. :(I don't have access. 
{/userAccess} 

Respuesta

1

Lo resolví creando mi propia función "interna" para smarty. Esta podría no ser la forma en que Smarty pretendía que se usara, pero seguro que funciona para mí ... que es lo más importante para mí.

Este es mi resultado final:

<?php 
/** 
* Smarty Internal Plugin Compile UserAccess 
* 
* Compiles the {useraccess} {useraccesselse} {/useraccess} tags 
* 
* @package Smarty 
* @subpackage Compiler 
* @author Paul Peelen 
*/ 

/** 
* Smarty Internal Plugin Compile useraccess Class 
*/ 
class Smarty_Internal_Compile_useraccess extends Smarty_Internal_CompileBase { 
    // attribute definitions 
    public $required_attributes = array('module', 'action'); 
    public $optional_attributes = array('userid');     // Not yet implemented 
    public $shorttag_order = array('module','action','userid'); 

    /** 
    * Compiles code for the {useraccess} tag 
    * 
    * @param array $args array with attributes module parser 
    * @param object $compiler compiler object 
    * @param array $parameter array with compilation parameter 
    * @return string compiled code 
    */ 
    public function compile($args, $compiler, $parameter) 
    { 
     $this->compiler = $compiler; 
     $tpl = $compiler->template; 
     // check and get attributes 
     $_attr = $this->_get_attributes($args); 

     $module = $_attr['module']; 
     $action = $_attr['action']; 

     if (!is_string($module) || !is_string($action)) 
     { 
      exit ("ERROR"); 
     } 

     $this->_open_tag('useraccess', array('useraccess', $this->compiler->nocache, $module, $action)); 
     $this->compiler->nocache = $this->compiler->nocache | $this->compiler->tag_nocache; 

     $output = "<?php "; 
     $output .= "\$oAuth = \$GLOBALS['oAuth'];\n"; 
     $output .= " \$_smarty_tpl->tpl_vars[$module] = new Smarty_Variable;\n"; 
     $compiler->local_var[$module] = true; 

     $output .= " \$_smarty_tpl->tpl_vars[$action] = new Smarty_Variable;\n"; 
     $compiler->local_var[$action] = true; 

     $output .= "if (\$oAuth->getUserSubRights($action,$module)) {"; 
     $output .= "?>"; 

     return $output; 
    } 
} 

/** 
* Smarty Internal Plugin Compile UserAccessElse Class 
*/ 
class Smarty_Internal_Compile_UserAccessElse extends Smarty_Internal_CompileBase { 
    /** 
    * Compiles code for the {useraccesselse} tag 
    * 
    * @param array $args array with attributes module parser 
    * @param object $compiler compiler object 
    * @param array $parameter array with compilation parameter 
    * @return string compiled code 
    */ 
    public function compile($args, $compiler, $parameter) 
    { 
     $this->compiler = $compiler; 
     // check and get attributes 
     $_attr = $this->_get_attributes($args); 

     list($_open_tag, $nocache, $item, $key) = $this->_close_tag(array('useraccess')); 
     $this->_open_tag('useraccesselse', array('useraccesselse', $nocache, $item, $key)); 

     return "<?php } else { ?>"; 
    } 
} 

/** 
* Smarty Internal Plugin Compile UserAccessclose Class 
*/ 
class Smarty_Internal_Compile_UserAccessclose extends Smarty_Internal_CompileBase { 
    /** 
    * Compiles code for the {/useraccess} tag 
    * 
    * @param array $args array with attributes module parser 
    * @param object $compiler compiler object 
    * @param array $parameter array with compilation parameter 
    * @return string compiled code 
    */ 
    public function compile($args, $compiler, $parameter) 
    { 
     $this->compiler = $compiler; 
     // check and get attributes 
     $_attr = $this->_get_attributes($args); 
     // must endblock be nocache? 
     if ($this->compiler->nocache) { 
      $this->compiler->tag_nocache = true; 
     } 

     list($_open_tag, $this->compiler->nocache, $item, $key) = $this->_close_tag(array('useraccess', 'useraccesselse')); 
     unset($compiler->local_var[$item]); 
     if ($key != null) { 
      unset($compiler->local_var[$key]); 
     } 

     return "<?php } ?>"; 
    } 
} 

espero que esto ayude a cualquiera que tenga este problema en el futuro.

+0

buena solución! –

0

Usted podría intentar registerPlugin.

$smarty->registerPlugin("block","userAccess", array('YourClass', 'your_function')); 

y su clase:

class YourClass { 
    static function your_function($params, $content, $smarty, &$repeat, $template) { 
     $module = $params['module']; 
     $action = $params['action']; 

     if ($action == 'WriteMessage' && $user_may_write_message) { 
      return $content; 
     else 
      return ''; 
    } 
} 

El problema aquí es que usted no es tan easiliy capaz de utilizar variables dentro de este bloque. Quizás puedas enviar el contenido interno a smarty nuevamente, pero como solo permite archivos de plantilla en la función fetch(), no estoy seguro de si esto funciona.

Lo que podría ayudar es la función smarty eval, pero aún no he trabajado con ella.

+0

Gracias! Miré eso y lo intenté, pero tal como lo explicaste, el contenido interno no es renegado por Smarty. Que es un requisito –

+0

Encontré otra función llamada [eval] (http://www.smarty.net/docs/en/language.function.eval.tpl) ... tal vez esto pueda ayudarlo –

+0

Querrá usar register_block. No estoy seguro de cuál es la mejor manera de manejar la condición else dentro de ella, pero al menos evaluará el contenido como código Smarty para usted. http://www.smarty.net/docsv2/en/api.register.block.tpl – craigmc

Cuestiones relacionadas