[EasyComm+Swift] Загрузка фото и видео отзывов в облако Selectel.

Приветствую, делюсь с сообществом нюансами реализации такой задачи как загрузка файлов, прикрепляемых к отзывам, в облачное хранилище от Selectel.Возможно, эта заметка сэкономит кому-то немного времени.

После того как оба компонента установлены, надо их подружить, хотя очень надеялся, что они подружатся без моей помощи. Но перед этим надо зарегистрироваться в Selectel (кстати 10р он больше не дарит). Тут и начинаются нюансы.
В документации к Swift написано про какую-то корзину для которой нужно создать какую-то ссылку, но в ЛК облачного сервиса такого уже нет и вообще он выглядит не так, как на скриншотах. Но поскольку логика наше всё, не составляет труда догадаться, что корзина это контейнер и он должен быть публичным и его надо как-то назвать. И больше с контейнером ничего делать не нужно. Затем требуется создать дополнительного пользователя и назначить ему недавно созданный контейнер. !!! ВАЖНО у пользователя отметить чекбокс Использовать эти данные для доступа по протоколу S3. Далее идём в админку и создаем новый источник файлов с типом OpenStack. Указываем ему следующие настройки
  • url — 123456.selcdn.ru/container_name/
  • container — container_name
  • service — оставляем как есть ru-1
  • authentication_service — auth.selcdn.ru
  • username — логин созданного пользователя
  • api_key — его пароль
Вот после этого, я ожидал, что всё заработает, но увы. В логах увидел вот такую ошибку
PHP Fatal error: Uncaught Error: Call to a member function make() on null in /core/components/easycomm/model/easycomm/easycomm.class.php:343
Я пошёл посмотреть, чего же нет на 343 строке. И узрел вот это
$d = $this->mediaSource->fileHandler->make($path, array(), 'modDirectory');
if (!$d->exists()) {
    if (!$this->mediaSource->createContainer($internalPath, '')) {
        $this->modx->log(modX::LOG_LEVEL_ERROR, '[easyComm] Can`t create directory: '.$path);
        return false;
    }
}
Эмпирическим путём было установлено, что для корректной работы досточно выполнить метод createContainer(). Поэтому я заменил указанный выше кусок кода на
if($this->mediaSource->fileHandler){
    $d = $this->mediaSource->fileHandler->make($path, array(), 'modDirectory');
    if (!$d->exists()) {
        if (!$this->mediaSource->createContainer($internalPath, '')) {
            $this->modx->log(modX::LOG_LEVEL_ERROR, '[easyComm] Can`t create directory: '.$path);
            return false;
        }
    }
}else{
    if (!$this->mediaSource->createContainer($internalPath, '')) {
        $this->modx->log(modX::LOG_LEVEL_ERROR, '[easyComm] Can`t create directory: '.$path);
        return false;
    }
}
И, о чудо, всё заработало!

Править исходники плохая практика, но я не придумал другого решения. Если кто-то знает вариант лучше, поделитесь в комментариях.
Артур Шевченко
19 октября 2022, 12:36
modx.pro
925
+1
Поблагодарить автора Отправить деньги

Комментарии: 8

Алексей Смирнов
24 октября 2022, 09:27
0
Да, PR надо заслать, может Василий найдет минутку и влепит его.
    Артур Шевченко
    24 октября 2022, 11:00
    +1
    Мне кажется если и засылать, то к EasyComm
      Наумов Алексей
      24 октября 2022, 12:33
      0
      привет, прочитал статью!
      Да, я поправлю и выпущу обновление.
      Нюанс в том, кол-во пользователей облаков минимально и никто не сталкивался с этим в easyComm, да и я сам тоже)
        Артур Шевченко
        24 октября 2022, 13:04
        0
        Дык, я без претензий, просто поделился кейсом. Я бы и сам облаком не пользовался, но заказчик хочет видео отзывы, а на обычном хостинге много не сохранишь, вот и решили воспользоваться облаком, тем более, что всё уже было почти готово)))
    Павел Бигель
    24 октября 2022, 10:20
    0
    но я не придумал другого решения
    refactoring.guru/ru/design-patterns/decorator/php/example
      Артур Шевченко
      24 октября 2022, 11:01
      0
      Привет, ты своими словами объясни, а я погуглю, а то ссылка не открывается.
        Николай Савин
        24 октября 2022, 17:56
        0
        Предположу, Он имеет в виду, что очень умен и тоже может решить подобную задачу, но с уже с применением трех классов вместо одного.
          Артур Шевченко
          24 октября 2022, 18:44
          0
          Да уже давно никто не сомневается в его способностях)))
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8