在Yii中使用AJAX更新多语言内容

时间:2012-05-31 14:44:19

标签: ajax yii

请参阅下面的代码,当用户点击en按钮时,内容将更改为英语,同时点击tw按钮,内容将更改为中文。

但是,每次用户点击entw按钮时,页面都会刷新。我想问一下如何在这种情况下实现AJAX内容更新?

结果是,当用户点击entw按钮时,将不会刷新页面以更改内容语言。

由于

我参考了Yii docs here,但似乎不适合我的情况

C:\wamp\www\website\protected\views\site\index.php

<?php
$lang = isset($_GET["lang"]) ? $_GET["lang"] : "en_uk";
$lang = $lang == "en" ? "en_uk" : "zh_tw";

Yii::app()->setLanguage($lang);
?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
    <input type="submit" value="en" name="lang" />
    <input type="submit" value="tw" name="lang" />
</form>

<div class="main">
    <?php echo Yii::t(Yii::app()->controller->id, "Causeway Bay"); ?>
</div>

1 个答案:

答案 0 :(得分:2)

最佳做法是在这些情况下重新加载页面,因为通常你必须更新这么多,这是不值得的。

也就是说,CHtml ajaxSubmitButton是实现这一目标的最简洁方法,因为您可以非常轻松地映射通话的每个事件。它看起来像这样:

<?php 
echo CHtml::ajaxSubmitButton('en', CHtml::normalizeUrl(array('site/changeLanguage')),
array(
    'error'=>'js:function(){
        alert("error");
    }',
    //if you add a return false in this, it will not submit. 
    'beforeSend'=>'js:function(){
        alert("beforeSend");                                            
    }',
    'success'=>'js:function(data){
        alert("success, data from server: "+data);
    }',
    'complete'=>'js:function(){
        alert("complete");
    }',
    //'update'=>'#where_to_put_the_response',
)
);
?>

当然,您不必使用每个参数。 update参数可以立即更新HTML标记。

编辑: 如果您使用控制器的renderPartial方法,例如在站点控制器中,如果您有对索引负责的操作,则可以轻松完成此操作。

public function actionIndex(){
   //get variables, etc


   if(Yii::app()->request->isAjaxRequest) {
      $lang = $_POST['nameOfSubmit'];

   }else {
      //...
   }
   //if the 3rd parameter is true, the method returns the generated HTML to a variable
   $page = $this->renderPartial('_page', array(/*parameters*/ ), true); 
   echo $page; 
}

然后,在您的视图文件中,您只需

<?php echo CHtml::ajaxSubmitButton('en', CHtml::normalizeUrl(array('site/index')),
array('update'=>'#content_div',));?>

<?php echo CHtml::ajaxSubmitButton('tw', CHtml::normalizeUrl(array('site/index')),
    array('update'=>'#content_div',));?>