1

我很难让我的通知框出现在我的模板中,由 Smarty 提供支持。

我有我的 main.tpl 模板:

{include file='header.tpl'}
{include file='notification.tpl'}
<h1>Welcome</h1>
{eval var=$content}
{include file='footer.tpl'}

在 notification.tpl 中:

{if $notification}
<div id="notifications">
{foreach $notification as $detail}
    <div class="{$detail.type}">
        <p><span class="title">{$detail.title}</span><br>{$detail.content}</p>
    </div>
{/foreach}
</div>
{/if}

在我的 index.php 页面中,它支持 smarty,包括类等,它的基础有:

$smarty = new Smarty();

// some details removed for simplicity

// $content is from the database
$smarty->assign("content", $content);
$smarty->assign("notification", $registry->notifications->render());
echo $smarty->fetch('main.tpl');

在上面的 $content 中,包括以下内容:

<p>Have an account with us? Login to your account below:</p>
{widget name="login"}

我已经制作了一个插件和一个类来处理我的小部件插件 - 以上工作完美(包含表单并且可以登录)。但是,如果输入了错误的用户名/密码,我会尝试向主模板的通知区域添加一些详细信息,但由于某种原因,我似乎无法在我的小部件插件中执行此操作。

我的 function.widget.php 文件:

function smarty_function_widget($params, $template){
    if(empty($params['name'])){
        user_error('Widget is missing name.', E_USER_ERROR);
    }
    if(file_exists($controller = sprintf('%s/controller.php', WIDGETS_PATH . strtolower($params['name'])))){
        require_once($controller);
    } else {
        // Hide the unfound widget from the end user
        eval(sprintf('class %s extends Smarty_Widget {}', strtolower($params['name'])));
    }

    $widget = call_user_func($params['name'] . '::factory', $params);
    $widget->loadView($template->smarty)->execute($widget);
}

我的小部件类,widget.class.php:

class Smarty_Widget {

    protected $smarty;
    protected $view = 'default';
    public $ext = '.tpl';
    public $_vars = array();
    public $widget_dir = WIDGETS_PATH;
    public $widget_template_dir;
    public $registry;

    final public static function factory($params = array()){
        $className = get_called_class();
        return new $className($params);
    }

    private function __construct($params){
        global $registry;

        $this->registry = $registry;
        $this->_vars = $params;
        unset($params, $this->_vars['name']);
    }

    final public function loadView($smarty){
        $this->smarty = $smarty;
        $this->smarty->assign($this->_vars);
        $this->widget_template_dir = $this->smarty->getTemplateDir('0') . 'widgets/';

        return $this;
    }

    final protected function display(){
        $className = strtolower(get_called_class());

        if(is_file($this->widget_template_dir . $className . '/' . $this->view . $this->ext)){
            // Only display is exists
            $this->smarty->display($this->widget_template_dir . $className . '/' . $this->view . $this->ext);
        }
    }

    public function execute(){
        return $this->display();
    }
}

如果我在呈现通知的 index.php 中添加通知,我的通知类就可以工作。但是,由于某种原因,如果我将它们添加到小部件的插件 (function.widget.php) 中,这些通知不会出现。是否有一些我应该分配通知详细信息的预渲染位置,因为似乎所有子项目都在很晚才处理,但由于它已经被声明,所以它不会添加它。

所以我的问题是,我应该在哪里正确分配通知部分,因为我总是可以在一个页面上有 2 个小部件,所以不想显示每个错误两次。

4

0 回答 0