2012-02-15 47 views
2

我使用的是MySQL和Lithium。 我有一個用戶模型hasOne聯繫人。 聯繫人模式belongsTo用戶。鋰:如何在表單中顯示相關數據然後保存?

我在下面列出了我的代碼的一個非常基本的版本。

我的問題:

  1. 當我編輯用戶並提交表單,我如何讓用戶::編輯保存聯繫人資料,以及?
  2. 另外,如何在用戶編輯視圖中顯示contacts.email?

模型/ 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') 
    ); 
} 
?> 

模型/ 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') 
    ); 
} 
?> 

控制器/ 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'); 
    } 
} 
?> 

視圖/用戶/ 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(); ?> 

回答

5

沒有多少人知道這一點,但用鋰可以將一個窗體綁定到多個對象。

在您的控制器中,返回用戶和聯繫人對象。然後在您的形式:

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

然後您呈現一個領域形成這樣的特定對象:

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

當用戶提交表單,兩個對象中的數據將被存儲爲:

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

您可以像正常情況一樣使用此信息來更新數據庫。如果你只是想保存的信息,如果從兩個對象數據是有效的,你可以調用驗證這樣的:

$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 
} 

希望幫助:)

+0

剛剛看到關於這個問題的日期......哦,有一天它可能會幫助某人! – 2013-05-19 16:50:49

+0

它只是! :) – Oerd 2013-05-23 20:56:15

+0

謝謝Max。非常善良的你回覆這麼好的細節:) – Housni 2013-06-02 19:01:38

相關問題