我需要帮助重构或设计:)。我做了我的webapp,效果很好。但是我仍然无法理解Yii中的Ajax进程。例如,当我使用$.fn.yiiGridView.update()
方法时,我看到了所有网页的返回,而不仅仅是CGridView
的内容。这对我很有意思。
但是现在:在索引视图中,我使用CGridView
,但没有寻呼机!这是一个简单的赌博游戏webapp。在index.php我只在页面上查看10个投注/结果,10秒后我用JavaScript查看下一个10投注/结果以及10秒后的下一个10结果/投注:)。
这样简单的过程:
注意:管理员 将结果插入管理员网页,webapp必须显示 临时结果。这就是为什么我需要刷新摘要和 在_ajaxIndex.php
中舍入JS变量控制器
/**
* Lists all models.
*/
public function actionIndex() {
Yii::app()->language='hu';
$model = new Result('search');
$model->unsetAttributes();
if (isset($_GET['Result']))
$model->attributes = $_GET['Result'];
if (isset($_POST['offset']) && $_POST['offset'] >= 0)
$model->offset = $_POST['offset'];
$summary = Result::getCountSavedResults();
$model->isLimited = true;
$this->layout='projector';
$this->render('index', array('model' => $model, 'summary'=>$summary));
//$this->actionAjaxIndex();
}
/**
* List all models by Ajax request.
*/
public function actionAjaxIndex() {
Yii::app()->language='hu';
$model = new Result('search');
$model->unsetAttributes(); // clear any default values
if (isset($_GET['Result']))
$model->attributes = $_GET['Result'];
if (isset($_POST['offset']) && $_POST['offset'] >= 0)
$model->offset = $_POST['offset'];
$summary = Result::getCountSavedResults();
$model->isLimited = true;
$this->renderPartial('_ajaxIndex', array('model' => $model, 'summary'=>$summary));
}
我想在actionIndex()中终止此代码重复。但我不知道我该怎么做...我试着调用actionAjaxIndex等。但在我调用actionAjaxIndex之前,我从Yii得到了PHP错误。 (摘要变量不存在,等等。)
查看 - Index.php
<!--<h1><?php echo Yii::t('strings','Results'); ?></h1>-->
<?php
echo CHtml::image(Yii::app()->request->baseUrl.'/images/toplista.jpg', "Fogadás");
?>
<script type="text/javascript">
// Initialize the variables for calculating
var summary = <?php echo $summary ?>; // get all stored results
var timeout = 10 * 1000; // in Milliseconds -> multiply with 1000 to use seconds
var current = 0;
var turn = 0;
var rounds = Math.floor(summary / 10);
</script>
<?php $this->renderPartial('_ajaxIndex', array('model'=>$model, 'summary'=>$summary)); ?>
<script type="text/javascript">
// Refresh the CGridView's content in _ajaxIndex.php
window.setInterval("refresh()", timeout);
// Get the offset to the search() to set the criteria
// Increase turn.
function counter(){
turn += 1;
if(turn > rounds){
turn = 0;
}
return turn *10;
}
function refresh() {
<?php
echo CHtml::ajax(array(
'url'=> CController::createUrl("result/ajaxIndex"),
'type'=>'post',
'data'=> array('offset'=>'js: counter()'),
'replace'=> '#ajax-result-grid',
))
?>
}
</script>
查看 - _ajaxIndex.php
<?php
/* @var $model Result */
?>
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'ajax-result-grid',
'dataProvider'=>$model->search(),
'columns'=>array(
array(
'header'=>Yii::t('strings','No.'),
'value'=> $model->offset.' + $row+1',
'htmlOptions'=>array('style'=>'width:50px;'),
),
array(
'header'=>Yii::t('strings','team_name'),
'name'=>'team_id',
'value'=>'$data->team->name'
),
array(
'header'=>Yii::t('strings','value'),
'name'=>'value',
'value'=>'$data->value'
),
),
)); ?>
<script type="text/javascript">
// This is need while the admins insert the results during this page is run.
summary = <?php echo $summary ?>;
rounds = Math.floor(summary / 10);
</script>
是的,我想我不明白Yii中的Ajax过程:/。
答案 0 :(得分:0)
实际上,您已经向前迈出了一大步,使用相同的模板 - _ajaxIndex.php
- 用于AJAX调用和初始页面加载。但是,是的,您可以在这个方向上更进一步 - 通过使用单个动作。
在这个动作中应该检查是否通过AJAX调用方法的确切方式。根据结果,您可以渲染整个页面 - 也可以只渲染部分。
通常这项检查就像......一样简单。
if (Yii::app()->request->isAjaxRequest) { ... }
但是这里存在一个问题:此检查取决于自定义HTTP标头HTTP_X_REQUESTED_WITH
,许多JS库使用它们来实现自己的AJAX例程。遗憾的是,一些代理服务器会删除此标头,因此可能不可靠。要100%确定,只需在AJAX助手中提供另一个参数(最简单的是ajax
),然后检查此参数(也是)。