2016-10-05 7 views
0

私はいくつかのGridviewを持っています。これらのすべてには数を数えたり集計するためのアルゴリズムを含むいくつかの共通の列があります。これらの列を集中管理するために、私はインポートする外部クラスを作成しました。それはうまくいきます。ここで

は一例です: GridViewの:

 Column::percentPositive(), 
     Column::countMinusOne(), 
     Column::countZero(), 
     Column::countPlusOne(), 

列クラス:

public static function countMinusOne() 
{ 
    $x = [ 
     'attribute' => 'countMinusOne', 
     'label' => '-1 ', 
     'contentOptions' => ['class' => 'col-60 text-red'], 
     'headerOptions' => ['class' => 'text-center text-red'], 
    ]; 

    return $x; 
} 

私の問題: 各モデルは明らかに少し異なっており、いくつかの列のために私は、特定の$を渡す必要がありますモデルパラメータを静的関数に追加します。私はこれがうまくいくことを期待していた:私は、このように使用することができ

Column::CountMinusOne($model->invalidated), 

:しかし

public static function countMinusOne($invalidated) 
{ 
    $x = [ 
     'attribute' => 'countMinusOne', 
     'label' => function() use($invalidated){ 
      // do my stuff here 
     }, 
     'contentOptions' => ['class' => 'col-60 text-red'], 
     'headerOptions' => ['class' => 'text-center text-red'], 
    ]; 

    return $x; 
} 

が、私はGridViewコントロールにいるにもかかわらず、$モデルが認識されないと、私はエラーを取得します: "未定義変数:モデル"。 $ modelは従来のGridViewの列要素で利用できるが、静的関数に渡すことはできません。

私の関数に$ model-> invalidatedを渡すにはどうすればいいですか?

感謝

Bizley応答に基づいて更新:

クラス::

namespace app\models\columns;  
class Column extends \yii\grid\DataColumn 
    { 

     public $type; 
     public $name; 

     public function init() 
     { 
      parent::init(); 

      // here you can set all attributes based on 'type' 
      switch ($this->type) { 
       case 'test': 
        $this->value = function(){ return "hello ".$this->name;}; 
        break; 

は、GridViewコントロール:

[ 
     'class' => 'app\models\columns\Column', 
     'type' => 'test', 
     'name' => function($model){ return $model->name;} 
    ], 
私が得ることができるのはここ

があります

エラーが発生しました。Class of Classのオブジェクトを文字列に変換できませんでした。

私は奇妙なことに、GridViewでは$ model-> nameが "world"を返しますが、$ model-> nameをクラスに渡すと、クラスは膨大なオブジェクトであり、その名前にアクセスできません。私は "世界"が文字列としてクラスに渡されることを期待していましたが、代わりにオブジェクトがあります。

私がしたいのは、クラスに名前を渡すだけですが、できないようです。

私はクラスに存在するオブジェクトをダンプした場合、私は深いオブジェクト内の名前を見ることができます:

... 
    [1] => app\models\Sponsor Object 
    (
     ... 
    [_attributes:yii\db\BaseActiveRecord:private] => Array 
     (
      [id] => 120 
      [name] => World 

答えて

0

それを行うための最善の方法は、あなた自身でyii\grid\DataColumnクラスを拡張し、内部にそれを使用することですGridView。あなたはYourColumnのプロパティを設定し、そのメソッドをオーバーライド/追加することによって、データをあなたがやりたいことができますこれにより

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'columns' => [ 
     // ... 
     [ 
      'class' => \namespace\to\YourColumn::className(), 
      // configuration for YourColumn 
     ] 
    ], 
]) ?> 

今、あなたは次のようにこのウィジェットを設定することができます。

あなたが署名して閉鎖することができ valueプロパティを使用して動的な値については

function ($model, $key, $index, $column) 

ので、ここであなたの行方不明$modelがあります。

編集:(詳細)

例:

列クラス:今すぐ

namespace app\models\columns 

class Column extends \yii\grid\DataColumn 
{ 
    public $type; 

    public function init() 
    { 
     parent::init(); 

     // here you can set all attributes based on 'type' 
     switch ($this->type) { 
      case 'percentPositive': 
       // ... 
       break; 
      case 'countMinusOne': 
       // parameters taken from question 
       $this->attribute = 'countMinusOne'; 
       $this->label = '-1 '; 
       $this->contentOptions = ['class' => 'col-60 text-red']; 
       $this->headerOptions = ['class' => 'text-center text-red']; 
       break; 
      case 'countZero': 
       // ... 
       break; 
      case 'countPlusOne': 
       // ... 
       break; 
     } 
    } 
} 

のGridView:

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'columns' => [ 
     // ... 
     [ 
      'class' => 'app\models\columns\Column', 
      'type' => 'countMinusOne', 
      'value' => function ($model, $key, $index, $column) { 
       // use the proper attribute you need 
       // in Column class it's $this->value 
       return $model->name; 
      } 
     ] 
    ], 
]) ?> 
+0

感謝Bizley。私はあなたのソリューションを部分的に実装することができましたが、私はあなたのアドバイスを完全に理解していません。私は私の質問を修正し、あなたのガイダンスから実装することができたことに基づいてアップデートを加えました。お知らせ下さい。多くのありがとう – DrBorrow

+0

私は私の答えに単純化された例を加えました。 – Bizley

+0

ok ...私はいくつかの進歩を遂げていますが、まだ解決策を作成することはできません。 1つの最後の指針が最も高く評価されます。どうもありがとう。質問が更新されました。 – DrBorrow

関連する問題