#php #forms #image #symfony #file-upload
#php #формы #изображение #symfony #загрузка файла
Вопрос:
У меня проблема с моим editAction, когда я пытаюсь отредактировать некоторый proudct, который я получаю
Не удается прочитать индекс «marka» из объекта типа «ShoeShopBundle Entity Buty», потому что он не реализует ArrayAccess.
Ранее я получал
Ожидается, что данные представления формы будут экземпляром класса SymfonyComponent HttpFoundationFileFile, но это (n) строка. Вы можете избежать этой ошибки, установив для параметра «data_class» значение null или добавив преобразователь представления, который преобразует строку (n) в экземпляр SymfonyComponent HttpFoundationFileFile.
ошибка, поэтому я изменил data_class
в configureOptions значение null и добавил 'data_class' => 'path_to_entity'
в каждое поле. Это моя форма:
class ButyType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('marka', ChoiceType::class, array(
'data_class' => 'ShoeShopBundleEntityButy',
'choices' => ['Adidas', 'Asics', 'Nike', 'Puma'
]
))
->add('model', TextareaType::class, array(
'data_class' => 'ShoeShopBundleEntityButy',
))
->add('kolor', TextareaType::class, array(
'data_class' => 'ShoeShopBundleEntityButy',
))
->add('cena', TextareaType::class, array(
'data_class' => 'ShoeShopBundleEntityButy',
))
->add('rozmiar', EntityType::class, array(
'class' => 'ShoeShopBundle:Rozmiar',
'expanded' => true,
'multiple' => true,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->orderBy('r.rozmiar', 'ASC');
}, 'choice_label' => 'rozmiar',
)
)
->add('zdjecie', FileType::class, array(
'data_class' => 'SymfonyComponentFormExtensionCoreTypeFileType',
'property_path' => 'zdjecie',
'label' => 'Zdjecie (img file)'))
->add('zdjecieMIN', FileType::class, array(
'data_class'=> 'SymfonyComponentFormExtensionCoreTypeFileType',
'property_path' => 'zdjecieMIN',
'label' => 'Zdjecie miniatura (img file)'));
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => null
));
}
и это моя сущность
/**
* Buty
*
* @ORMTable(name="buty")
* @ORMEntity(repositoryClass="ShoeShopBundleRepositoryButyRepository")
*/
class Buty
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORMColumn(name="marka", type="string", length=255)
*/
private $marka;
/**
* @var string
*
* @ORMColumn(name="model", type="string", length=255)
*/
private $model;
/**
* @var string
*
* @ORMColumn(name="kolor", type="string", length=255)
*/
private $kolor;
/**
* @var int
*
* @ORMColumn(name="cena", type="float")
*/
private $cena;
/**
* @var ArrayCollection
* @ORMManyToMany(targetEntity="Rozmiar")
* @ORMJoinTable(
* name="buty__rozmiary",
* joinColumns={@ORMJoinColumn(name="buty_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="rozmiar_id", referencedColumnName="id")}
* )
*/
private $rozmiar;
/**
* @ORMColumn(type="string")
*
* @AssertNotBlank(message="Dodaj zdjecie miniaturke")
* @AssertFile(mimeTypes={"image/png", "image/jpeg", "image/jpg",})
*/
private $zdjecieMIN;
public function getZdjecieMIN()
{
return $this->zdjecieMIN;
}
public function setZdjecieMIN($zdjecieMIN)
{
$this->zdjecieMIN = $zdjecieMIN;
return $this;
}
/**
* @ORMColumn(type="string")
*
* @AssertNotBlank(message="Dodaj zdjecie")
* @AssertFile(mimeTypes={"image/png", "image/jpeg", "image/jpg",})
*/
private $zdjecie;
public function getZdjecie()
{
return $this->zdjecie;
}
public function setZdjecie($zdjecie)
{
$this->zdjecie = $zdjecie;
return $this;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set marka
*
* @param string $marka
* @return Buty
*/
public function setMarka($marka)
{
$this->marka = $marka;
}
/**
* Get marka
*
* @return string
*/
public function getMarka()
{
return $this->marka;
}
/**
* Set model
*
* @param string $model
* @return Buty
*/
public function setModel($model)
{
$this->model = $model;
}
/**
* Get model
*
* @return string
*/
public function getModel()
{
return $this->model;
}
/**
* Set kolor
*
* @param string $kolor
* @return Buty
*/
public function setKolor($kolor)
{
$this->kolor = $kolor;
}
/**
* Get kolor
*
* @return string
*/
public function getKolor()
{
return $this->kolor;
}
/**
* Set cena
*
* @param integer $cena
* @return Buty
*/
public function setCena($cena)
{
$this->cena = $cena;
}
/**
* Get cena
*
* @return integer
*/
public function getCena()
{
return $this->cena;
}
/**
* Set rozmiar
*
* @param ArrayCollection $rozmiar
* @return rozmiar
*/
public function setRozmiar($rozmiar)
{
$this->rozmiar = $rozmiar;
return $this;
}
/**
* @return ArrayCollection
*/
public function getRozmiar()
{
return $this->rozmiar;
}
public function __construct()
{
$this->rozmiar = new ArrayCollection();
}
}
Кто-нибудь, пожалуйста, может сказать мне, что не так? Заранее спасибо.
Ответ №1:
Вы должны установить 'data_class'
параметр вашей формы для соответствующего класса, в противном случае средство доступа к свойствам Symfony предполагает, что это массив.
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Buty::class
));
}