2016-09-01 7 views
1

DetailViewの 'value'に関数の値を代入しようとしています。しかし、私がしようとすると、エラー "クラスのオブジェクトは、文字列に変換することができませんでした"詳細ビューのvalue属性に関数を割り当てるyii2

私は関数の値を別の変数に割り当てても、同じエラーを返すことを試みました。

誰かが私を助けてくれますか?

<?= DetailView::widget([ 
    'model' => $model, 
    'attributes' => [ 
     'Task_ID', 
     'Task_Title', 
     'Description', 
     'projects.project_name', //display project name instead of project id 
     // 'Assign_task_to', 
     //'tasksemp.Employee_ID', 
     [ 
      'attribute' => 'Assign_task_to', 
      'format' => 'raw', 

      $data = function ($model) { 
       $assignEmpModel = Tasksemp::find()->where(['Task_ID' => $model->Task_ID])->all(); //get all the rows with teh same task_id 
       $employes = ''; //empty string 
       foreach ($assignEmpModel as $employee) { 
        $emp = Employee::find()->where(['Employee_ID'=>$employee->Employee_ID])->one(); //get all the employee_id 
        $name = $emp['employee_name']; //get the employee_name from the employees table 
        $employes .= ' '.$name.', '; //concatenate the names. 
       } 
      // return implode(', ',$employes); 
      //return $employes; 
      }, 
      'value' => $data, 
     ], 
     'start_date', 
     'due_date', 
     'priotiy_level', 
     'upload_documents', 
    ], 
]) ?> 

変数$ dataに関数を割り当てようとしましたが機能しません。

私はこの値に直接関数を代入しようとしましたが、同じエラーです。

[ 
      'attribute' => 'Assign_task_to', 
      'format' => 'raw', 
      'value' => function ($model) { //<----- ERROR HERE! 
       $assignEmpModel = Tasksemp::find()->where(['Task_ID' => $model->Task_ID])->all(); //get all the rows with teh same task_id 
       $employes = ''; //empty string 
       foreach ($assignEmpModel as $employee) { 
        $emp = Employee::find()->where(['Employee_ID'=>$employee->Employee_ID])->one(); //get all the employee_id 
        $name = $emp['employee_name']; //get the employee_name from the employees table 
        $employes .= ' '.$name.', '; //concatenate the names. 

       } 
       return $employes; 
      }, 
     ], 

は、このようなBizleyの解決しようとしました:

<?php $assignEmpModel = Tasksemp::find()->where(['Task_ID' => $model->Task_ID])->all(); //get all the rows with teh same task_id 
       $employes = ''; //empty string 
       foreach ($assignEmpModel as $employee) { 
        $emp = Employee::find()->where(['Employee_ID'=>$employee->Employee_ID])->one(); //get all the employee_id 
        $name = $emp['employee_name']; //get the employee_name from the employees table 
        $employes .= ' '.$name.', '; //concatenate the names. 
?> 

<?= DetailView::widget([ 
    'model' => $model, 
    'attributes' => [ 
     'Task_ID', 
     'Task_Title', 
     'Description', 
     'projects.project_name', //display project name instead of project id 
     // 'Assign_task_to', 
     //'tasksemp.Employee_ID', 
     [ 
      'attribute' => 'Assign_task_to', 
      'format' => 'raw', 
      'value' => $employes, 
     ], 
     'start_date', 
     'due_date', 
     'priotiy_level', 
     'upload_documents', 
    ], 
]) ?> 

をしかし、今エラーが予期しないファイルの終わりを言います。

+0

あなたは、このようなロジックビューに( '$のemployees'変数を埋めるためにSQLクエリを作成する)を置くべきではありません、それがモデルまたは別のコンポーネントのための仕事です。表示は、表示と書式設定のみに責任があります。これはMVCの原則に違反します。 – arogachev

答えて

2

DetailViewは、DetailViewが単一のモデルで動作するため(GridViewのような多くのモデルでは反復処理をしないため)、その必要がないため、値のクロージャを許可しません。

最初の方法は、配列要素間でコードをプッシュしようとするため、全く悪いことです。 2番目のアプローチはOKですが、ここではクロージャは許可されていません。

は、単純に(return一部せずに、もちろん)あなたfunction ($model)の体であるコードを取ると、<?= DetailView::widget(...の上にそれを置くと、その後の内部値を$employes変数を使用します。

[ 
    'attribute' => 'Assign_task_to', 
    'format' => 'raw', 
    'value' => $employes, 
], 
+0

私はそれを試みたが、別のエラーが来る。予期しないファイルの終わり。 – user2211486

+0

私は、関数全体ではなく、関数本体を使うように言った。 – Bizley

+0

私もそれを試しました。しかし、予期しないファイルの終わり。 – user2211486

0

カスタム関数を使用すると、DetailViewで値を取得できます。

使用call_user_func()がこれを達成するために:

<?= \yii\widgets\DetailView::widget([ 
    'model' => $yourModel, 
    'attributes' => [ 
     [ 
      'label' => 'Your label', 
      'value' => call_user_func(function ($model) { 
       // do what you like 
       // return your value; 
      }, $yourModel), 
     ], 
     // more attributes 
    ] 
]); ?> 
関連する問題