Как написать мой собственный Smarty If-case - PullRequest
6 голосов
/ 10 августа 2011

Я пишу свою собственную администрацию и, конечно, я использую Smarty. Теперь я хотел бы добавить функцию проверки доступа, очень похожую на тег {if}.

Я хотел бы написать:

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

но я не могу понять, как это сделать. Может кто-нибудь, пожалуйста, укажите мне правильное направление? Также, если возможно, добавление и {еще} к нему. Таким образом, код будет:

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

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Я решил это, создав собственную "внутреннюю" функцию для smarty.Возможно, это не тот способ, которым Smarty намеревался его использовать, но он точно работает для меня ... что для меня самое главное.

Это мой конечный результат:

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

Я надеюсь, что это поможет любому, у кого есть эта проблема в будущем.

0 голосов
/ 10 августа 2011

Вы можете попробовать registerPlugin .

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

и ваш класс:

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

Проблема здесь в том, что вы не так легко можете использовать переменные внутри этого блока. Возможно, вы можете снова отправить внутренний контент в smarty, но так как он разрешает только файлы шаблонов в функции fetch(), я не совсем уверен, работает ли это.

Что может помочь, хотя это умная функция eval , но я еще не работал с ней.

...