Судя по приведенному коду - если self::$_items[$type] уже существует, то вызов функции loadItems($type)
пропускается. А функция эта, опять же судя по коду, чего то шебуршит в базе данных. При многократных выхозовах должно работать быстрее. Видимо за этим.
protected function afterSave()
{
parent::afterSave();
Tag::model()->updateFrequency($this->_oldTags, $this->tags);
}
вторым методом мы нанизываем еще одно действие на родительский метод. а первый метод используется другим образов. вот и вопрос - чем отличаются эти два метода что их по разному используют или есть какой-то другая причина обусловленная функционалом?
Если я правильно понимаю, если beforeSave возвращает false сохранение данных не происходит, поэтому проверяется что возвращает родительский метод, а родительский метод запускает onBeforeSave события повидений (behaviors). А в методе afterSave это не требуется
Во фреймворке есть такие такие штуки как поведения behaviors, можно написать процедуры которые будут повторно использоваться в нескольких моделях. При выполнении поведения в котором есть событие onBeforeSave можно отменить сохранение данных в базу, для примера есть несколько таблиц у которых есть поле ДатаВремя перед сохранением этого поля мы преобразуем с формата dd.mm.yyyy в формат базы yyyy-mm-dd например, тут же нам нужно проверить допустимое значение, и если данные не корректные то возвращаем фальш и данные не будут внесены в базу, хотя такую проверку лучше реализовывать через rules(), но может быть разные случаи, может быть вариант что ошибки нету но данные не нужно вносить в базу, все зависит от ситуации. А метод afterSave не будет выполняться если возникла ошибка или сохрание данных было отменено.
П.С. Я относительно новичок, если я что то не правильно понимаю поправьте меня специ )
Порой не столько важна возможность отменить сохранение в beforeSave(), сколько бывает необходимо каким-либо образом изменить данные перед записью их в базу или что-нибудь куда-нибудь записать (но последнее чаще делается в afterSave()).