/** * Обработка изменений полей врача перед сохранением для изменения рейтинга и шкалы заполненности профайла * @param Doctor $doctor * @param PreUpdateEventArgs $args */ public function changeDoctor(Doctor $doctor, PreUpdateEventArgs $args) { # изменение рейтинговых полей foreach ($this->ratingFields as $field => $bonus) { # если рейтинговое поле изменилось if ($args->hasChangedField($field)) { $new = $args->getNewValue($field); $old = $args->getOldValue($field); # если поле заполнили - добавляем баллы в рейтинг. Если очистили - снимаем. if (empty($old) && !empty($new)) { $doctor->addRating($bonus); } elseif (empty($new) && !empty($old) && !is_array($old)) { $doctor->subRating($bonus); } } } $filledBonus = intval(100 / count($this->filledFields)); // = 5 # изменение полей, влияющих на заполненность профайла foreach ($this->filledFields as $field) { if ($args->hasChangedField($field)) { $new = $args->getNewValue($field); $old = $args->getOldValue($field); # если поле заполнили - заполняем шкалу профиля, иначе снимаем if (empty($old) && !empty($new)) { $doctor->addFilled($filledBonus); } elseif (empty($new) && !empty($old) && !is_array($old)) { $doctor->subFilled($filledBonus); } } } }