Отображение мультимедиа Сулу в списке

#symfony #sulu

Вопрос:

Я создал сущность PlayerInfo. Внутри этого у меня есть поле для фотографий и определенный интерфейс мультимедиа, и я использую его с этим. В AdminUI все отображается нормально, в интерфейсе тоже, но когда у меня появилась идея показать миниатюру в списке, я получаю пустое поле и ошибку в консоли, которая гласит:

Указан недопустимый тип: «номер». нужен «объект». (ОШИБКА ТРАНСФОРМАТОРА)

Вот мой XML-код свойства списка:

 <property name="avatar" visibility="always" translation="sulu_admin.avatar" sortable="false">
    <field-name>id</field-name>
    <entity-name>SuluMediaBundle:Media</entity-name>
    <joins>
        <join>
            <entity-name>SuluMediaBundle:Media</entity-name>
            <field-name>AppEntityPlayerInfo.photo</field-name>
        </join>
    </joins>

    <transformer type="thumbnails"/>
</property>
 

В чем может быть проблема?

Ответ №1:

table Адаптер представления списка Sulu использует a transformer для определения того, что должно отображаться внутри ячейки, на основе данных, возвращаемых вашим API.

Вы использовали thumbnails трансформатор в своем коде. Если вы посмотрите на ThumbnailFieldTransformer реализацию, вы увидите, что преобразователь ожидает данные в таком формате:

 {
    "sulu-40x40":"/uploads/media/sulu-40x40/02/2-isle.jpg?v=1-0",
}
 

Я подозреваю, что вы использовали ListBuilder компонент Sulu для сбора данных этого списка в контроллере, реализующем ваш API (например, проект sulu-demo). ListBuilder Компонент использует оптимизированные запросы для загрузки запрошенных данных непосредственно из базы данных.

К сожалению, ListBuilder компонент возвращает только идентификатор связанного объекта мультимедиа и не преобразует данные в формат, ожидаемый ThumbnailFieldTransformer автоматически. Вам необходимо создать и установить объект, содержащий URL-адреса миниатюр в вашем контроллере, используя этот MediaManagerInterface::getFormatUrls метод.

В качестве примера вы можете посмотреть, как обрабатывается логотип организации в приложении AccountController , реализующем API для встроенного списка организаций Sulu:

 $ids = array_filter(array_column($accounts, 'logo'));
$logos = $this->mediaManager->getFormatUrls($ids, $locale);
foreach ($accounts as $key => $account) {
    if (array_key_exists('logo', $account) amp;amp; $account['logo'] amp;amp; array_key_exists($account['logo'], $logos)) {
        $accounts[$key]['logo'] = $logos[$account['logo']];
    }
}
 

Ответ №2:

Вы должны установить Изображение в своей Сущности.

Давайте возьмем, к примеру, сущность «Пользователь». Я думаю, у вас есть какое-то свойство вроде «аватара».

 /**
* @var MediaInterface|null
*/
protected $avatar;
 

Ошибка возникает из-за того, что вы сохранили только идентификатор.
Решение состоит в том, чтобы установить аватар в Сущности раньше.
например, в контроллере, который вы вызываете для списка.

  $media = $this->container->get('sulu.repository.media')->findMediaById($user->getAvatar()->getId());
 $user->setAvatar($media);