Qui è il mio tipo di modulo:Symfony2 campo di modulo non aggiornato quando si verifica un errore di convalida
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';
}
}
Ecco l'entità, parte importante è il metodo setThumbnailData ($ file), che memorizza il file delle miniature e imposta la miniatura percorso tramite il metodo setThumbnail (stringa).
<?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 '';
}
}
Ora il problema è, se il modulo si imbatte in un errore di convalida, le seguenti linee ramoscello produrre output diverso, il valore corretto in uscita dalla seconda linea, l'altro produce miniatura del tracciato originale. Quindi, se produco l'input della miniatura usando {{form_widget (form.thumbnail)}}, ottengo il percorso della miniatura originale, non quello che dovrebbe essere cambiato tramite il metodo setThumbnailData().
{{ dump(form.thumbnail.vars.data) }}
{{ dump(form.vars.data.thumbnail) }}
Il problema è causato dall'impostazione della miniatura utilizzando il metodo setThumbnailData()? Non sei sicuro di come risolvere questo problema diverso da quello duro codifica l'ingresso in ramoscello in questo modo:
<input type="hidden" name="test[thumbnail]" value="{{ form.vars.value.thumbnail }}"/>
Bene, voglio salvare il file sul disco anche se fallisce la convalida, quindi l'utente non deve ri-caricare l'immagine se dovesse verificarsi un errore di convalida. – Trololololol
Quindi creare un nuovo 'Type' e' Validator' renderlo perfettamente compatibile con il framework del modulo di symfony, magari con un campo 'file' e' hidden' come tipi figlio. Se si salva il file su disco, cosa succede se l'utente non inserisce mai dati validi? – Aitch