Доброго времени суток!
Я учусь работать с Symfony и построил простейшую форму для добавления в БД. Проблема в том, что при использовании такой же формы при редактировании записи валидатор ругается на то, что файл не может быть найден, пустое поле с файлом или нет. При редактировании записи загрузка файла по сути не должна быть обязательной, поэтому добавил новую опцию в FormType, но всё равно ошибка :(
ProjectsController:
/**
* @Route("/projects/{id}/edit", name="project_edit", methods={"GET", "POST"})
*/
public function edit($id, Request $request) {
$project = $this->getDoctrine()
->getRepository(Project::class)
->find($id);
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(ProjectType::class, $project, ['require_photo' => false]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$project = $form->getData();
if ($request->files->get('photo')) {
$filesystem = new Filesystem();
$path = $this->getParameter('photos_directory') . '/' . $project->getPhoto();
$filesystem->remove($path);
$file = $form['photo']->getData();
$fileName = uniqid() . '.' . $file->guessExtension();
$file->move(
$this->getParameter('photos_directory'),
$fileName
);
$project->setPhoto($fileName);
}
$em->persist($project);
$em->flush();
$this->addFlash('success', 'Das Projekt wurde erfolgreich erschafft!');
return $this->redirectToRoute('projects', [
]);
}
ProjectEntity.php
/**
* @ORM\Entity(repositoryClass="App\Repository\ProjectRepository")
*/
class Project
{
...
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\Image(maxSize="5000k")
*/
private $photo;
...
public function getPhoto(): ?string
{
return $this->photo;
}
public function setPhoto(?string $photo): self
{
$this->photo = $photo;
return $this;
}
}
ProjectType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name', TextType::class, [
'attr' => ['class' => 'form-control'],
]);
$builder->add('description', TextareaType::class, [
'attr' => ['class' => 'form-control'],
'empty_data' => 'Beschreibung',
]);
$builder->add('site', TextType::class, [
'attr' => ['class' => 'form-control'],
'empty_data' => 'Website'
]);
$builder->add('photo', FileType::class, [
'attr' => ['class' => 'custom-file-input'],
'required' => $options['require_photo'],
'mapped' => false,
]);
$builder->add('save', SubmitType::class, [
'label' => 'Projekt erstellen',
'attr' => ['class' => 'btn btn-lg btn-success']
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Project::class,
'require_photo' => true,
]);
$resolver->setAllowedTypes('require_photo', 'bool');
}
edit.html.twig
<div class="custom-file">
{{ form_widget(form.photo) }}
{{ form_label(form.photo, 'Das Foto des Projektes', {
'label_attr': {'class': 'custom-file-label'},
}) }}
{{ form_errors(form.photo) }}
</div>
Проблема была в ProjectType
, нужно было добавить contraints
для билдера поля с файлом, и удалить валидацию файла в Entity
и validator.yaml
$builder->add('photo', FileType::class, [
'attr' => ['class' => 'custom-file-input'],
'required' => $options['require_photo'],
'mapped' => false,
'constraints' => [
new Image([
'maxSize' => '5000k'
])
]
]);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть код который работает на других сайтах, а на этом работать не хочет
Есть текст (2ab(2ba)a), как получить 2ab и 2ba, если там могут быть другие числа и буквы?
Есть HTML-форма, которая отвечает за выбор валюты (для отображения цен в таблице)C формой работает скрипт PHP, который бы позволил сохранить последнюю...
Пишу парсер для одного сайтаНа сайте есть авторизация, это сильно усложняет, т