литий заполнить несколько моделей из вида - PullRequest
0 голосов
/ 22 декабря 2011

Допустим, у меня есть Модель сущностей, которая является основой для Модели людей и организаций.

У меня три пустых коллекции, одна для сущностей, одна для людей, одна для организации.

Предположим, что для целей этого вопроса отношения между людьми и организацией будут игнорироваться.

Наконец, у меня есть представление с полями для всех трех моделей.

Мой вопрос: Создать ли класс модели как DTO (объект передачи данных) только для хранения данных всех трех моделей и сохранения их в соответствующих коллекциях в контроллере?

Иерархия DTO будет выглядеть следующим образом:

  • AddClientDTO
    • Сущность (с полями)
      • Организация (с полями)
      • человек (с полями)

Ответы [ 2 ]

3 голосов
/ 22 декабря 2011

Похоже, вы пытаетесь создать записи для 3 разных моделей, используя одну форму и действие контроллера. Вот простой способ сделать это, который должен, по крайней мере, начать вас.

Сначала создайте модели Entity, People и Organization в приложении / моделях.

Затем создайте контроллер сущностей, содержащий следующее действие:

public function add() {
   $entity = Entities::create(); 
   if($this->request->data && $entity->save($this->request->data)) {
      echo 'Success!';
      exit;
   }
   return compact('entity');
}

Далее создайте /app/views/entities/add.html.php:

<?=$this->form->create($entity); ?>
<?=$this->form->label('name', 'Entity Name');?>
<?=$this->form->text('name');?>
<?=$this->form->label('person_data[name]', 'Person Name');?>
<?=$this->form->text('person_data[name]');?>
<?=$this->form->label('organization_data[title]', 'Organization Title');?>
<?=$this->form->text('organization_data[title]');?>
<?=$this->form->submit('Save');?>
<?=$this->form->end(); ?>

Наконец, опишите ваши отношения и добавьте фильтр в app / models / Entities.php, чтобы сохранить человека и организацию при сохранении данных:

<?php

namespace app\models;
use \app\models\People;
use \app\models\Organizations;

class Entities extends \lithium\data\Model {

    public $belongsTo = array(
        'Organizations' => array(
            'class' => '\app\models\Organizations',
            'key' => 'organization_id',
        ),
        'People' => array(
            'class' => '\app\models\People',
            'key' => 'person_id',
        ),
    );

    public static function __init() {
        parent::__init();

        static::applyFilter('save', function($self, $params, $chain) {

            // If data is passed to the save function, set it in the record
            if ($params['data']) {
                $params['entity']->set($params['data']);
               $params['data'] = array();
            }

            $record = $params['entity'];

            if(isset($record->person_data)) {
                $person = People::create($record->person_data);
                if($person->save()) {
                    $record->person_id = $person->id;
                }
            }

            if(isset($record->organization_data)) {
                $org = Organizations::create($record->organization_data);
                if($org->save()) {
                    $record->organization_id = $org->id;
                }
            }

            $params['entity'] = $record;
            return $chain->next($self, $params, $chain);

        });
    }

}

?>

Если я сделал слишком много предположений о том, что вы пытаетесь сделать, оставьте комментарий, и я соответствующим образом исправлю код. Надеюсь, это поможет!

2 голосов
/ 27 декабря 2011

Я получил код для работы с несколькими правками. Я только для краткости показываю сущность Люди, но она относится и к блоку Организации. При редактировании фильтр сохраняет модель People в базе данных.

От:

        if(isset($record->person_data)) {
            $person = People::create($record->person_data);
            if($person->save()) {
                $record->person_id = $person->id;
            }
        }

Кому:

        if(isset($record->person_data)) {
            //added this to make an array out of the $record->person_data(mongo doc)
            //$person_data = array();
            //foreach($record->person_data as $key => $value) {
                //$person_data[$key] = $value;
            //}

           //replaced the mongo doc with the array
           //Edited: accessing the data() method on an object will return an array of the properties, doing exactly what I put up there initially.
           $person = People::create($record->person_data->data());
            if($person->save()) {
                //replaced the "id" with "_id"
                $record->person_id = $person->_id;
            }

            //removed the person_data embedded doc from the entity doc
            unset($record->person_data);
        }
...