Zend Pagination - кажется, не ограничивает количество результатов на каждой странице

Я относительно новичок в фреймворке Zend, работаю с ним максимум два месяца. Теперь я пытаюсь получить список результатов из запроса, который я запускаю, отправить его через класс zend paginator и отобразить 4 результата на странице, однако, похоже, он не распознает, когда он получил 4 результата, я считаю, что есть ошибка в моем коде, но я не могу ее увидеть, я надеялся, что кто-то здесь сможет ее обнаружить, помочь мне и, возможно, сказать мне, что это какая-то глупость, которую я пропустил. Спасибо, вот код, который я написал.

Это запрос в моей модели

public function getAllNews()
{
    $db = Zend_Registry::get('db');

    $sql = "SELECT * FROM $this->_name WHERE flag = 1 ORDER BY created_at";

    $query = $db->query($sql);
    while ($row = $query->fetchAll()) {
        $result[] = $row;
    }

    return $result;
}

Это код в моем контроллере

function preDispatch()
{
$this->_helper->layout->setLayout('latestnews');
    Zend_Loader::loadClass('newsArticles');
    $allNews = new newsArticles();
    $this->view->allNews = $allNews->getAllnews();
    //die (var_dump($this->view->allNews));
    $data = $this->view->allNews;
    // Instantiate the Zend Paginator and give it the Zend_Db_Select instance  Argument ($selection)
    $paginator = Zend_Paginator::factory($data);
    // Set parameters for paginator
    $paginator->setCurrentPageNumber($this->_getParam("page")); // Note: For this to work of course, your URL must be something like this: http://localhost:8888/index/index/page/1  <- meaning we are currently on page one, and pass that value into the "setCurrentPageNumber"
    $paginator->setItemCountPerPage(1);
    $paginator->setPageRange(4);
    // Make paginator available in your views
    $this->view->paginator = $paginator;
    //die(var_dump($data));
}

Ниже представлен вид, который строит пагинатор,

    <?php if ($this->pageCount): ?> 
<div class="paginationControl">
<!-- Previous page link --> 
<?php if (isset($this->previous)): ?> 
  <a href="<?= $this->url(array('page' => $this->previous)); ?>">&lt; Previous</a> | 
<?php else: ?> 
  <span class="disabled">&lt; Previous</span> | 
<?php endif; ?> 

<!-- Numbered page links -->
<?php foreach ($this->pagesInRange as $page): ?> 
  <?php if ($page != $this->current): ?>
    <a href="<?= $this->url(array('page' => $page)); ?>"><?= $page; ?></a> | 
  <?php else: ?>
    <?= $page; ?> | 
  <?php endif; ?>
<?php endforeach; ?>

<!-- Next page link --> 
<?php if (isset($this->next)): ?> 
  <a href="<?= $this->url(array('page' => $this->next)); ?>">Next &gt;</a>
<?php else: ?> 
  <span class="disabled">Next &gt;</span>
<?php endif; ?> 
</div> 
<?php endif; ?> 

И, наконец, код составляет мою точку зрения

<div id="rightColumn">
                <h3>Latest News</h3>
                <?php if (count($this->paginator)): ?>
                    <ul>
                        <?php foreach ($this->paginator as $item): ?>
                            <?php
                            foreach ($item as $k => $v)
                            {
                                echo "<li>" . $v['title'] . "</li>";
                            }
                            ?>

                        <?php endforeach; ?>
                    </ul>
                <?php endif; ?>

<?= $this->paginationControl($this->paginator, 'Sliding', '/latestnews/partial_pagination_control.phtml'); ?> 
                </div>

Я буду благодарен за любую помощь, которую вы можете мне оказать.

Спасибо

Сико


person Community    schedule 01.01.2009    source источник


Ответы (3)


Для параметра $paginator должно быть установлено значение 4, так как вы хотите отображать только 4 записи за раз:

$paginator->setItemCountPerPage(4);
person Pushpendra    schedule 04.05.2011

Поэтому я думаю, что корень вашей проблемы в вашем классе модели с функцией getAllNews. Функция Zend_Db fetchAll извлекает ассоциативный массив всех записей, соответствующих вашему запросу. Вы возвращаете массив из одного элемента, который представляет собой массив всех строк, полученных вашим оператором select.

Попробуй это:

public function getAllNews()
{
        $db = Zend_Registry::get('db');

        $sql = "SELECT * FROM $this->_name WHERE flag = 1 ORDER BY created_at";

        return $db->fetchAll($sql);
}
person Brian Fisher    schedule 01.01.2009

Вы не должны передавать значения в paginator, если хотите, чтобы он ограничивал ваш запрос. Код вам подойдет

$usersTable = $this->getTable();
        $registerSelect = $usersTable->select()->where('status = ?', 'OK')->order('lastLogin DESC');
        $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($registerSelect));
        $paginator->setCurrentPageNumber($page);
        $paginator->setItemCountPerPage($limit);
person waney    schedule 30.01.2009