UpdateTopic срабатывает через раз

Здравствуйте вот такая незадача у меня случилась.
Пишу хук который реагирует на topic_edit_after
он должен поменять один параметр (записать данные через переопределенный Entity setExtraValue ) и вызвать UpdateTopic чтоб обновить эти данные. Так вот. Я сделал такую конструкцию:

			if( $this->Topic_UpdateTopic($oTopic) ) {
				print "ok";
			} else {
				print "erorr";
			}

и она срабатывает (т.е. ок появляется 1 раз из 5-ти) причем нет определенной логики.
В sql логе ничегоконкретного не вижу.
Подскажите куда копать?

9 комментариев

avatar
UpdateTopic возвращает true только в том случае, если РЕАЛЬНО были изменены какие-то данные в записи. Если вы, скажем, зашли в топик, ничего не поменяли и нажали «сохранить», то вернется false. Поэтому если вам надо менять какое-то свое значение просто не проверяйте результат UpdateTopic.
avatar
Если быть совсем точным, то возвращается число затронутых записей при выполнении mysql запроса. А если никакие данные не были изменены, то mysql возвращает 0.
avatar
А если быть совсем-совсем точным, то должно вернуть -1 если при запросе возникла ошибка :)

Что-то я сегодня никак с мыслями не соберусь…
avatar
Нет, если возникла ошибка, то возвращает FALSE
avatar
Ммм. Точно, но изначальная суть остается одной — если изменений в записи не произошло UpdateTopic возвращает FALSE, что, в общем-то не совсем правильно.
avatar
Ну, вообще-то в ЛС-е UpdateTopic ДОЛЖЕН всегда возвращать true потому что:

	public function UpdateTopic(ModuleTopic_EntityTopic $oTopic) {
		/**
		 * Получаем топик ДО изменения
		 */
		$oTopicOld=$this->GetTopicById($oTopic->getId());
		$oTopic->setDateEdit(date("Y-m-d H:i:s"));
		if ($this->oMapperTopic->UpdateTopic($oTopic)) {

т.е. принудительно устанавливается в топике дата изминения и соответственно топик ДОЛЖЕН обновится ибо обновилось как минимум одно поле.
avatar
Значит ситуация следующая, как мне кажется.
Вызывается хук «topic_edit_after» значит на момент вызова хука oTopic уже обновился.
Теперь мы меняем его TopicContent и снова вызываем UpdateTopic первой строчкой стоит
$oTopic->setDateEdit(date(«Y-m-d H:i:s»));
Теперь если изменение происходит в ту самую секунду то получается что таблица prefix_topic не изменилась и получается что функция маппера UpdateTopic не доходит до UpdateTopicContent потому что с её точки зрения топик не обновился.

Рекомендую в classes/modules/topic/Topic.class.php добавить метод UpdateTopicContent с приблизительно следующим содержанием:

	public function UpdateTopicContent($oTopic){
		return $this->oMapperTopic->UpdateTopicContent($oTopic);
	}

Таким образом можно будет обновить содержимое контента без обновления содержимого таблицы prefix_topic

Вот как-то так
avatar
Как-то писал уже об этом: livestreet.ru/blog/wishlist/11847.html

Настаиваю на том, что маппер при апдейте должен возвращать FALSE только в случае ошибки. Если обновления не произошло только потому, что сама сущность не изменилась — это НЕ ошибка, и маппер должен вернуть TRUE.

Причем, такое некорректное поведение движка тянется с незапамятных времен и периодически вызывает гемор разного рода при разработке плагинов
avatar
Поддерживаю
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.