Php Yii框架-多次下载

Php Yii框架-多次下载,php,yii,Php,Yii,我正在使用Yii框架开发一个数据库接口。我有一个名为take的表,它存储音频文件。我在索引页面中添加了高级搜索,并添加了一个链接,用于下载搜索产生的所有文件,如下所示: <?php /* @var $this takeController */ /* @var $dataProvider CActiveDataProvider */ $this->breadcrumbs=array( 'Takes', ); $this->menu=array( array(

我正在使用Yii框架开发一个数据库接口。我有一个名为take的表,它存储音频文件。我在索引页面中添加了高级搜索,并添加了一个链接,用于下载搜索产生的所有文件,如下所示:

<?php
/* @var $this takeController */
/* @var $dataProvider CActiveDataProvider */

$this->breadcrumbs=array(
    'Takes',
);

$this->menu=array(
    array('label'=>'Create take', 'url'=>array('create')),
    array('label'=>'Create multiple take', 'url'=>array('create_multiple')),
    array('label'=>'Manage take', 'url'=>array('admin')),
);
Yii::app()->clientScript->registerScript('search', "
$('.search-button').click(function(){
    $('.search-form').toggle();
    return false;
});
$('.search-form form').submit(function(){

    $.fn.yiiListView.update('takelistview', { 

        data: $(this).serialize()
    });

    return false;
});
");
?>

<h1>Takes</h1>

<?php echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php  $this->renderPartial('_search',array(
    'model'=>$model,
)); ?>
</div>

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
    'id'=>'takelistview',
    'sortableAttributes'=>array('id', 'data', 'take_mono_nf_id', 'take_mono_ff_id')
)); ?>

<?php echo CHtml::link('Download all','#',array('class'=>'download-button')); ?>

<form style="display: hidden" action="index.php?r=take/download_several" method="POST" id="form">

</form>
<script>
    $('.download-button').click(function(){
        var i = 0;
        var indexes = [];   
        while($.fn.yiiListView.getKey('takelistview', i)){
            indexes[i] = $.fn.yiiListView.getKey('takelistview', i);

            var newdiv = document.createElement('div');
            newdiv.innerHTML = '<input type="hidden" id="indexes" name="indexes[]" value="'+indexes[i]+'"/>';
            document.getElementById('form').appendChild(newdiv);            
            i++;
        }
        newdiv = document.createElement('div');
        //newdiv.innerHTML = '<input type="hidden" id="folder" name="folder" value="'+folder+'"/>';
        document.getElementById('form').appendChild(newdiv);    
        //$("#indexes").val(indexes);
        $("#form").submit();

    });

</script>

问题如下。在查看页面中,高级搜索的结果分为多个页面。当我按下“全部下载”链接时,只下载当前页面中的文件我想下载所有结果。我很清楚问题出在
$.fn.yiiListView
中,但我不知道要更改什么。

因此函数
$.fn.yiiListView.getKey()
只返回当前html中的索引:

/**
 * Returns the key value for the specified row
 * @param id string the ID of the list view container
 * @param index integer the zero-based index of the data item
 * @return string the key value
 */
$.fn.yiiListView.getKey = function(id, index) {
        return $('#'+id+' > div.keys > span:eq('+index+')').text();
};
分页阻止函数获取所有键,因为它未加载到页面上

要获取所有数据,您需要在视图中随html发送所有索引。例如,在
js数组中,如下所示:

<script>    
var allIndexes = [<?php echo '"'.implode('","', $allIndexes).'"' ?>]; //creates js array from php array
</script> 
现在只在您创建的
downloadAll onclick()
函数中发布
allIndexes js数组中的所有索引,它应该下载所有内容

祝你好运

--编辑--

每次单击“下一页”时,
都会更新到数据库的当前状态


我建议您在本次活动中更新您的
js阵列
,以便所有内容始终保持最新和一致。

您好,非常感谢您的回答。我不明白最后两行代码。如果我没有错的话,在高级搜索之后加载索引页时,我必须检索搜索条件并调用
findAll()
方法。但是我如何检索标准呢?它们在您使用的
$dataProvider
中:在您的CListView小部件中。从视图的外观来看,您正在
控制器中创建它们,请简单回顾一下:我从
$dataProvider
获取条件,然后使用
findAll()
查询模型,最后调用传递结果索引的函数。对的再次感谢使用
标准是一个建议。我假设您的
take
存储在某个数据库中,并使用
列表视图显示它们。您希望在
js数组
中使用与在
列表视图
中相同的
值。如何将它们放到那里取决于您,因为我不知道应用程序的其余部分是什么样子。因此,您可以使用
findAll()
也可以不使用,这取决于您:)
<script>    
var allIndexes = [<?php echo '"'.implode('","', $allIndexes).'"' ?>]; //creates js array from php array
</script> 
$criteria = ... // create your criteria to only get the id's consistent with your ListView
$allIndexes = Take::model()->findAll($criteria); //if Take is your model name.