sonata: работа с sonata_type_model (один ко многим)

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

Теперь в

СотрудникМедицинскаяСервисАдминистратор

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.


Это

LookupAdmin

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

person K-Alex    schedule 21.06.2015    source источник


Ответы (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;
}
person Vadim Ashikhman    schedule 22.06.2015
comment
Мне удалось найти параметр pcode, и я попробовал это: if (isset($_GET['pcode']) && $_GET['pcode'] == 'sonata.admin.employee_medical_service') { //Что мне здесь делать ?? } И где мне реализовать эту логику?? СПАСИБО большое за ответ - person K-Alex; 22.06.2015
comment
Есть проблема: Lookup имеет конструктор public function __construct($type) { $this-›type = $type; } Который требует, чтобы тип был установлен для загрузки всплывающей формы.. - person K-Alex; 22.06.2015
comment
хорошо, не используйте parent::getNewInstance(), просто создайте его сами. - person Vadim Ashikhman; 22.06.2015
comment
Я изменил его на общедоступную функцию getNewInstance() { $instance = new \PersonnelBundle\Entity\Employee\EmployeeMedicalService(); ......... } но не повезло .. Я не понимаю, почему это имеет значение - person K-Alex; 22.06.2015
comment
Вы создаете эту сущность на основе pcode условия. Если условие выполнено, просто передайте конструктору «medical_service», в противном случае передайте null. и не забудьте вернуть этот вновь созданный экземпляр. - person Vadim Ashikhman; 22.06.2015
comment
Я знаю, что беспокоил вас, но это не работает .. плюс isset($_GET['pcode']) всегда возвращает false при сбросе - person K-Alex; 22.06.2015
comment
Ну, я только что проверил его на своей локальной машине, и он работает как шарм. Метод getNewInstance() вызывается всякий раз, когда отображается форма добавления. Основная идея состоит в том, чтобы установить значение по умолчанию для поля type сущности lookup на medical_service, если $_GET['pcode'] существует. - person Vadim Ashikhman; 22.06.2015
comment
Я понимаю логику, но упомянутая проблема заключается в том, что форма добавления не открывает консольные показы (внутренняя ошибка сервера 500) ,,, если я не удалю __constructor из моего объекта Lookup (медицинская служба) .. [Что не является решением, поскольку Мне нужен конструктор] - person K-Alex; 22.06.2015
comment
Я обновил метод getNewInstance() в ответе - person Vadim Ashikhman; 22.06.2015
comment
публичная функция getNewInstance() { $instance = parent::getNewInstance(); if (isset($_GET['pcode']) && $_GET['pcode'] == 'sonata.admin.employee_medical_service') { //Что мне здесь делать?? $instance = новый \PersonnelBundle\Entity\Employee\EmployeeMedicalService(); $instance-›setMedicalService(new \PersonnelBundle\Entity\Lookup\Lookup('medical_service')); } else { $instance = новый \PersonnelBundle\Entity\Employee\EmployeeMedicalService(); $instance-›setMedicalService(NULL); } вернуть $экземпляр; } - person K-Alex; 23.06.2015
comment
Так было раньше, я попробовал ваш метод, но ничего не работает, если я не удалю __constructor из моего объекта Lookup.. и даже тогда для типа всегда устанавливается значение null, независимо от того, что я делаю. Мне жаль, что так долго - person K-Alex; 23.06.2015