Potrzebuję na szybko postawić panel do zarządzania. Z racji, że znam SF2 postawiłem na Sonatę, jednakże mam problem ze stworzeniem jednego formularza.
Mamy 2 encje, Product i ProductPrice. Z tego co sprawdziłem, w ProductPriceAdmin w metodzie prePersist dostaję obiekt ProductPrice, a gdy spojrzymy sobie na parenta ($this->getParent()) dostajemy nulla.
Przy obecnym stanie kodu w momemncie zapisu dostaniemy: NotNullConstraintViolationException: An exception occurred while executing 'INSERT INTO product_price (price_netto, currency_id, distribution_channel_id, product_id) VALUES (?, ?, ?, ?)' with params [1323, 1, 1, null]:
Jak badam children w ProductAdmin to productPrice się tam znajduje.
ProductBundle\Entity\Product: type: entity table: product repositoryClass: ProductBundle\Repository\ProductRepository id: id: type: integer nullable: false options: unsigned: false id: true generator: strategy: IDENTITY fields: name: type: string nullable: false length: 255 options: fixed: false oneToMany: productPrices: targetEntity: ProductBundle\Entity\ProductPrice mappedBy: product orphanRemoval: true cascade: ["persist", "remove"] joinColumn: name: id referencedColumnName: product_id onDelete: CASCADE lifecycleCallbacks: { }
ProductBundle\Entity\ProductPrice: type: entity table: product_price id: id: type: integer nullable: false options: unsigned: false id: true generator: strategy: IDENTITY fields: priceNetto: type: integer nullable: false options: unsigned: false column: price_netto manyToOne: product: targetEntity: ProductBundle\Entity\Product cascade: { } fetch: LAZY mappedBy: null inversedBy: null joinColumns: product_id: referencedColumnName: id orphanRemoval: false lifecycleCallbacks: { }
<?php namespace Application\Sonata\AdminBundle\Admin; use CoreBundle\Money\Formatter\AmountFormatter; use Doctrine\ORM\Query\Expr\Join; use ProductBundle\Entity\ProductPrice; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Form\Type\AdminType; use Sonata\AdminBundle\Form\Type\Filter\ChoiceType; use Sonata\AdminBundle\Form\Type\Filter\NumberType; use Sonata\AdminBundle\Form\Type\ModelType; use Sonata\AdminBundle\Show\ShowMapper; use Sonata\CoreBundle\Form\Type\CollectionType; use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; use SupplierBundle\Enum\SupplierEnum; use Symfony\Component\Form\Extension\Core\Type\TextType; class ProductAdmin extends AbstractAdmin { public $supportsPreviewMode = true; protected $translationDomain = 'ProductBundle'; private $operatorChoices = [ 'choices' => [ NumberType::TYPE_EQUAL => '=', NumberType::TYPE_GREATER_EQUAL => '>=', NumberType::TYPE_GREATER_THAN => '>', NumberType::TYPE_LESS_EQUAL => '<=', NumberType::TYPE_LESS_THAN => '<', ], ]; protected function configureFormFields(FormMapper $formMapper): void { $formMapper ->tab($this->trans('tab.basic_information')) ->add('name', TextType::class)->end() ->end() ->tab($this->trans('tab.prices')) ->add('productPrices', CollectionType::class, [ 'required' => false, 'label' => 'abc', ] )->end() ->end(); } }
<?php namespace Application\Sonata\AdminBundle\Admin; use CoreBundle\Entity\Currency; use CoreBundle\Entity\DistributionChannel; use ProductBundle\Entity\Product; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Form\Type\ModelHiddenType; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\Extension\Core\Type\NumberType; class ProductPriceAdmin extends AbstractAdmin { protected $parentAssociationMapping = 'product'; protected function configureFormFields(FormMapper $formMapper) { $formMapper->add('product', ModelHiddenType::class); $formMapper ->add('priceNetto', NumberType::class, [ 'required' => true, ]) ->add('distributionChannel', EntityType::class, [ 'required' => true, 'class' => DistributionChannel::class, 'property' => 'name' ]) ->add('currency', EntityType::class, [ 'required' => true, 'class' => Currency::class, 'property' => 'name' ]) ; } public function prePersist($object) { dump($object); exit; } public function preUpdate($object) { dump($object); exit; } }
Application\Sonata\AdminBundle\Admin\ProductPriceAdmin: class: Application\Sonata\AdminBundle\Admin\ProductPriceAdmin arguments: [~, ProductBundle\Entity\ProductPrice, ~] tags: - { name: sonata.admin, manager_type: orm, label: Product } public: true Application\Sonata\AdminBundle\Admin\ProductAdmin: class: Application\Sonata\AdminBundle\Admin\ProductAdmin arguments: [~, ProductBundle\Entity\Product, ~] tags: - { name: sonata.admin, manager_type: orm, label: Product } calls: - method: addChild arguments: ['@Application\Sonata\AdminBundle\Admin\ProductPriceAdmin'] public: true
Czy ma ktoś jakiś pomysł jak to rozwiązać? Jak zrobić aby encja Product była dostępna w ProductPriceAdmin?
Z góry dzięki za pomoc