【问题标题】:sonata: Dealing with sonata_type_model (one-to-many)奏鸣曲:处理sonata_type_model(一对多)
【发布时间】:2015-09-06 23:50:39
【问题描述】:

1- 我有一个实体:

员工医疗服务

/**
 * @ORM\Entity
 * @ORM\Table(name="employee_medical_file")
 */
class EmployeeMedicalService extends BaseEntity
{

   //
   // Some
   // Fields
   //


    /**
     * @Assert\NotBlank
     * @ORM\ManyToOne(targetEntity="PersonnelBundle\Entity\Lookup\Lookup")
     * @ORM\JoinColumn(name="medical_service_id", referencedColumnName="id")
     */
    private $medicalService;

   //
   // getters
   // & setters
   //

2- 另一个实体:

查找

/**
 * @ORM\Entity
 * @ORM\Table(name="lookup")
 * @UniqueEntity(fields="name")
 */
class Lookup extends BaseEntity
{
    // const ...
    const TYPE_MEDICAL_SERVICE = 'medical_service';
    // more constants ...

    public function __construct($type)
    {
        $this->type = $type;
    }

     //
     // Some Fields
     //

    /**
     * @var string
     * --stuff--
     */
    private $name;

    /**
     * @var string
     * 
     * @ORM\Column(name="type", type="string", length=50)
     * @Assert\NotBlank
     */
    private $type;

    //getters
    // &setters

现在在

EmployeeMedicalServiceAdmin

protected function configureFormFields(\Sonata\AdminBundle\Form\FormMapper $formMapper)
    {

        $msquery = $this->getModelManager()
                ->getEntityManager('PersonnelBundle:Lookup\Lookup')
                ->createQueryBuilder();

        $msquery->select('l')->from('PersonnelBundle:Lookup\Lookup', 'l')->where('l.type = :type')
                ->orderBy('l.name', 'ASC')
                ->setParameter('type', 'medical_service');

        $formMapper
                ->add(..)

                ->add('medicalService', 'sonata_type_model', array(
                    'label' => 'personnel.employee.medical_service.form.medical_service',
                    'property' => 'name',
                    'placeholder' => '',
                    'required' => false,
                    'query' => $msquery,
                ))

                ->add(..)
        ;
    }

** 我的问题:**

我需要从 EmployeeMedicalService 管理表单中添加新查找(医疗服务)的表单预加载字段 Type 值设置为 'medical_service' 当我尝试从 EmployeeMedicalService 管理表单中添加新的医疗服务,否则如果 Type 设置为 NULL

,则会添加新的查找而没有值

这是

查找管理员

protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
                ->add('name', 'text', array(
                    'label' => 'personnel.lookup.form.name'
                ))
                ->add('type', 'hidden', array(
                    'label' => 'personnel.lookup.form.type',
                ))
        ;
    }

【问题讨论】:

    标签: symfony doctrine sonata-admin symfony-sonata sonata


    【解决方案1】:

    如果您检查弹出表单的 ajax 请求,您会注意到额外的查询参数,例如 pcode。您可以检查此参数是否存在并且等于EmployeeMedicalServiceAdmin 管理类代码,然后将lookup 类型设置为medical_service

    更新

    getNewInstance() 方法中添加这个逻辑之王:

    public function getNewInstance()
    {
        $type = isset($_GET['pcode']) ? 'medical_service' : '';
        $instance = new \PersonnelBundle\Entity\Employee\EmployeeMedicalService($type);
    
        return $object;
    }
    

    【讨论】:

    • 我设法找到了“pcode”参数并尝试了这个: if (isset($_GET['pcode']) && $_GET['pcode'] == 'sonata.admin.employee_medical_service ') { //我在这里做什么??我在哪里实现这个逻辑?非常感谢您的回复
    • 有一个问题:Lookup有构造函数 public function __construct($type) { $this->type = $type;这需要设置类型才能加载弹出表单..
    • 好吧,不要使用parent::getNewInstance(),自己创建吧。
    • 我把它改成了 public function getNewInstance() { $instance = new \PersonnelBundle\Entity\Employee\EmployeeMedicalService(); ......... } 但没有运气.. 我不明白为什么这会有所作为
    • 您根据pcode 条件创建此实体。如果满足条件,只需将“medical_service”传递给构造函数,否则传递 null。并且不要忘记返回这个新创建的实例。
    猜你喜欢
    • 2017-04-09
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2015-02-24
    • 2017-06-03
    • 1970-01-01
    • 2014-11-29
    相关资源
    最近更新 更多