2009-11-02 1 views
0

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

Так что мой список пейджера должен быть такой:

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

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

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

ответ

0

Хорошо, у меня вокруг проблемы путем изменения 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); 

Работает с удовольствием!

0

Simpler решение будет обычай выбора метода:

$pager->setPeerMethod('doSelectCustom'); 

, а затем положить вашу логику в модель Peer Класс:

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 
}