В настоящее время я создаю интернет-магазин, и есть продукты, которые я хочу управлять в своей системе. Дело в том, что SonataAdmin не позволяет мне редактировать два сущности с отношением!
namespace Admin\IdManageBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* RFID
*
* @ORM\Table()
* @ORM\Entity
*/
class RFID
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="Barcode", type="string", length=255)
*/
private $barcode;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set barcode
*
* @param string $barcode
*
* @return RFID
*/
public function setBarcode($barcode)
{
$this->barcode = $barcode;
return $this;
}
/**
* Get barcode
*
* @return string
*/
public function getBarcode()
{
return $this->barcode;
}
}
namespace Admin\StorageBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Product
*
* @ORM\Table()
* @ORM\Entity
*/
class Product
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="Name", type="string", length=255)
*/
private $name;
/**
* @var float
*
* @ORM\Column(name="Price", type="float")
*/
private $price;
/**
* @ORM\OneToOne(targetEntity="Admin\IdManageBundle\Entity\RFID")
*/
private $rfid;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Product
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set price
*
* @param float $price
*
* @return Product
*/
public function setPrice($price)
{
$this->price = $price;
return $this;
}
/**
* Get price
*
* @return float
*/
public function getPrice()
{
return $this->price;
}
/**
* Set rfid
*
* @param \Admin\IdManageBundle\Entity\RFID $rfid
*
* @return Product
*/
public function setRfid(\Admin\IdManageBundle\Entity\RFID $rfid = null)
{
$this->rfid = $rfid;
return $this;
}
/**
* Get rfid
*
* @return \Admin\IdManageBundle\Entity\RFID
*/
public function getRfid()
{
return $this->rfid;
}
}
И объект CellPhoneGlass:
namespace Admin\StorageBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* CellPhoneGlass
*
* @ORM\Table()
* @ORM\Entity
*/
class CellPhoneGlass
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="Phone", type="string", length=255)
*/
private $phone;
/**
* @var string
*
* @ORM\Column(name="Model", type="string", length=255)
*/
private $model;
/**
* @ORM\ManyToOne(targetEntity="Admin\StorageBundle\Entity\Product")
*/
private $product;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set phone
*
* @param string $phone
*
* @return CellPhoneGlass
*/
public function setPhone($phone)
{
$this->phone = $phone;
return $this;
}
/**
* Get phone
*
* @return string
*/
public function getPhone()
{
return $this->phone;
}
/**
* Set model
*
* @param string $model
*
* @return CellPhoneGlass
*/
public function setModel($model)
{
$this->model = $model;
return $this;
}
/**
* Get model
*
* @return string
*/
public function getModel()
{
return $this->model;
}
/**
* Set product
*
* @param \Admin\StorageBundle\Entity\Product $product
*
* @return CellPhoneGlass
*/
public function setProduct(\Admin\StorageBundle\Entity\Product $product = null)
{
$this->product = $product;
return $this;
}
/**
* Get product
*
* @return \Admin\StorageBundle\Entity\Product
*/
public function getProduct()
{
return $this->product;
}
}
Соната не показывает объект продукта с "sonata_model_type". Здесь находится класс администратора:
namespace Admin\StorageBundle\Admin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
class CellPhoneGlassAdmin extends Admin
{
/**
* @param DatagridMapper $datagridMapper
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->tab("Product")
->with("")
->add('product', 'sonata_type_model', array(
'class' => 'Admin\StorageBundle\Entity\Product',
'property' => 'name',
'by_reference' => false,
))
->end()
->end()
->tab("Glass")
->with("")
->add('phone')
->add('model')
->end()
->end()
;
}
/**
* @param ListMapper $listMapper
*/
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->tab("Product")
->with("")
->add('product', 'sonata_type_model', array(
'class' => 'Admin\StorageBundle\Entity\Product',
'property' => 'name',
'by_reference' => false,
))
->end()
->end()
->tab("Glass")
->with("")
->add('phone')
->add('model')
->end()
->end()
;
}
/**
* @param FormMapper $formMapper
*/
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->tab("Product")
->with("")
->add('product', 'sonata_type_model', array(
'class' => 'Admin\StorageBundle\Entity\Product',
'property' => 'name',
'by_reference' => false,
))
->end()
->end()
->tab("Glass")
->with("")
->add('phone')
->add('model')
->end()
->end()
;
}
/**
* @param ShowMapper $showMapper
*/
protected function configureShowFields(ShowMapper $showMapper)
{
$showMapper
->tab("Product")
->with("Content")
->add('product', 'sonata_type_model', array(
'class' => 'Admin\StorageBundle\Entity\Product',
'property' => 'name',
'by_reference' => false,
))
->end()
->end()
->tab("Glass")
->with("Content")
->add('phone')
->add('model')
->end()
->end()
;
}
}
Не уверен, правильно ли я понял, что вы хотите, я предполагаю, что вы хотите добавить новый продукт из формы CellPhoneGlass.
Для этого вы должны использовать sonata_type_model_list, sonata_type_model позволяет просто выбирать существующие объекты:
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->tab("Product")
->with("")
->add('product', 'sonata_type_model_list')
->end()
->end()
->tab("Glass")
->with("")
->add('phone')
->add('model')
->end()
->end()
;
}
Официальная документация: https://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/form_field_definition.html#advanced-usage-many-to-one