Вот мой тип формы:Symfony2 поле формы не обновляется, когда ошибка проверки происходит
class TestFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('thumbnail', 'hidden', array(
'label' => 'Thumbnail',
'label_attr' => array(
'class' => 'col-xs-2 control-label'
),
'required' => false,
'error_bubbling' => true,
'required' => false
));
$builder->add('thumbnail_data', 'file', array(
'error_bubbling' => true,
'required' => false
));
}
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'X\LibraryBundle\Entity\Test',
'cascade_validation' => true,
'error_bubbling' => true,
));
}
public function getName()
{
return 'test';
}
}
Вот сущность, важной частью является метод setThumbnailData ($ файл), в котором хранится файл эскиза и устанавливает миниатюру путь через метод setThumbnail (string).
<?php
namespace X\LibraryBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Test
*
* @ORM\Table(name="test")
* @ORM\Entity(repositoryClass="X\LibraryBundle\Repository\TestRepository")
*/
class Test
{
/**
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="text", nullable=true)
*/
protected $thumbnail;
/**
* Set thumbnail
*
* @param string $thumbnail
* @return Test
*/
public function setThumbnail($thumbnail)
{
$this->thumbnail = $thumbnail;
return $this;
}
/**
* Get thumbnail
*
* @return string
*/
public function getThumbnail()
{
return $this->thumbnail;
}
/**
* This will save file to disk
* @param $file
*/
public function setThumbnailData($file) {
if($file !== null && $file !== false)
{
$fileName = $file->getClientOriginalName();
$baseDir = __DIR__ . '/../../../../../../../web/uploads/promotional_material/';
$dir = sha1(microtime());
while (is_dir($baseDir . $dir)) {
$dir = sha1(microtime());
}
mkdir($baseDir . $dir);
$this->setThumbnail('/uploads/promotional_material/' . $dir . '/' . $fileName);
$file->move($baseDir . $dir, $fileName);
}
}
public function getThumbnailData() {
return '';
}
}
Теперь проблема, если форма работает в ошибки проверки, следующие строки прута производят различную продукцию, правильное значение, выводимое из второй линии, а другой производит исходный путь эскиза. Поэтому, если я вывожу эскиз с помощью {{form_widget (form.thumbnail)}}, я получаю исходный путь эскизов, а не тот, который должен был быть изменен с помощью метода setThumbnailData().
{{ dump(form.thumbnail.vars.data) }}
{{ dump(form.vars.data.thumbnail) }}
Проблема связана с настройкой миниатюры с помощью метода setThumbnailData()? Не знаю, как это исправить, кроме жесткого кодирования входа в веточке так:
<input type="hidden" name="test[thumbnail]" value="{{ form.vars.value.thumbnail }}"/>
Ну, я хочу сохранить файл на диск, даже если он не прошел проверку, поэтому пользователю не нужно повторно загружать изображение, если возникла ошибка проверки. – Trololololol
Затем создайте новый 'Type' и' Validator', чтобы он был бесшовным для рамки формы symfony, возможно, с полем 'file' и' hidden' в качестве дочерних типов. Если вы просто сохраните файл на диск, что делать, если пользователь никогда не вводит правильные данные? – Aitch