Yii2和float字段,默认值为NULL

时间:2015-01-13 23:09:27

标签: php mysql yii2

official documentation示例“国家/地区”数据库中。我决定为国家添加新字段(Property),即area。我添加了一个名为country的MySQL数据库表,其名称为area,其结构如下:

`area` float DEFAULT NULL

数据库中的新字段值采用默认值0,在视图中显示为0.00,如下面的屏幕截图所示:

enter image description here

在更新表单中,我添加了area的输入字段,如下所示:

// In views/country/_form.php, I added the following line to the form:
<?= $form->field($model, 'area')->textInput() ?>



 //In models/Country.php, I did not set any validation rules for area field.
public function attributeLabels()
    {
        return [
            'code' => 'Code',
            'name' => 'Name',
            'population' => 'Population',
            'area' => 'Area in KM<sup>2</sup>'
        ];
    }

现在,更新视图中的所有字段都已成功更新,但新字段area除外。简单地说,它没有任何错误消息就不会更新。的为什么吗

此外,正如屏幕截图所示,在视图中area标签打印正确,但在更新视图中,它显示为HTML实体,即Area in KM<sup>2</sup>。的为什么吗

另一方面,我不喜欢将非定义区域国家/地区的区域显示为0.00,因此我决定将其设为N/A,因此我在models / Country.php中进行了以下回调方法:

public function afterFind()
    {
      if ($this->area == NULL){         
         $this->area = 'N/A';       
      }   
      return true;
    }

但是,上述解决方案在操作视图中生成错误:

  

'N / A'不是数值。

因此,我将N/A替换为NULL,并且视图操作正常,并在视图中为(not set)分配了未定义的区域国家/地区而不是0.00这里的最后一个问题有没有办法让非定义区域国家的视图打印输出N\A?操作视图使用DetailView::widget

2 个答案:

答案 0 :(得分:3)

  

现在更新视图中的所有字段都已成功更新,除了   新的领域。简单地说,它没有任何错误就更新了   消息。为什么呢?

因为它不是安全的属性。你说它没有出现在规则中。如果您不想验证它,但希望能够大量分配它,您应该在验证规则中明确指定它,如下所示:

['area', 'safe'],

在官方文档中阅读有关模型safe attributes的更多信息。

  

此外,如屏幕截图所示,在视图区域中打印出标签   但是,在更新视图中,它显示为HTML实体,即   KM <sup>2</sup>中的面积。为什么呢?

这就是属性标签在DetailView中呈现的方式:

https://github.com/yiisoft/yii2/blob/master/framework/widgets/DetailView.php#L206

Html::activeLabel() ActiveForm's使用的field()

https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseHtml.php#L1048

如果未明确指定并自动从attributeLabels()获取,则编码适用于无选项。

正如ActiveForm中的解决方法一样,我建议像这样传递它:

<?= $form->field($model, 'area')->label('Area in KM<sup>2</sup>') ?>

我认为复制这些内容并不是什么大问题,因为它不是代码逻辑,很少改变。即使它会改变,在编辑器中用全局搜索替换它也很容易。如果你高度反对,也许最好在你的模型中另外声明它。

如果您愿意,可以在Github上创建问题。也许我错过了一些东西,但我没有找到一种方法来禁用ActiveForm中的标签编码。

另一个解决方法是简单地用文本表示替换html,类似于square km.它有点长,但编码没有这个问题。

  

这里的最后一个问题是,有没有办法让视图打印输出N \ A.   对于非定义区域国家?

我认为您在afterFind()中所做的事情并不好,因为您将实际模型值替换为显示值。它可以在其他地方使用,例如在更新过程中,并导致一些错误。

您至少可以在视图中选择两个选项。

1)如果仅在area中显示空值,或者您想为其他属性N\A显示null,则可以简单地替换默认的null表示,如下所示:

use Yii;

...

Yii::$app->formatter->nullDisplay = 'N\A';

您应该在呈现DetailView之前放置此代码。请在official documentation中阅读更多内容。

2)否则只需在area DetailView部分扩展属性attributes的定义:

[
    'attribute' => 'area',
    'value' => $model->area === null ? 'N\A' : $model->area,
],

答案 1 :(得分:0)

您可以通过在模型Like ...

中定义规则来验证Float类型验证
 ....other rules....
 [['area'],'integer', 'integerOnly' => false,],
 ...other rule...