Cześć,
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);
}
public function preUpdate($object)
{
dump($object);
}
}
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