2012-07-21 60 views
1

我有一個頁面,用戶可以編輯自己的信息。在這個頁面上還有3個出生日期(日期,月份,年份)的下拉列表。但我有出生日期只有一個列在我的表,它接受值格式「DDMMYYYY」 我怎樣才能呈現CActiveForm這3場,所以他們一起填寫一個完整的價值,像「DDMMYYYY」? 謝謝。 更新:
型號代碼:出生日期下拉(Yii的)

public $day; 
public $month; 
public $year; 

public function getDates() 
{ 
    return array(
     20=>20, 
     21=>21, 
    ); 
} 
public function getMonth() 
{ 
    return array(
     01=>01, 
     02=>02, 
    ); 
} 
public function getYears() 
{ 
    return array(
     1990=>1990, 
     1991=>1991, 
    ); 
} 

控制器代碼:

if(isset($_POST['User'])) 
      { 
       $user->attributes=$_POST['User']; 
       $user->day = $_POST['User']['day']; 
       $user->month = $_POST['User']['month']; 
       $user->year = $_POST['User']['year']; 
       $date = $user->day . $user->month . $user->year; 
       $user->birthday = $date; 
       if($user->save()) 
        $this->redirect('/user/index'); 
      } 

查看代碼:

   <div class="day"> 
        <?php echo $form->dropDownList($user,'day', $user->getDates()); ?> 
       </div> 
       <div class="month"> 
        <?php echo $form->dropDownList($user,'month', $user->getMonth()); ?> 
       </div> 
       <div class="year"> 
        <?php echo $form->dropDownList($user,'year', $user->getYears()); ?> 
       </div> 
+1

你爲什麼不嘗試一個字段和'CJuiDatePicker'(http://www.yiiframework.com/doc /api/1.1/CJuiDatePicker) – dInGd0nG 2012-07-21 09:03:11

+0

這不適合我的情況:) – 2012-07-21 10:59:55

+0

就像用戶:我討厭使用下拉菜單來顯示日期,只允許我以任何格式打印日期到一個字段 – RiaD 2012-07-21 11:11:27

回答

4

在模型類手動創建這3個屬性。在你的表格中,你只會引用這三個屬性。您將利用事件將數據庫列值包裝到這三個字段中,如下所示:

afterFind()中,確保您的代碼將在所有這三者中拆分數據庫列屬性。

beforeValidate()請確保您有代碼,將採取這三個屬性,並在數據庫列屬性結合在一起。

添加必要的驗證到rules()和標籤attributes()

更新

首先一些變化

$user->attributes=$_POST['User']; 
$user->day = $_POST['User']['day']; 
$user->month = $_POST['User']['month']; 
$user->year = $_POST['User']['year']; 

如果添加了日,月,年的屬性添加到「安全」列表中,您並不需要所有的任務。閱讀更多在Understanding safe validation rules

移動這個代碼模型類:

protected function beforeValidate() 
{ 
    $this->birthday = $this->day . $this->month . $this->year; 
    return parent::beforeValidate(); 
} 

請務必與驗證,以驗證表單:

if($user->validate() && $user->save()) 
     $this->redirect('/user/index'); 

代碼添加到一個afterFind()是反向beforeValidate()作爲

protected function afterFind() 
{ 
    $this->day= ...get day part from $this->birthday... 
    $this->month= 
    $this->year= 
    return parent::afterFind(); 
} 

你不需要所有那些getMonth()函數。您可以使用PHP的rangearray_fill函數。

+0

謝謝,我創建了3個屬性,但我沒有像'afterFind()'和'beforeValidation()'那樣遵循你的指示。 我在一個控制器中創建了3個變量,這些變量正在從'$ _POST'中取值,如Md。Mahabubur Ra​​hman所建議的。 一切都很完美,但我怎麼才能向用戶展示他選擇的日期? – 2012-07-21 10:55:23

+0

你正在使用一個模型嗎?這些事件在模型中定義,您可以實現代碼以使用這些事件。如果您在控制器中創建屬性並使用單獨的$ _POST,那麼您將失去驗證。您需要向我們展示您的模型/控制器/操作/視圖/表單 – Pentium10 2012-07-21 11:00:17

+0

的完整代碼我編輯了我的問題。 – 2012-07-21 11:40:14

2

這意味着你得到三個變量值

你必須聲明三個變量。

$date=$_REQUEST['date']; 
$month=$_REQUEST['month']; 
$year=$_REQUEST['year']; 

並且您有其他變量。

$birth_date=$date."/".$month."/".$year; 

,然後你將這個$ birth_date可變數據發送到您的數據庫表FILD