Окружение: OctoberCMS v1 build 476.

Пациент: modules/backend/traits/UploadableWidget.php

Недостатки:

  1. При наличии уже загруженного файла с таким же именем как загружаемый первый заменяется вторым.
  2. Символ подчерка _ из имени файлы вырезается.
  3. Был ещё баг с русскими именами на хосте (обрезались первые слова имени файла), но это от неустановленной русской локали, не имеет отношения к вопросу.

Основной вопрос: Как можно заменить (перекрыть) трейт 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 после обновления ядра. Понимаю, не столь частая процедура в первой версии октября, но суть вопроса от этого не меняется.

Резюмирую основной вопрос: Как можно заменить (перекрыть) трейт без правки ядра? Либо иной путь реализации, пока не вижу какой.

  • reazzon ответили на это сообщение.

    eriksonik Как можно заменить (перекрыть) трейт без правки ядра?

    Никак.

    eriksonik Либо иной путь реализации, пока не вижу какой.

    В October CMS v3 такого трейта вообще нет, и было очень много правок по медиабиблиотеке. Может там уже твоя проблема решена?

    • eriksonik ответили на это сообщение.

      reazzon Никак.

      Я правильно понимаю, что моё единственное решение - замена трейта ядра? Без вариантов?

      reazzon В October CMS v3 такого трейта вообще нет, и было очень много правок по медиабиблиотеке. Может там уже твоя проблема решена?

      Третью версию детально код не изучал за неимением оного в доступности. Проводил тестирование на демосайте.

      2 месяца спустя

      Как удалить этот тред?