Question

still a novice, but I am fighting with the paginator to limit my view to 10 records [properties] and to sort it on a field in the properties model. What am I doing wrong or miss in my code to get the paginator to control my view???

I have 2 models, Regions and Properties, a region has many properties, for example, my view is /region/view/13 This shows all properties for region 13.

The paginator is displaying the correct amount of properties, set the pages correct and all seems correct, but the paginator is not limiting my view, it just displays all properties by that region in one huge list instead of limit the view to 10 per page. The sort per sleeps doesn't work either although the url in the browser seems to be ok.

/regions/view/13/sort:sleeps/direction:asc
/regions/view/13/sort:sleeps/direction:desc

Model:

<?php
App::uses('AppModel', 'Model');
/**
* Region Model
*
* @property Country $Country
* @property Property $Property
*/
class Region extends AppModel {

/**
* Display field
*
* @var string
*/
public $displayField = 'regionname';


/**
* belongsTo associations
*
* @var array
*/
public $belongsTo = array(
    'Country' => array(
        'className' => 'Country',
        'foreignKey' => 'country_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

/**
* hasMany associations
*
* @var array
*/
public $hasMany = array(
    'Property' => array(
        'className' => 'Property',
        'foreignKey' => 'region_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
);

}

Controller:

    public function view($id = null) {
    if (!$this->Region->exists($id)) {
        throw new NotFoundException(__('Invalid region'));
    }
            $this->Region->recursive = 2; // related to associated model data, Region -> Properties -> PropertyImages
    $options = array('conditions' => array('Region.' . $this->Region->primaryKey => $id));
    $total = $this->Region->Property->find('count', array(
                    'conditions' => array('Property.region_id' => $id)
                    ));
            $this->set('total', $total);  // Push to counter the view.
            $this->set('region', $this->Region->find('first', $options)); // Push the properties to the view.
            $this->paginate = array(
                'limit' => 10,    
                'conditions' => array('Property.region_id' => $id),
                );
            $this->Region->Property->virtualFields['sleeps'] = 'Property.sleeps';
            $this->set('regions', $this->paginate('Property'));
}    

View:

<div class="paging">
<?php
echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled'));
echo $this->Paginator->numbers(array('separator' => ''));
echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next   disabled')); ?>
</div>
<br>
<?php
echo $this->Paginator->counter(array(
'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}'))); ?><br>

Total properties: <?php echo $total . "\n"; ?><br>
Sort by: <?php echo $this->Paginator->sort('sleeps'); ?>

<?php if (!empty($region['Property'])): ?>
<div class="regionviewfooter"></div>
<?php 
$i = 0;
foreach ($region['Property'] as $property): ?>
<!-- We only need 1 image to show up -->
<?php foreach ($property['PropertyImage'] as $key =>$propertyImage): ?>
    <div class="regionview">
        <div class="regionviewleft">
            <?php echo '<span style="font-size:12px;line-height:18px;font-weight:bold;">'; echo $this->Html->link(__($property['description']), array('controller' => 'properties', 'action' => 'view', $property['id'])); echo '</span>'; ?>
            <div class="regionviewheader">Sleeps&nbsp;<?php echo $property['sleeps']; echo ' :: ' ?>
                    <?php
                    if ($property['minPrice'] == 0) {
                        echo 'Please call for prices';
                    } else {
                        echo 'Prices from ';
                        echo $this->Number->currency($property['minPrice'], 'GBP');
                        if ($property['maxPrice'] == 0) {
                            echo ' PW';
                        } else {
                            echo ' - ';
                            echo $this->Number->currency($property['maxPrice'], 'GBP');
                            echo ' PW';
                        }
                    }
                    echo '<span style="font-size:11px;line-height:18px;font-weight:normal;">'; echo ' :: ';
                    echo $this->Html->link(__('View Property'), array('controller' => 'properties', 'action' => 'view', $property['id'])); echo '</span>'; ?>
            </div>
                <?php echo ($property['shortDesc']); ?><br>
                <a href="../../enqlist">Add to my Enquiry List</a> :: Property Ref.    (<?php echo strtoupper($property['ref']); ?>)
        </div>
        <div class="regionviewright">
            <!-- display image -->
            <?php echo $this->Html->image(($propertyImage['filename']), array('alt' => ($propertyImage['description']),'width' => '150' ,'height' => '77')); $key ?>
            <?php $key++; ?>
        </div>
    </div>
    <div class="clear"></div>
    <div class="regionviewfooter"></div>
    <?php if ($key == 1) {
            break; // Stop, we did 1 image.
        }
    ?>
    <?php endforeach; ?>
  <?php endforeach; ?>
<?php endif; ?>
<br><a href="#top">Top of Page</a><br><br>
Was it helpful?

Solution

You're setting your paginated results to $regions, yet in your view, you're looping through and displaying $region (singular), which is a straight-up find() above, with recursive 2, which will pull all properties.

So - although there are many other things that need cleaned up with your code, for now, just use $regions (plural) instead of $region singular in your View.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top