2016-12-18 1 views
0

J'ai fait un convertisseur de format de devise personnalisé + basé sur les valeurs de la base de données. Voilà comment je l'utilise dans DetailViewYii2 GridView - format d'attribut basé sur la valeur de l'autre attribut

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(), 
       ], 
      ], 
     ], 
     // ... 
    ], 
]) ?> 

Dans ce widget, je peux accomplir un tel comportement: quand il y a une valeur numérique, il sera formaté, s'il y a une valeur NULL, d'habitude (non défini) est imprimé out ... Notez $model->currency->code qui est des données de la relation, en DetailView facilement accessible, mais je ne peux pas comprendre comment obtenir ces données en formatter en GridView.

Problème lorsque je veux formater des données dans GridView.

I permettent NULL des valeurs sur la colonne que je dois utiliser formatter, donc je l'ai déjà jeté loin idée d'utiliser

'value' => function ($data, $key, $index, $column) { return $data->value; } 

parce que quand NULL valeur est présente, yu envoie des données comme celui-ci

<span class="not-set">(not set)</span> 

et soit je veux le laisser être ou définir ma valeur personnalisée (en tenant compte de la valeur différente pour les autres colonnes avec la valeur NULL) et je veux également enregistrer les problèmes de gestion de toutes ces valeurs (not set).

Une autre raison est, comme je l'ai remarqué, que si j'utilise 'format' => ... dans les paramètres d'attribut, le formatage se produit avant de définir les valeurs (not set).

Donc je pensais à transmettre en quelque sorte ce $model->currency->code, qui est des données de relation, à ce formateur.

Des idées? Merci.

Répondre

0

Dans le pire des cas, je vais utiliser le dumping des valeurs formatter en valeur qui contient '<span' ou NULL comme celui-ci, mais il est laid et je ne l'aime pas ...

EDIT: J'ajouté méthode personnalisée statique pour formater les données unset . Je ne l'aime toujours, mais bon, il fonctionne ...: 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', 
     ], 
     // ... 
    ], 
]); ?> 

et Part.php (modèle partiel) J'ai ajouté la méthode

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