Pages

2010年3月27日土曜日

Zend_Framework SQL Server利用時 Zend_Paginatorの不具合

現在の Zend Framework1.10.0 では SQL Server を利用時Zend_Paginatorが正常に動作しない。

不具合発生条件は1ページ10件表示の場合にデータが15件等入っていた場合、2ページ目が5~10件目が表示される。

これはSQL Serverにoffsetとlimitが無いためにTOPを3重のSELECTとして実装しているから。

詳しくは DbSelect.php の147行目

$this->_select->limit($itemCountPerPage, $offset);
の後で
echo $this->_select;
すれば解る。

以下は解決策である。

今回はあまり触りたくはないがZend_Frameworkファイルの方を修正する事にした。
時間が無かったので。。。

まず「Zend\Paginator\Adapter\DbSelect.php」ファイルの147行目にある
$this->_select->limit($itemCountPerPage, $offset);
の上に
$this->_select->getAdapter()->setRowCount($this->count());
を追記する。
これによって問題の処理を行っているところに正常な判断材料となる全件数を渡す。

同じように「Zend\Paginator\Adapter\DbTableSelect.php」の 44行目にある
$this->_select->limit($itemCountPerPage, $offset);
の上に
$this->_select->getAdapter()->setRowCount($this->count());
を追記する。

次に「Zend\Db\Adapter\Mssql.php」ファイルの最後に以下メソッドを追加する。

public function getRowCount()
{
    return $this->_rowCount;
}

public function setRowCount($count)
{
    $this->_rowCount = $count;
}
これでさきほどの全件数を受け取る事ができ、取得できるようになる。
プロパティに直接でも良かったんですが、一応Zend_Frameworkらしくメソッドを用意しました。

同ファイル48行目に下記を追加
protected $_rowCount;
念のため宣言しておく。

次に同じファイルの367行目に以下を追記する。

if (!is_null($this->getRowCount()) && ($count+$offset) > $this->getRowCount())
    $count = $this->getRowCount() - $offset;
これによって問題箇所を正常な数値とする事ができる。

0 件のコメント:

コメントを投稿

Followers