@Leffken
Студент, как студент!

Как в detailview (yii2) сделаю функцию в значении?

Есть таблица отчетов и таблица информаций по каждому расходу отчета.
Нужно в view таблицы отчетов выбрать сумму определенного поля информаций.
В index.php делается так
<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
....
[
                'label' => 'Сумма',
                'value' => function ($model) {
                    $sum = 0;
                    foreach ($model->infocosttcs as $info) {
                        $sum += $info['Cash'];
                    }
                    return $sum;
                }
            ],
....

А в view.php Не получается
<?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            [
                'label' => 'Сумма',
                'value' => function ($model) {
                    $sum = 0;
                    foreach ($model->infocosttcs as $info) {
                        $sum += $info['Cash'];
                    }
                    return $sum;
                }
            ],
...

В DetailView ни как не запихнуть функцию в value ?
  • Вопрос задан
  • 5184 просмотра
Решения вопроса 1
mitaichik
@mitaichik
Нет, нельзя (и имхо - это упущение).

Можно вычислить значение заранее, и отдать его в value.

Но! В вашем коде идем микс логики представления и бизнес-логики. По хорошему лучше в модели сделать метод что то типа $model->getTotalSum() и в представлении сделать 'value' => $model->getTotalSum()
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
bitver
@bitver
<?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'id',
            'myOwnValue'
...
// В модели
public function getMyOwnValue() {
  //Я считаю что хочу
  return $counted;
}
Ответ написан
Комментировать
@zobnin
Создать новый класс и наследоваться от DetailView
<?namespace frontend\expanding;

class DetailViewext extends \yii\widgets\DetailView
{
public $param;
}

далее во вьюхе
$param - тут уже можешь хоть что вычислить заранее и передать

<?= DetailView::widget([
'model' => $model,
'param'=>$param,
'attributes' => [
[
'label' => 'параметр новый',
'value' =>$param,
'format'=>'raw',

],

...

?>
Ответ написан
Комментировать
Тоже столкнулся с этой проблемой. Сделал свой виджет немного подправив DetailView по аналогии с тем, как оно сделано в GridView.
Создаём свой класс app\components\widgets\DetailWidget и чуть-чуть меняем метод renderAttribute:
<?php
namespace app\components\widgets;

use Yii;
use yii\base\Arrayable;
use yii\base\InvalidConfigException;
use yii\base\Model;
use yii\base\Widget;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\Inflector;
use yii\i18n\Formatter;

class DetailView extends \yii\widgets\DetailView
{
    /**
     * @inheritdoc
     */
    protected function renderAttribute($attribute, $index)
    {
        if (is_string($this->template)) {
            $captionOptions = Html::renderTagAttributes(ArrayHelper::getValue($attribute, 'captionOptions', []));
            $contentOptions = Html::renderTagAttributes(ArrayHelper::getValue($attribute, 'contentOptions', []));
            if ($attribute['value'] instanceof Closure) {
                $value = call_user_func($attribute['value'], $model);
            } else {
                $value = $this->formatter->format($attribute['value'], $attribute['format']);
            }
            return strtr($this->template, [
                '{label}' => $attribute['label'],
                '{value}' => $value,
                '{captionOptions}' => $captionOptions,
                '{contentOptions}' => $contentOptions,
            ]);
        }
        return call_user_func($this->template, $attribute, $index, $this);
    }
}


Теперь, используя наш новый виджет app\components\widgets\DetailView вместо yii\widgets\DetailView, можно в качестве value ставить свою функцию, например у меня это выглядит так:
<?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'id',
            'title',
            'author',
            'year',
            'description',
            'format',
            [
                'attribute' => 'categories',
                'format' => 'html',
                'value' => function ($model) {
                    /** @var app\models\library\Book $model */
                    $items = $model->getCategories()->all();
                    $result = '';
                    foreach ($items as $item) {
                        $result .= "<p>$item->name</p>";
                    }
                    return $result;
                }
            ]
        ],
    ]) ?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы