ошибка при рендеринге формы редактирования Symfony 4, включающей тип файла - PullRequest
0 голосов
/ 08 февраля 2019

Я выполняю действия, описанные в этой документации https://symfony.com/doc/current/controller/upload_file.html, чтобы разрешить загрузку файла.Он отлично работает для добавления нового элемента, но когда я пытаюсь отредактировать свою сущность, я получаю следующую ошибку:

Ожидается, что данные представления формы будут экземпляром класса Symfony \ Component \ HttpFoundation\ File \ File, но является (n) строкой.Вы можете избежать этой ошибки, установив для параметра data_class значение null или добавив преобразователь представления, который преобразует строку (n) в экземпляр Symfony \ Component \ HttpFoundation \ File \ File.

попробовал код, подобный тому, что предлагается в этой статье, чтобы добавить путь к папке как тип файла к объекту, как это в моем методе обновления:

public function editAction(Request $request, Advertiser $advertiser)
{

    $advertiser->setLogo(
        new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
    );

    $editForm = $this->createForm(AdvertiserType::class, $advertiser);

    $editForm->handleRequest($request);
    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $this->getDoctrine()->getManager()->flush();
        return $this->redirectToRoute('advertiser_list');
    }
    return $this->render('advertiser/index.html.twig', [
        'form' => $editForm->createView()
    ]);
}

Параметр logo_directory определен правильно (и работает нормально для созданияновые лица).

Пожалуйста, дайте мне знать, если у вас есть идеи, что я делаю неправильно.

Спасибо за помощь.

ОБНОВЛЕНИЕ: В этой статье Ожидается, что данные представления формы будут экземпляром класса ... но это (n) строка есть предлагаемое решение для включения в код построителя формы следующего:

->add('file', FileType::class, array('data_class' => null))

ИтакЯ делаю это сейчас, и форма редактирования покажет - но она не предварительно подготовлена ​​к предыдущему выбору.

->add('logo', FileType::class, array('data_class' => null), ['label' => 'Logo (JPG or PNG file)'])

Любые мысли о том, как это можно изменить, чтобы форма показывалась вместе спредыдущий выбор предварительно заполнен?

1 Ответ

0 голосов
/ 11 февраля 2019

Установка значения NULL data_class удалит предупреждение, но оно не будет работать, вам оно не нужно на данный момент.

Это связано с тем, что после сохранения файла остается то, что остаетсяв вашей базе данных это просто путь, а не сам файл (, который находится на диске );

Если вы хотите снова отредактировать эту сущность, путь (строку) необходимо преобразовать вобъект File снова;Это то, что говорится в сообщении об ошибке.

.. и это то, что вы сделали, когда написали:

$advertiser->setLogo(
    new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
);

Теперь проблема в том, что вы хотите предварительно заполнить поле файла.На самом деле это невозможно, поскольку поле файла указывает на местоположение на вашем собственном компьютере, а не на файл на вашем сервере (, и вы не можете автоматически загружать что-либо с чьего-либо компьютера, как это, это было бы очень опасно ).

То, что вы хотите сделать, это, возможно, указать, что файл уже сохранен, получить его путь и, возможно, отобразить его для вашего пользователя.

Итак, в вашем шаблоне Twig что-то вродечто ( меняется с вашим настоящим каталогом логотипа ):

{% if form.logo.vars.data %}
  <img src="{{ asset('/uploads/logos_directory/' ~ form.logo.vars.data.filename) }}"/>
{% endif %}

Надеюсь, это понятно.

...