phpcakephpcakephp-2.0

How I can paginate custom array in CakePHP


I want to paginate in view for a custom array. My controller and view code is given below.

Controller Code:

public function admin_detail(){
        $totalByDate = $this->Pbscodemetric->find('all',array('fields'=>array('created')));
        $createdDate = Set::extract('/Pbscodemetric/created', $totalByDate);
        $uniqueCreatedDate = array_unique($createdDate);
        $finalArray = array();
        foreach($uniqueCreatedDate as $created){
            $downloadsArr = $this->Pbscodemetric->find('all',array('fields'=>array('downloads_iphone','downloads_ipad','downloads_android'),'conditions'=>array('created'=>$created)));
            $download_iphone = array_sum(Set::extract('/Pbscodemetric/downloads_iphone',$downloadsArr));
            $download_ipad = array_sum(Set::extract('/Pbscodemetric/downloads_ipad',$downloadsArr));
            $downloads_android = array_sum(Set::extract('/Pbscodemetric/downloads_android',$downloadsArr));
            $finalArray[$created] = array(
                'downloads_iphone' => $download_iphone,
                'downloads_ipad' => $download_ipad,
                'downloads_android' => $downloads_android
            );
        }
        $this->set('finalArray',$finalArray);
    }

View Code:

<div class="pbscodemetrics index">
    <h2><?php echo __('Pbscodemetrics List Detail'); ?></h2>
    <table cellpadding="0" cellspacing="0">
        <tr>
            <th>Date</th>
            <th>iPhone</th>
            <th>iPad</th>
            <th>Android</th>    
        </tr>
        <?php 
        foreach($finalArray as $key => $final){?>
            <tr> 
                <td><?php echo $key;?></td>
                <td><?php echo $final['downloads_iphone'];?></td>
                <td><?php echo $final['downloads_ipad'];?></td>
                <td><?php echo $final['downloads_android'];?></td>
            </tr>
            <?php }?>
    </table>
</div>
<div class="actions">
    <?php echo $this->element('nav');?>
</div>

Now I want to set pagination. I know in CakePHP default pagination needs Model name. But How can I do that for the above code?

Can anyone help me please..


Solution

  • You could implement a custom pagination, see Custom Query Pagination in the Cookbook. However, it looks like what you're doing there could be done using grouping and the SQL SUM function, that way you could then simply use the built-in pagination. Example:

    $alias = $this->Pbscodemetric->alias;
    
    $this->Pbscodemetric->virtualFields = array
    (
        'downloads_iphone_sum' => sprintf('SUM(`%s.downloads_iphone`)', $alias),
        'downloads_ipad_sum' => sprintf('SUM(`%s.downloads_ipad`)', $alias),
        'downloads_android_sum' => sprintf('SUM(`%s.downloads_android`)', $alias)
    );
    
    $this->paginate = array
    (
        'fields' => array
        (
            'downloads_iphone_sum',
            'downloads_ipad_sum',
            'downloads_android_sum',
            'created'
        ),
        'group' => 'created',
        'order' => array
        (
            'created' => 'desc'
        ),
        'limit' => 10
    );
    
    $data = $this->paginate($alias);
    

    This will give you Paginator helper compatible results with summed downloads_iphone, downloads_ipad and downloads_android columns, grouped by the created column. It uses virtual fields in order to retreive results in the default CakePHP style, ie they will be accessible like this:

        <?php foreach($results as $result): ?>
            <tr> 
                <td><?php echo $result['Pbscodemetric']['created'];?></td>
                <td><?php echo $result['Pbscodemetric']['downloads_iphone_sum'];?></td>
                <td><?php echo $result['Pbscodemetric']['downloads_ipad_sum'];?></td>
                <td><?php echo $result['Pbscodemetric']['downloads_android_sum'];?></td>
            </tr>
        <?php endforeach; ?>