我根据数据库中的值制作了自定义货币格式化程序+转换器。
这是我在DetailView
use yii\helpers\Html;
use app\commands\AppHelper;
use yii\widgets\DetailView;
use app\models\Part;
<?= DetailView::widget([
'model' => $model,
'attributes' => [
// ...
[
'attribute' => 'price',
'label' => (new Part())->getAttributeLabel('price_user'),
'format' => [
'currency',
AppHelper::getUserCurrencyCode(),
[
'convert' => true,
'currencyFrom' => $model->currency->code,
'currencyTo' => AppHelper::getUserCurrencyCode(),
],
],
],
// ...
],
]) ?>
在这个小部件中,我可以完成这样的行为:当有数值时,它会被格式化,如果有NULL
值,则打印出常规(未设置)...
请注意$model->currency->code
来自关系的数据,DetailView
可以轻松访问,但我无法弄清楚如何将这些数据导入formatter
中的GridView
。
问题在于我想在GridView
中格式化数据。
我允许在我需要使用格式化程序的列上使用NULL
值,所以我已经放弃了使用
'value' => function ($data, $key, $index, $column) { return $data->value; }
因为当NULL
值存在时,yii会发送这样的数据
<span class="not-set">(not set)</span>
我想让它成为或设置我的自定义值(考虑具有NULL
值的其他列的不同值),我还想省去处理所有(not set)
值的麻烦。
另一个原因是,正如我注意到的那样,如果我在属性参数中使用'format' => ...
,则在设置(not set)
值之前会进行格式化。
所以我在考虑以某种方式将$model->currency->code
(即关系数据)传递给该格式化程序。
有什么想法吗?感谢。
答案 0 :(得分:1)
最糟糕的情况我会在包含'<span'
或NULL
这样的值转储值中使用格式化程序,但它很难看,我不喜欢它......
编辑:我添加了自定义静态方法来格式化未设置的数据。我仍然不喜欢它,但是嘿,它有效......:D
use yii\helpers\Html;
use app\commands\AppHelper;
use yii\grid\GridView;
use app\models\Part;
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
// ...
[
'attribute' => 'price',
'label' => (new Part())->getAttributeLabel('price_user'),
'value' => function ($data, $key, $index, $column) {
return Part::requestPrice(Yii::$app->formatter->asCurrency(
$data->price,
AppHelper::getUserCurrencyCode(),
[
'precision' => 2,
'convert' => true,
'currencyFrom' => $data->currencyCode,
'currencyTo' => AppHelper::getUserCurrencyCode(),
]));
},
'format' => 'raw',
],
// ...
],
]); ?>
并在Part.php(部分模型)中添加了方法
public static function requestPrice($price)
{
if (strpos($price, 'class') !== false || empty($price) || floatval($price) == 0)
return '<span class="not-set">' . Yii::t('app', 'na vyžiadanie') . '</span>';
else
return $price;
}