#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);