【问题标题】:Birth date dropdown (Yii)出生日期下拉菜单 (Yii)
【发布时间】:2012-07-21 07:26:00
【问题描述】:

我有一个页面,用户可以在其中编辑自己的信息。在此页面上,还有 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>

【问题讨论】:

  • 为什么不尝试单个字段和CJuiDatePicker (yiiframework.com/doc/api/1.1/CJuiDatePicker)
  • 不适合我的情况:)
  • 就像用户:我讨厌下拉显示日期,只允许我以任何格式将日期打印到一个字段

标签: php yii


【解决方案1】:

在您的模型类中手动创建这 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 函数。

【讨论】:

  • 谢谢,我已经创建了 3 个属性,但是对于 afterFind()beforeValidation(),我没有按照您的指示进行操作。正如 Md. Mahabubur Ra​​hman 建议的那样,我在控制器中创建了 3 个变量,这些变量从 $_POST 获取值。一切都很完美,但我如何向用户显示他选择的日期?
  • 您使用的是模型对吗?这些事件在模型中定义,您可以实现代码来使用这些事件。如果您在控制器中创建属性并使用单独的 $_POST ,那么您将失去验证。您需要向我们展示模型/控制器/操作/视图/表单的全部代码
  • 非常感谢。我已经理解了一切,除了“按照指示向 afterFind() 添加与 beforeValidate() 相反的代码”。你能解释一下吗?
  • 谢谢,我还有一个问题。如果我使用range(),如何指定值必须以零开头(例如 01,02)?
  • 之后需要使用str_pad来调整数值。
【解决方案2】:

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

你必须声明三个变量。

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

你还有其他变量。

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

然后你会将这个$birth_date变量数据发送到你的数据库表字段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多