Как добавить новые объекты с отношениями в SonataAdminBundle

1

В настоящее время я создаю интернет-магазин, и есть продукты, которые я хочу управлять в своей системе. Дело в том, что SonataAdmin не позволяет мне редактировать два сущности с отношением!

  1. Существует "RFID":

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;
    }
}
  1. "Продукт":

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()
        ;
    }
}
Теги:
doctrine
sonata-admin

1 ответ

0
Лучший ответ

Не уверен, правильно ли я понял, что вы хотите, я предполагаю, что вы хотите добавить новый продукт из формы 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню