creocoder / yii2-nested-sets

The nested sets behavior for the Yii framework.
Other
446 stars 129 forks source link

В какой момент меняются аттрибуты для дочернего элемента? #76

Open matperez opened 9 years ago

matperez commented 9 years ago

Привет! Извини, что по русски - много писать.

Пытаюсь сделать иерархические страницы. Для каждой страницы задаю поведение

            [
                'class' => NestedSetsBehavior::className(),
                 'leftAttribute' => 'lft',
                 'rightAttribute' => 'rgt',
                 'depthAttribute' => 'depth',
            ],

Дальше провожу вот такой тест, который падает:

        Page::deleteAll();

        $root = new Page([
            'url' => 'info',
            'title' => 'root',
            'content' => 'info root',
        ]);
        $root->makeRoot();

        $block1 = new Page([
            'url' => 'info/block1',
            'title' => 'block 1',
            'content' => 'block 1',
        ]);
        $block1->appendTo($root);

        $this->assertTrue($block1->isChildOf($root));

Если последний assert заменить на

        $block2 = new Page([
            'url' => 'info/block2',
            'title' => 'block 2',
            'content' => 'block 2',
        ]);
        $block2->appendTo($root);
        $this->assertTrue($block1->isChildOf($root));
        $this->assertTrue($block2->isChildOf($root));

Тогда первый assert выполняется, а второй снова падает. Т.е. выходит, что первый потомок начинает определяться как потомок только после добавления второго.

Заметил это потому что после добавления всех блоков $root->children(1)->all() возвращал всех потомков кроме последнего.

В базе после этого вроде бы все в порядке.

[{
  "id": 115,
  "url": "info",
  "title": "root",
  "content": "info root",
  "created": "2015-05-20 16:13:13",
  "updated": "2015-05-20 16:13:13",
  "lft": 1,
  "rgt": 6,
  "depth": 0,
 },
 {
  "id": 116,
  "url": "info/block1",
  "title": "block 1",
  "content": "block 1",
  "created": "2015-05-20 16:13:14",
  "updated": "2015-05-20 16:13:14",
  "lft": 2,
  "rgt": 3,
  "depth": 1,
 },
 {
  "id": 117,
  "url": "info/block2",
  "title": "block 2",
  "content": "block 2",
  "created": "2015-05-20 16:13:17",
  "updated": "2015-05-20 16:13:17",
  "lft": 4,
  "rgt": 5,
  "depth": 1,
 }
]

В composer.json у меня

"creocoder/yii2-nested-sets": "*",

Подскажи, это какой-то баг или я делаю все неверно?

matperez commented 9 years ago

Заметил так же, что это происходит только, если делать проверку сразу после добавления элементов в базу. Если сначала переполучить корень из базы, тогда проверки проходят нормально:

$root->refresh();
$this->assertTrue($block1->isChildOf($root));
$this->assertTrue($block2->isChildOf($root));