字段在输入上分割,而不是输出

时间:2016-02-11 10:37:03

标签: php yii

我目前正在使用此功能

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

protected function afterFind() {
    parent::afterFind();

    $dob = explode('/', $this->dob);
    $this->year = $dob[0];
    $this->month = $dob[1];
    $this->day = $dob[2];

    return $this;
}

protected function beforeSave() {
    $this->dob = $this->year .'/'. $this->month .'/'. $this->day;
}

<div class="col-md-2 dayForm noPadding"> 
<?php
echo $form->textFieldGroup(
    $user, 
    'day', 
    array(
        'widgetOptions' => array(
            'htmlOptions' => array(
                'placeholder' => 'DD'
            )
        )
    )
);
?> 
</div>

<div class="col-md-3 monthForm ">
<?php
echo $form->dropDownListGroup(
    $user,
    'month',
    array(
        'widgetOptions' => array(
            'data' => array('01' => 'January' , '02' => 'February' , '03' => 'March' , '04' => 'April' , '05' => 'May' , '06' => 'June' , '07' =>'July' , '08' =>'August' , '09' =>'September' , '10' =>'October' , '11' =>'November' , '12' =>'December'),
            // 'data' => 'Jan','Feb';
            'htmlOptions' => array(
                'class' => 'col-md-3 ',
                'prompt' => 'Choose month',
            ),
        )
    )
);
?>
</div>

<div class="col-md-2 yearForm noPadding"> 
<?php
echo $form->textFieldGroup(
    $user, 
    'year', 
    array(
        'widgetOptions' => array(
            'htmlOptions' => array(
                'placeholder' => 'YYYY',
                'class' => 'col-md-3',
            )
        )
    )
);
?> 
</div>

将出生日期分为3个单独的字段。简单地说,用户输入日期,月份和年份,并以正确的格式输入。我遇到的问题是,当用户去更新时,整个dob字段都显示在年份textfieldgroup中,不太好。

如何在出路时将其爆炸,以便所有相应的字段显示在textfieldgroups / dropdownlist组中?

1 个答案:

答案 0 :(得分:0)

我总是尽量避免使用afterFind,因为它往往会使事情复杂化,因此很难解决像你这样的问题。通常可以通过添加getter(和可选的setter)来实现类似的结果;

protected function getDobParts()
{
    return explode('/', $this->dob);
}
protected function changeDobPart($part, $newValue)
{
    $parts = $this->getDobParts();
    $parts[$part] = $newValue;
    $this->dob = implode('/', $parts);
}
public function getYear()
{
    return $this->getDobParts()[0];
}
public function setYear($value)
{
    $this->changeDobPart(0, $value);
}
public function getMonth()
{
    return $this->getDobParts()[1];
}
public function setMonth($value)
{
    $this->changeDobPart(1, $value);
}
public function getDay()
{
    return $this->getDobParts()[2];
}
public function setMonth($value)
{
    $this->changeDobPart(2, $value);
}

Yii将自动将这些getter / setter作为属性提供(例如$ class-&gt; year)。

您的观看代码应保持不变。

PS。通常最佳做法是在覆盖父方法时返回父方法的结果。例如,beforeSave()的最后一行通常应为return parent::beforeSave();。如果你没有这样做,你的班级甚至可能无法妥善保存。