出生日期下拉(Yii)

时间:2012-07-21 07:26:01

标签: php yii

我有一个页面,用户可以在其中编辑自己的信息。在此页面上还有3个出生日期下拉列表(日期,月份,年份)。但我的表格中只有一列出生日期,其格式为“ddmmyyyy” 如何在CActiveForm中渲染这3个字段,以便它们一起填充一个完整的值,如“ddmmyyyy”? 谢谢。 的更新
型号代码:

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>

2 个答案:

答案 0 :(得分: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函数。

答案 1 :(得分:2)

这意味着你得到三个变量值

你必须声明三个变量。

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

你还有其他变量。

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

然后您将此 $ birth_date 变量数据发送到您的数据库表fild