web-dev-qa-db-ja.com

DetailViewウィジェットの属性の値を変更する

Playという名前のテーブルがあり、Yii2詳細ビューウィジェットに各レコードの詳細を表示しています。そのテーブルにtinyint型の属性recurringがあり、0または1にすることができます。しかし、それを数値として表示したくないので、代わりにyesを表示したいと思います。または、値(0または1)に基づくno

詳細ビューウィジェットの関数でこれを変更しようとしていますが、エラーが発生します:Object of class Closure could not be converted to string

私の詳細ビューコード:

 <?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'name',
        'max_people_count',
        'type',
        [
             'attribute' => 'recurring',
             'format'=>'raw',
             'value'=> function ($model) {
                        if($model->recurring == 1)
                        {

                            return 'yes';

                        } 
                        else {
                        return 'no';
                        }
                      },
        ],
        'day',
        'time',
        ...

どんな助けでもいただければ幸いです!

8
vrt1515

試してみてください

'value' => $model->recurring == 1 ? 'yes' : 'no'
13
rkm

モデルのセットを処理するGridViewとは異なり、DetailViewは1つだけを処理します。したがって、$modelは表示用の唯一のモデルであり、変数として表示できるため、クロージャを使用する必要はありません。

rkmによって提案された solution を確実に使用できますが、もっと簡単なオプションがあります。

ちなみに、許可される値は01のみなので、条件を少し単純化できます。

'value' => $model->recurring ? 'yes' : 'no'

値をブール値としてのみ表示する場合は、コロンを使用してフォーマッターサフィックスを追加できます。

'recurring:boolean',

'format' => 'raw'は、htmlのない単なるテキストであるため、ここでは冗長です。

さらにオプションを追加する場合は、次を使用できます。

[
    'attribute' => 'recurring',
    'format' => 'boolean',    
    // Other options
],

これらのラベルはconfigで設定されたアプリケーション言語に応じて生成されるため、フォーマッターの使用はより柔軟なアプローチです。

公式ドキュメント:

この質問 も参照してください。これはあなたの質問と非常によく似ています。

15
arogachev