1

我想更改“views/layouts/main.php”以在用户未通过身份验证时显示登录表单。

所以我像这样更改了“siteController”actionIndex:

public function actionIndex() {

$loginForm = new LoginForm();
    $this->render('index', array('loginForm'=>$loginForm)); 
}

然后像这样在“views/layouts/main.php”中调用它:

if(Yii::app()->user->isGuest):
    echo $loginForm;
else :
    echo 'JJJ';
endif;

然后当我访问我的网站时,它显示错误:“未定义变量:loginForm”。

我不知道如何解决这个问题?:(

4

3 回答 3

0

这里有几个问题。首先,您正在创建一个名为的对象$loginForm并为其分配一个值new LoginForm();

$loginForm = new LoginForm();

我不确定您是否故意这样做并且LoginForm()是返回某些内容的函数或方法,但我感觉您打算这样做:

$loginForm = new LoginForm;

它创建了类LoginForm的一个新实例(这是一个默认的 Yii webapp CFormModel类)。即使是这样,也有更好的方法来做到这一点。

最简单的方法是在index.php视图中调用renderPartial已经存在的login.php视图(位于protected/views/site/login.php),如下所示:

if(Yii::app()->user->isGuest) {
    $this->renderPartial("loginform",array("model"=>new LoginForm));
} else {
    echo 'JJJ';
}

这会渲染视图login.php(不渲染布局,因为我们已经渲染了布局 -这是关于和的文档)并将模型的新实例传递给名为 的变量。renderrenderPartialLoginForm$model

您很可能必须编辑 login.php 视图的外观以使其“适合”,但请记住,此视图也用于SiteController actionLogin

剩下要做的就是修改你的actionIndex来处理表单提交(你可以复制现有的SiteController actionLogin功能)

另一个更好的解决方案是为登录表单创建一个可以在整个应用程序中使用的小部件。我不打算深入讨论,但您可以在 SO 上阅读有关它的信息,或者查看本教程教程。

于 2013-01-28T14:16:22.230 回答
0

这是因为index 模板是在 main template 之前加载的。因此,更好的方法是在控制器中定义一个公共属性。我建议你在 Controller 类中定义这个属性,因为 SiteController 和 *Controller 扩展了它。

然后,您可以运行它。

if(Yii::app()->user->isGuest) {
    echo $this->loginForm;
} else {
    echo 'JJJ';
}

注意,因为在这种工作方式中你走出了 MVC 模式。这种工作方式迫使您在每个操作中定义一个 LoginForm。我建议你这样做:

保持清洁您对渲染文件的调用。

public function actionIndex() {
    $this->render('index'); 
}

并在您的 Controller 类中添加一个 getLoginForm 方法,获取:

if(Yii::app()->user->isGuest) {
    echo $this->getLoginForm();
} else {
    echo 'JJJ';
}
于 2013-01-25T12:17:18.653 回答
0

在控制器类中定义新属性:

public $loginForm;

在您的main.php访问中,它像:

echo $this->loginForm;

如果您在render方法中传递变量,它将仅在视图文件中可用,但在布局文件中不可用。

于 2013-01-25T12:03:15.370 回答