Можно ли использовать смещение при использовании класса Symfony sfPager? - PullRequest
0 голосов
/ 02 ноября 2009

Я хотел бы игнорировать первые n элементов в списке элементов пейджера. То есть они используются в других местах проекта.

Итак, мой список пейджеров должен быть таким:

Page 1: Items  8 - 17
Page 2: Items 18 - 27
Page 3: Items 28 - 37
...

Однако установка смещения или предела в объекте критериев ничего не делает. Я предполагаю, что они используются самим пейджером.

Можно ли добавить смещение к классу пейджера каким-либо другим способом?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2009

Более простое решение - выборочный метод:

$pager->setPeerMethod('doSelectCustom');

и затем поместите свою логику в модель Peer Class:

public static function doSelectCustom($c)
{
   $c2 = clone $c;
   $offset = $c2->getOffset();
   $limit = $c2->getLimit();
   $someCustomVar = someClass::someMethod();
   if ($offset == 0) // we are in the first page 
   {
      $c2->setLimit($limit - $someCustomVar);
      $c2->add(self::SOMECOLUMN, false);
   } else $c2->setOffset($offset - $someCustomVar);
   return self::doSelectRS($c2); // or doSelect if you wanna retrieve objects
}
0 голосов
/ 02 ноября 2009

Хорошо, я обошёл проблему, изменив sfPropelPager.class.php и поместив его в новый файл класса, который я назвал atPropelPagerOffset.class.php

Он работает точно так же, за исключением того, что принимает дополнительный параметр, $offset

Итак, верхняя часть файла выглядит так:

  protected
    $criteria               = null,
    $peer_method_name       = 'doSelect',
    $peer_count_method_name = 'doCount',
    $offset                 = 0;

  public function __construct($class, $maxPerPage = 10, $offset = 0)
  {
    parent::__construct($class, $maxPerPage);

    $this->setCriteria(new Criteria());
    $this->tableName = constant($class.'Peer::TABLE_NAME');
    $this->offset = $offset;
  }

Затем я сделал это крошечное изменение в строке 50

.
  $c->setOffset($offset+$this->offset);

Работает угощение!

...