"Хорошо" - подумал я, и решил перемещать временный файл в методе afterSave. Но тогда после перемещения мне нужно изменить адрес файла в базе, тогда afterSave дергается опять, и опять, и опять?!
о каком адресе идет речь? у Вас есть место для хранения файла /userdata/pdfs/XXXX Вам достаточно хранить название файла - не нужно хранить весь путь к нему. Т.е. вы можете спокойно сохранить запись с названием, а потом на afterSave его переместить
Допустим есть путь к файлу /userdata/pdfs/module/id/filename.pdf.
Каждый файл соответственно относится к какому-то модулю, насколько я понимаю принадлежность модуля определяется до сохранения данных модели. Что мешает сделать следующее?
1. Вынести путь к файлам /userdata/pdfs/ в какой-то алиас или на крайний случай в константу
2. В модель добавить атрибут $module - в который на стадии загрузки записывать информацию о модуле.
3. В модель добавить атрибут $filename - в котором на стадии загрузки записывать название файла
4. На afterSave сделать перемещения файла
5. Полный путь к файлу получать как совокупность всех этих данных
Т.е. сделать приблизительно так:
/**
* @property $id ID
* @property $issue_date Дата выпуска
* @property $issue_num Номер газеты
* @property $year_num Номер в году
* @property $size Размер файла
* @property $created_by Создано
* @property $updated_by Обновлено
* @property $created_at Дата создания
* @property $updated_at Дата обновления
* @property $view_count Количество просмотров
* @property $download_count Количество скачиваний
* @property $is_active Активность
*
* @property $module Модуль к которому относится файл
* @property $filename Название файла (вместе с расширением)
*/
class PdfFile extends \yii\db\ActiveRecord
{
/**
* @var string Путь к папке загрузок, но вообще лучше его вынести в алиас
*/
const PATH = '/userdata/pdfs/'
/**
* Функция получения полного пути к файлу
*
* @return string
*/
public function getFilepath() {
return $this::PATH . $this->module . '/' . $this->id . '/' . $this->filename;
}
/**
* @inheritdoc
*/
public function afterSave( $insert, $changedAttributes ){
// тут перемещаем файл с временной папки в папку $model->getFilepath
}
}