Yii2 GridView - 基于其他属性值的属性格式

时间:2016-12-18 05:52:25

标签: php gridview yii2 formatter detailview

我根据数据库中的值制作了自定义货币格式化程序+转换器。 这是我在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(即关系数据)传递给该格式化程序。

有什么想法吗?感谢。

1 个答案:

答案 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;
}