После некоторых исследований:
Хотя вы можете расширить sfValidatedFile и переопределить generateFilename, я обнаружил, что sfFormPropel проверяет существование метода на основе имени столбца для модели, присваивающей файлу имя.
Из строки symfony / plugins / sfPropelPlugin / lib / form 292:
$method = sprintf('generate%sFilename', $column);
if (null !== $filename)
{
return $file->save($filename);
}
else if (method_exists($this, $method))
{
return $file->save($this->$method($file));
}
Поэтому, если ваш столбец называется file_name, метод ищет существование generateFileNameFilename в классе формы. Таким образом, вам нужно добавить только один метод в ваш класс формы, а не расширять виджет sfValidatedFile. Например, моя функция использует исходное имя, если оно не взято, в противном случае добавляется порядковый номер (один из методов - рекурсивная проверка сгенерированного имени файла):
public function generateFileNameFilename($file = null)
{
if (null === $file) {
// use a random filename instead
return null;
}
if (file_exists($file->getpath().$file->getOriginalName())) {
return $this->appendToName($file);
}
return $file->getOriginalName();
}
public function appendToName($file, $index = 0)
{
$newname = pathinfo($file->getOriginalName(), PATHINFO_FILENAME).$index.$file->getExtension();
if (file_exists($file->getpath().$newname)) {
return $this->appendToName($file, ++$index);
} else {
return $newname;
}
}
Я нигде не могу найти это в API Symfony, поэтому потребовался поиск по базе кода. Если вы используете этот метод во многих местах, расширение sfValidatedFile также может быть хорошим вариантом.