在Yii中的layouts main.php中显示登录表单

在Yii中的layouts main.php中显示登录表单,yii,Yii,我想更改views/layouts/main.php,以便在用户未经身份验证时显示登录表单 因此,我更改了siteController操作索引,如下所示: public function actionIndex() { $loginForm = new LoginForm(); $this->render('index', array('loginForm'=>$loginForm)); } if(Yii::app()->user->isGuest):

我想更改views/layouts/main.php,以便在用户未经身份验证时显示登录表单

因此,我更改了siteController操作索引,如下所示:

public function actionIndex() {

$loginForm = new LoginForm();
    $this->render('index', array('loginForm'=>$loginForm)); 
}
if(Yii::app()->user->isGuest):
    echo $loginForm;
else :
    echo 'JJJ';
endif;
然后在views/layouts/main.php中调用它,如下所示:

public function actionIndex() {

$loginForm = new LoginForm();
    $this->render('index', array('loginForm'=>$loginForm)); 
}
if(Yii::app()->user->isGuest):
    echo $loginForm;
else :
    echo 'JJJ';
endif;
然后,当我访问我的网站时,它会显示错误:未定义变量:loginForm


我不知道怎么解决这个问题

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

public $loginForm;
在main.php中,按如下方式访问它:

echo $this->loginForm;
如果在渲染方法中传递变量,它将仅在视图文件中可用,但在布局文件中不可用。

这是因为索引模板在主模板之前加载。所以,更好的方法就是在控制器中定义一个公共属性。我建议您在控制器类中定义此属性,因为SiteController和*Controller扩展了它

然后,你可以运行这个

if(Yii::app()->user->isGuest) {
    echo $this->loginForm;
} else {
    echo 'JJJ';
}
请注意,因为在这种工作方式中,您将采用MVC模式。这种工作方式迫使您在每个操作中定义LoginForm。我建议你这样做:

保留对渲染文件的干净调用

public function actionIndex() {
    $this->render('index'); 
}
并在控制器类中添加getLoginForm方法,以获得:

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

这里有几个问题。首先,您要创建一个名为$loginForm的对象,并将其赋值为newloginform

我不确定您是否有意这样做,而LoginForm是一个函数或一个返回某些内容的方法,但我感觉您有意这样做:

$loginForm = new LoginForm;
它创建了LoginForm类的一个新实例,LoginForm是一个默认的Yii webapp类。即使是这样,也有更好的方法

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

if(Yii::app()->user->isGuest) {
    $this->renderPartial("loginform",array("model"=>new LoginForm));
} else {
    echo 'JJJ';
}
这将在不呈现布局的情况下呈现view login.php,因为我们已经呈现了布局-on render和renderPartial,并将分配给名为$model的变量的模型LoginForm的新实例传递给它

您很可能需要编辑login.php视图的外观以使其适合,但请记住,SiteController actionLogin中也使用了此视图

接下来要做的就是修改actionIndex以处理表单提交,您只需复制现有的SiteController actionLogin功能即可


另一个更好的解决方案是为登录表单创建一个小部件,它可以在应用程序中使用。我不打算讨论这个问题,但是你可以在这里读到,或者去看看,或者

对不起,它坏了。错误消失,但表单未显示。此表单创建表单模型类的对象www.yiiframework.com/doc/guide/1.1/en/form.model‎. 它不会呈现窗体。你需要明确地做到这一点,就像在最初的文章中一样。