我很难让我的通知框出现在我的模板中,由 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 个小部件,所以不想显示每个错误两次。