ENestedSetBehavior - mysql error

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

ENestedSetBehavior - mysql error

Сообщение mitallast »

При попытках использования данного поведения постоянно выпадает CDbException, который уютно обрамлен try catch. В основном ошибка в запросах на апдейт, содержащих инкрементные операции и выглядящие как :

Код: Выделить всё

SET left=left+1
при этом генерится ошибка, что код до "WHERE" неверен. Алиасы таблиц отсутствуют, равно как и обратная кавычка в именах столбцов.
Позже постараюсь подробнее описать.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ENestedSetBehavior - mysql error

Сообщение samdark »

Да, надо бы подробнее т.к. у меня всё замечательно работает.
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: ENestedSetBehavior - mysql error

Сообщение mitallast »

Все оказалось проще чем я думал :
наверняка, Вы тестировали поведение в стандартных настройках и не испытывали подобных проблем ни разу - в смысле колонки у Вас назывались соответственно root, lft, rth, level или что-то типа того.

Я же, движимый желанием назвать их более понятно, обозначил их как left и right. Myqsl эти поля принял как зарезервированные функции работы со строками http://www.mysql.ru/docs/maryan/#left . Естественно, когда я названия заключил в обратные кавычки, они уже однозначно воспринялись как столюцы таблицы.
Скриншоты : http://habreffect.ru/b17/46f002f56/1.png , http://habreffect.ru/581/6233b8531/2.png

С одной стороны, ошибка моя использовать зарезервированные имена для солбцов, с другой это можно поддерживать .
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: ENestedSetBehavior - mysql error

Сообщение mitallast »

В режиме работы hasManyRoots = true, при попытке создания рутового элемента вываливается ошибка
код

Код: Выделить всё

$root = new Comment;
$root->text = 'root 1';
$root->makeRoot();
 
ошибка
PHP Error
Description
Missing argument 1 for ENestedSetBehavior::makeRoot()
в том же коде, с переданным в качестве аргумента пустым массивом, в базу данных почему-то не пишутся все атрибуты модели, только атрибут root записывается со значением, видимо равным его id. Это фича ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ENestedSetBehavior - mysql error

Сообщение samdark »

Обновляйтесь, последняя версия 0.90.
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: ENestedSetBehavior - mysql error

Сообщение mitallast »

Эту ревизию и использую.
http://code.google.com/p/yiiext/source/ ... havior.php

Строка 538:

Код: Выделить всё

 protected function makeRoot($attributes) 
и например строка 309

Код: Выделить всё

public function insertAfter($target,$runValidation=true,$attributes=null) 
Хотя нигде не говорится, что атрибут обязателен, почему-то makeRoot не выглядит как

Код: Выделить всё

 protected function makeRoot($attributes=null) 
Начет makeRoot() - я передал пустой массив как параметр. Соответственно он и ничего не добавил из атрибутов.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: ENestedSetBehavior - mysql error

Сообщение samdark »

Я не понял, как можно использовать

Код: Выделить всё

$root = new Comment;
$root->text = 'root 1';
$root->makeRoot();
 
если protected function makeRoot?
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: ENestedSetBehavior - mysql error

Сообщение mitallast »

Сейчас посмотрел, немного обалдел. И правда, ведь метод makeRoot приватный !!! Я обычно пользуюсь авто дополнением, и phpdoc на этот метод отсутствовал, а красный кружок с ключиком проглядел, искренне извиняюсь.

Насколько понял, тут сработал механизм наследования по классу CComponent, так как при вызове "$root->makeRoot();" идет вызов __call(), который общий для модели и поведения. По идее, если его перебить в CBehavior, то такого глюка не будет. Ну или проверять на access.
Ответить