5

Sortable動作を持つエンティティを作成しましたが、その使用について 1 つの質問があります。位置を設定および取得するためのメソッドは私にとって十分ではないため、次のコードで単純なmoveUpおよびmoveDown
メソッド を実行したいと考えてい ます。

public function moveUp() {
    ++$this->position;
}

public function moveDown() {
    if($this->position != 0)
        --$this->position;
}

この実装では、moveUpメソッドには、すでに最大位置にあるアイテムをインクリメントするための制限がありません。そのようなアイテムの増加を禁止する最良の方法は何ですか? エンティティで直接カスタム クエリを実行するのは良い方法ではないと聞いたので、アイテムに既に最大値があるかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

2

ここで同じ問題が発生しました。コードを読んで、次のことに気付きました。

// Compute position if it is negative
if ($newPosition < 0) {
    $newPosition += $this->maxPositions[$hash] + 2; // position == -1 => append at end of list
    if ($newPosition < 0) $newPosition = 0;
}

( SortableListener:141内)

-1位置に設定することで、リストの最後に移動されると思います。そして-2、最後から2番目に配置します。


編集:申し訳ありませんが、答えが速すぎました。追加したかったのは:

自分でポジションを制限する必要はないと思いますSortableListener

// Set position to max position if it is too big
$newPosition = min(array($this->maxPositions[$hash] + 1, $newPosition));

したがって、あなたのmoveUp()機能は次のようになります(ところで、逆moveUpにしましたmoveDownか?):

public function moveUp()
{
    if ($this->position != 0) {
        $this->position--;
    }
}
public function moveDown()
{
    $this->position++;
}

更新: いくつかのテストの後、その機能にバグがあることが判明しました。

setPosition(-1)オブジェクトをリストの最後に配置しますが、位置にギャップが生じます。

ここで再現しました: https://github.com/l3pp4rd/DoctrineExtensions/pull/908

修正されることを願っています。

于 2013-11-20T09:39:12.303 に答える
0

データベースからフェッチされた最大値をSortableMaxAwareインターフェイスdエンティティに取り込むイベントリスナーをフックすることができます。これはもちろん面倒ですが、ORMを使用しています:)楽しんでください。

于 2013-03-06T11:41:02.317 に答える