сохранение встроенной формы Propel Symfony для отношений один-к-одному - PullRequest
0 голосов
/ 20 января 2012

У меня есть пара таблиц, которые имеют отношение один к одному.

У меня есть форма жалобы, в которую необходимо вставить форму человека, соответствующая схема ниже:

  complaint:
    id:                            ~
    created_at:                    ~
    updated_at:                    ~
    complainant_id:                { type: integer, foreignTable: person_data, foreignReference: id, onDelete: setnull }
    status:                        { type: tinyint, default: 1 }
    complaint_title:               { type: varchar(64) } 
    complaint_number:              { type: varchar(16) } 
    recipient:                     { type: varchar(128) }

  person_data:
    id:                            ~
    created_at:                    ~
    updated_at:                    ~
    company_name:                  { type: varchar(64) }
    first_name:                    { type: varchar(64) }
    last_name:                     { type: varchar(64) }
    email:                         { type: varchar(128) }

Я могу успешно сохранить оба объекта в базе данных, но основной объект жалобы не обновляется с параметром complainant_id строки person_data.

Кто-нибудь знает, почему это не работает правильно и как заставить его корректно обновлять объект жалобы?

Я использую Symfony 1.4.13, Propel 1.6.3.

UPDATE:

Вот код для встроенной формы:

<?php
    public function configure()
    {
        $use_fields = array();

        // ...other fields added...


        $sub_form   = new PersonDataForm(array(), array());
        $this->embedForm('complainant', $sub_form);
        array_push($use_fields, 'complainant');

        $this->useFields($use_fields);
    }

1 Ответ

0 голосов
/ 21 января 2012

Я нашел решение этой проблемы.

Переопределите метод saveEmbeddedForms в классе формы.

Обновление основного объекта происходит после сохранения встроенных форм, поэтому идентификаторыдоступно для обновления основного объекта.

public function saveEmbeddedForms($con = null, $forms = null) 
{

    // save the embedded forms
    parent::saveEmbeddedForms($con, $forms);

    // loop through all embedded forms and update the main object with their ids
    foreach($this->getEmbeddedForms() as $name => $embedded_form)
    {
        switch($name)
        {
            case 'recipient':
                // criteria to determine if the sub-object should be saved or not
                if($embedded_form->getObject()->getFirstName() == '' && $embedded_form->getObject()->getLastName() == '')
                {
                    $embedded_form->getObject()->delete();
                    $this->getObject()->setRecipientId(null);
                    $this->getObject()->save();
                }
                else
                    $this->getObject()->setRecipientId($embedded_form->getObject()->getId());
                break;
            case 'complainant':
                if($embedded_form->getObject()->getFirstName() == '' && $embedded_form->getObject()->getLastName() == '')
                {
                    $embedded_form->getObject()->delete();
                    $this->getObject()->setComplainantId(null);
                    $this->getObject()->save();
                }
                else
                {
                    $this->getObject()->setComplainantId($embedded_form->getObject()->getId());
                }
                break;
            default:
                break;
        }
    }

    // save the main object with the new sub-object keys set
    $this->getObject()->save();         
}

К сожалению, я не могу найти в Интернете нигде такого объяснения.Так что вот для тех, кто придет за мной.

...