Lithium: как отобразить связанные данные в формах, а затем сохранить их? - PullRequest
1 голос
/ 15 февраля 2012

Я использую Lithium с MySQL.У меня есть модель Users, которая hasOne Contacts.Модель "Контакты" belongsTo Пользователи.

Ниже приведена очень простая версия моего кода.

Мои вопросы:

  1. Когда я редактирую пользователя и отправляю форму, как заставить пользователей :: редактировать также сохранять контактные данные?
  2. Кроме того, как я могу отобразить contacts.email в представлении редактирования пользователей?

models / Users.php

<?php
namespace app\models;

class Users extends \lithium\data\Model {

    public $hasOne = array('Contacts');

    protected $_schema = array(
        'id'   => array('type' => 'integer',
                        'key'  => 'primary'),
        'name' => array('type' => 'varchar')
    );
}
?>

models / Contacts.php

<?php
namespace app\models;

class Contacts extends \lithium\data\Model {

    public $belongsTo = array('Users');

    protected $_meta = array(
        'key'   => 'user_id',
    );

    protected $_schema = array(
        'user_id' => array('type' => 'integer',
                           'key'  => 'primary'),
        'email'   => array('type' => 'string')
    );
}
?>

controllers / UsersController.php

<?php
namespace app\controllers;

use app\models\Users;

class UsersController extends \lithium\action\Controller {
    public function edit() {
        $user = Users::find('first', array(
                'conditions' => array('id' => $this->request->id),
                'with'       => array('Contacts')
            )
        );

        if (!empty($this->request->data)) {
            if ($user->save($this->request->data)) {
                //flash success message goes here
                return $this->redirect(array('Users::view', 'args' => array($user->id)));
            } else {
                //flash failure message goes here
            }
        }
        return compact('user');
    }
}
?>

views / users / edit.html.php

<?php $this->title('Editing User'); ?>
<h2>Editing User</h2>
<?= $this->form->create($user); ?>
    <?= $this->form->field('name'); ?>
    <?= $this->form->field('email', array('type' => 'email')); ?>
<?= $this->form->end(); ?>

1 Ответ

5 голосов
/ 19 мая 2013

Мало кто знает это, но с помощью лития вы можете привязать форму к нескольким объектам.

В вашем контроллере вернуть как пользователя, так и контактный объект.Затем в вашей форме:

<?= $this->form->create(compact('user', 'contact')); ?>

Затем вы визуализируете поле формы определенного объекта, например:

<?= $this->form->field('user.name'); ?>
<?= $this->form->field('contact.email'); ?>

Когда пользователь отправляет форму, данные для обоих объектов будут сохраненыas:

$this->request->data['user'];
$this->request->data['contact'];

Вы можете использовать эту информацию для обновления базы данных, как обычно.Если вы хотите сохранить информацию только в том случае, если данные из обоих объектов действительны, вы можете вызвать validate следующим образом:

$user = Users::create($this->request->data['user']);
if($user->validates()) {
    $userValid = true;
}

$contact = Contacts::create($this->request->data['contact']);
if($contact->validates()) {
    $contactValid = true;
}

if($userValid && $userValid){
    // save both objects
}

Надеюсь, что это поможет:)

...