Symfony CollectionType и наследование классовPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Symfony CollectionType и наследование классов

Сообщение Anonymous »

Я борюсь с проектом Symfony, и, поскольку у меня не так много опыта работы с фреймворком, я не могу понять, есть ли у меня ошибка в дизайне, не может ли Symfony справиться с моим вариантом использования или я просто нужно найти правильный метод.
Вот он:
У меня есть строка сущности, которая должна содержать от 1 до n элементов с разным содержимым. например «заголовок», «текст», «изображение» и т. д.
Поскольку каждый контент имеет разные характеристики, я расширил каждый тип контента из абстрактного класса RowContent посредством наследования одной таблицы.
Вот отредактированная версия сущностей:
Строка класса

Код: Выделить всё

class Row
{
//.....

/**
* @var ArrayCollection $rowContents
*
* @ORM\OneToMany(targetEntity="RowContent", mappedBy="row", cascade={"persist", "remove", "merge"})
*/
private $rowContents;

//...
}
Класс RowContent:

Код: Выделить всё

/**
* RowContent
*
* @ORM\Table(name="row_content")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({
*     "title" = "Kinkinweb\BaseBundle\Entity\Content\Title",
*     "text" = "Kinkinweb\BaseBundle\Entity\Content\Text",
*     "image" = "Kinkinweb\BaseBundle\Entity\Content\Image",
* })
* @ORM\Entity(repositoryClass="Kinkinweb\BaseBundle\Repository\RowContentRepository")
*/

abstract class RowContent
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

//...
}
и, например, класс Text:

Код: Выделить всё

/**
* Text
*
* @ORM\Table(name="content_text")
* @ORM\Entity(repositoryClass="Kinkinweb\BaseBundle\Repository\Content\TextRepository")
*/
class Text extends RowContent
{
/**
* @var string
*
* @ORM\Column(name="text", type="string", length=255)
*/
private $text;

//...
}
Пока все хорошо, но я не могу справиться со всем этим...
Чтобы обрабатывать формы с этими сущностями, у меня есть следующий FormType:< /p>

Код: Выделить всё

class RowType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
//...
->add('rowContents', CollectionType::class, array(
'entry_type'   => RowContentType::class,
'allow_add'    => true,
'allow_delete' => true,
'label' => 'Contenu Flexible',
'by_reference' => false,
'block_name' => 'rows',
))
;
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Kinkinweb\BaseBundle\Entity\Row',
));
}
}
Я имел дело с частью buildForm следующим образом:

Код: Выделить всё

    public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function($e) {
if (null === $e->getData()) { return; }
$form = $e->getForm();
if ($e->getData() instanceof Text){
$form->add('text',TextType::class);
}
});
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Kinkinweb\BaseBundle\Entity\RowContent';
));
}
Но когда я добавляю контент в форму с помощью jQuery и отправляю форму, платформа не может обработать отправленный объект RowContent (мне это кажется логичным, поскольку RowContent является абстрактным).
Поэтому, прежде чем я начну рвать на себе волосы один за другим, мне интересно, сталкивался ли кто-нибудь уже с такой ситуацией или имеет ли какое-либо представление о том, как отправить мою форму.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/432 ... nheritance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»