How to write my own Smarty If-case

I write my own administration, and of course I use Smarty. Now I would like to add an access control function very similar to the {if} tag.

I would like to write:

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

but I can’t figure out how to do this. Can someone please call me in the right direction? Also, if possible, add {else} to it. Thus, the code will look like this:

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

I decided to create my own β€œinternal” function for smarty. It may not be the way Smarty intended to use it, but it works for me ... which is the most important thing for me.

This is my end result:

 <?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 } ?>"; } } 

I hope this helps anyone who has this problem in the future.

+1
source

You can try registerPlugin .

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

and your class:

 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 ''; } } 

The problem is that you cannot use variables inside this block so easily. You might be able to submit the internal content to smarty again, but since it only allows template files in the fetch() function, I'm not quite sure if this works.

Which may help, but this is a smarty eval function, but I haven't worked with it yet.

0
source

Source: https://habr.com/ru/post/894726/


All Articles