【问题标题】:Rendering Yii's Flash message inside the partial view with ajax call使用 ajax 调用在局部视图中渲染 Yii 的 Flash 消息
【发布时间】:2014-01-31 10:05:41
【问题描述】:

我在 Yii 中显示 Flash 消息时遇到问题。在我的视图中,我有一个 ajax 按钮,调用我的控制器的方法更新。在更新方法中,我想设置一条 Flash 消息,并在使用新数据更新时将其显示在我的视图中。

   *update.php :*

    <?php
    <h1>Update Campaign <?php echo $campaign->id; ?></h1>
    <?php
    $tabList = array();
//FORM IS DISPLAYED INSIDE A JUI TAB:
    $tabList['General'] = $this->renderPartial('_form', array('campaign'=>$campaign),true);*

    ...

    $this->widget('zii.widgets.jui.CJuiTabs',array(
        'tabs'=>$tabList,
        'options'=>array(
            'collapsible'=>false,
        ),
    ));
    ?>


*_form.php:*

//HERE I WANT TO DISPLAY A FLASH MESSAGE WHEN _form IS RENDERED:
    <?php foreach(Yii::app()->user->getFlashes() as $key => $message) : ?>
        <div class="flash-<?php echo $key; ?>"><?php echo $message; ?></div>
    <?php endforeach; ?>

    <?php
        Yii::app()->clientScript->registerScript(
            'myHideEffect',
            '$(".flash-success").animate({opacity: 1.0}, 1000).fadeOut("slow");',
            CClientScript::POS_READY
        );
    ?>
    <div class="form">
    <?php $form=$this->beginWidget('CActiveForm', array(
        'id'=>'campaign-form',
        'enableAjaxValidation'=>false,
    )); ?>

        <p class="note">Fields with <span class="required">*</span> are required.</p>

        <?php echo $form->errorSummary($campaign); ?>

        <div class="row">
            <div class="span2">
                    <?php echo $form->labelEx($campaign,'campaign_mode_id'); ?>
            </div>
            <div class="span2">
                <?php echo $form->dropDownList($campaign,'campaign_mode_id', CampaignMode::model()->getModes());?>
                <?php echo $form->error($campaign,'campaign_mode_id'); ?>
            </div>
        </div>
    ...
        <div class="row buttons">
            <div class="span2">
                <?php
                    if($campaign->isNewRecord){
                        echo CHtml::submitButton( 'Create');
                    }else{
//THIS IS MY AJAX-SUBMIT BUTTON, IT CALL CONTROLLER'S UPDATE METHOD AND UPDATE JUI TAB (DIV WITH ID '#yw0_tab0')
                        echo CHtml::ajaxSubmitButton(
                            'Save',
                            Yii::app()->createUrl("//campaign/update/{$campaign->id}"),
                            array('beforeSend' => 'function(){
                                          $("#surveyquestions").addClass("ajaxloading");}',
                                'complete' => 'function(){
                                          $("#surveyquestions").removeClass("ajaxloading");}','update' => "#yw0_tab0"),
                            array('id' => 'send-link-'.uniqid()));
                    }
                ?>
            </div>
        </div>

    <?php $this->endWidget(); ?>


*Contorller:*


    public function actionUpdate($id)
        {
            $campaign=$this->loadModel($id);
            if(isset($_POST['Campaign']))
            {
                $campaign->attributes=$_POST['Campaign'];
                if($campaign->save())
                {
//HERE I'M SETTING THE FLASH MSG
                    Yii::app()->user->setFlash('success','Campaign is updated');

                    if(Yii::app()->request->isAjaxRequest){
//AND UPDATING MY VIEW
                        $this->renderPartial('_form', array('campaign'=>$campaign), true,true);
                    }else{
                        $this->redirect(array('update','id'=>$campaign->id));
                    }
                }
            }
            $this->render('update',array('campaign'=>$campaign));
        }

【问题讨论】:

  • 我尝试使用具有不同参数的renderPartial,但它没有任何区别,当我使用xdebug浏览代码时,我可以看到这些行是在更新方法调用之后执行的:&lt;?php foreach(Yii::app()-&gt;user-&gt;getFlashes() as $key =&gt; $message) : ?&gt; &lt;div class="flash-&lt;?php echo $key; ?&gt;"&gt;&lt;?php echo $message; ?&gt;&lt;/div&gt; &lt;?php endforeach; ?&gt;,但由于某种原因,从不显示 flash 消息。

标签: php ajax yii renderpartial


【解决方案1】:

实际上,您正在渲染_form 视图,但没有将其发送到输出(查看第三个参数),然后您正在渲染update 视图... Flash 消息已在_form 中渲染一次,因此不会再次渲染。

你应该试试这个:

if(Yii::app()->request->isAjaxRequest) {
    $this->renderPartial('_form', array('campaign'=>$campaign), false, true);
    Yii::app()->end();
} else {
    $this->redirect(array('update','id'=>$campaign->id));
}

【讨论】:

  • 感谢您的回复,但您的解决方案也不起作用。如果使用 ajax 调用,则更新视图仅在第一次加载表单时呈现一次。之后,我尝试更新仅包含 _from 的单个
    。而且我还尝试使用具有不同参数/参数组合的renderPartial,例如true,true;真,假等。它不起作用。我当然可以使用 js 来解决问题,但我想让它以 yii 的方式工作。
  • 您的 ajax 请求返回什么?你检查你的 js/网络控制台是否有错误?
  • 它返回一个大的 HTML,其中包含 _form html 和我的 + 另一个附加到底部的 HTML,其中包含渲染的 update.php 以及所有 jui 选项卡和所有内容。
  • 当我使用你的代码时。它返回 HTML 的正确和平,顶部带有 消息。
猜你喜欢
相关资源
最近更新 更多
热门标签