Я сделал пользовательский конвертер валют + конвертер на основе значений из базы данных.
Вот как я использую это в 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
, который является данными от отношения к этому форматеру.
Есть идеи? Благодарю.
В худшем случае я буду использовать форматтер в значениях дампа значений, которые содержат '<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;
}
Других решений пока нет …