Окружение: OctoberCMS v1 build 476.
Пациент: modules/backend/traits/UploadableWidget.php
Недостатки:
- При наличии уже загруженного файла с таким же именем как загружаемый первый заменяется вторым.
- Символ подчерка
_
из имени файлы вырезается.
- Был ещё баг с русскими именами на хосте (обрезались первые слова имени файла), но это от неустановленной русской локали, не имеет отношения к вопросу.
Основной вопрос: Как можно заменить (перекрыть) трейт UploadableWidget.php без правки ядра?
Вопрос сразу о правке файла ядра, поясню почему. Во-первых настораживает молчание об этом баге. Ни в одной версии октября не исправлено. Писал разрабам - обещали пофиксить. Прошло достаточно времени, а фикса нет. Да и вообще очень хочется разобраться как вносить изменения в логику не меняя файлов ядра.
Немного подробностей о трейте почему он меня не устраивает. Да там есть евент (метод UploadableWidget::onUpload), но он расположен в коде так, что евентить приходится уже с загруженным файлом, т.е. когда одноимённый файл уже безвозвратно заменён. Я ставлю перед евентом проверку существования файла по загружаемому пути:
/*
* Костыль. Добавляем суффикс к имени файла.
*/
$filePath = (new \Gkh\Api\Classes\UniqueFileName($filePath))->get();
// Далее код ядра...
MediaLibrary::instance()->put(
$filePath,
File::get($realPath)
);
Далее в методе UploadableWidget::cleanFileName добавляю в регулярку подчерк чтобы не он вычищался из имени файла:
// Remove all characters that are not the separator, letters, numbers, whitespace or @.
$title = preg_replace('![^'.preg_quote($separator).'_\pL\pN\s@]+!u', '', mb_strtolower($title));
В результате работает как ожидается. Но имея ряд сайтов приходится тратить время на исправление UploadableWidget.php после обновления ядра. Понимаю, не столь частая процедура в первой версии октября, но суть вопроса от этого не меняется.
Резюмирую основной вопрос: Как можно заменить (перекрыть) трейт без правки ядра? Либо иной путь реализации, пока не вижу какой.