【问题标题】:YiiFramwork-Clear current render data and render new data instead of redirectYiiFramwork-清除当前渲染数据并渲染新数据而不是重定向
【发布时间】:2014-11-16 03:55:23
【问题描述】:

请问有没有这样的情况,我可以清除当前渲染的页面,然后用一套新的布局重新渲染?我知道我可以通过调用重定向来实现这一点,但我必须创建另一组操作来处理 1 个布局。有没有一种方法可以让我在一个动作中做到这一点?这就是我目前的做法,但我似乎无法清除以前的布局并呈现另一组新布局...

/**
 * Change a user's password
 * @param int $id Owner's id
 *
 */
public function actionChngPassword($id)
{
    $this->pageTitle = 'Change Password';

    $model=Users::model()->findByPk($id);
    $model->scenario = 'chngPwd';
    $this->performAjaxValidation($model);
    $returnUrl = Yii::app()->homeUrl;

    if(isset($_POST['Users'])){
        $model->attributes = $_POST['Users'];
        if($model->validate()){
            $model->scenario = "";
            $ip = Users::getRealIp();
            $time = date('d-m-Y H:i:s');
            $name = $model->usrname;

            $model->old_pwd = $model->pwd;
            $model->pwd = CPasswordHelper::hashPassword($model->newpwd);
            $model->pw_change_on = $time = date('d-m-Y H:i:s');
            $model->save();

            // Send email noti to user
            $revert_link= $this->createAbsoluteUrl('users/revertPassword', array('id' => $model->user_id, 'pwhash' => urlencode($model->pwd)));

            ob_start();
            $INC_DIR = UrlMgmt::getBaseAbsoluteUrl() . "/protected/views/users/mailtemplate/";
            include($INC_DIR . "pwChange_email.php");
            $view = ob_get_contents();
            ob_end_clean();

            Mailer::sendMail('Viralenz Member Accounts Management', $model->email_addr, 'Viralenz Password Changed!', $view);

            Yii::app()->clientScript->registerMetaTag("3;url={$returnUrl}", null, 'refresh');
            $this->render('msg_pwchange',array('c'=>"change"));
        }

    }

    $this->render('chngPassword', array('model' => $model));

}

注意到附加在顶部的第二个渲染部分...我希望它清除所有并重新渲染一组新布局...

我可以使用其他方法来代替重定向到另一个操作吗?

【问题讨论】:

  • 也许你可以试试ajax来渲染新页面!

标签: php redirect yii render


【解决方案1】:

如果您使用 ajax 进行渲染,您可以将视图“chngPassword”替换为“msg_pwchange”,而无需重定向到其他操作。 为“chngPassword”的外部元素提供一个id(例如:response_id)并在单击“更改”按钮时进行ajax调用,如下所示:

$.ajax({
            type: 'POST',
            data: {...provide here...},
            url: '<?php echo Yii::app()->getbaseurl(TRUE). '/controller_id/ChngPassword' ?>',
            success: function(str) {
                $('#response_id').html(str);
            }
        });

修改控制器动作:

public function actionChngPassword($id){

-----自定义代码-----------

if(isset($_POST['Users'])){

--自定义代码------

        $this->renderPartial('msg_pwchange',array('c'=>"change"));
    }

}

$this->render('chngPassword', array('model' => $model));

}

函数 renderPartial() 只返回没有布局的特定文件的视图。现在我们可以用新视图(ajax 响应)替换以前的视图。

【讨论】:

    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2017-11-21
    • 2015-03-03
    相关资源
    最近更新 更多