在official documentation示例“国家/地区”数据库中。我决定为国家添加新字段(Property),即area
。我添加了一个名为country
的MySQL数据库表,其名称为area
,其结构如下:
`area` float DEFAULT NULL
数据库中的新字段值采用默认值0
,在视图中显示为0.00
,如下面的屏幕截图所示:
在更新表单中,我添加了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
答案 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...