@Monitorkin

Как вывести данные в GridView с динамическим набором колонок?

Пытаюсь вывести в
<?= GridView::widget([
		'dataProvider' => $dataProvider,
	  'columns' => $columns,
	]);
?>

данные из $dataProvider.
Используется ActiveDataProvider, запрос для него строится с помощью yii\db\Query().
Заранее не известен состав колонок, их название и тип данных в них (выбирается пользователем).
Колонки должны формироваться примерно так:
$columns[] = ['class' => 'yii\grid\ActionColumn', 'template' => '{view} {link}'];
foreach (????   ??) {
		$columns[] = [
			'attribute' => attribute_id',
			'format' => 'raw',
			'value' => function($model) {...},
			'headerOptions' => ['style' => $width]
			];		
	}

Если я делаю так:
<?= GridView::widget([
		'dataProvider' => $dataProvider,
	 // 'columns' => $columns,
	]);
?>

, то данные выводятся, но мне нужно управлять выводом, форматировать даные в ячейках в зависимости от типа, добавлять атрибуты и т.д. Пока нет ясного понимания как строится Gridview...
Подскажите пожалуйста как правильно сформировать колонки в цикле Foreach, откуда вытаскиваются данные колонок? Понял, что сами данные присутствуют в переменной $models, тут опять же говориться о переменной $model, совсем запутался...
  • Вопрос задан
  • 1345 просмотров
Пригласить эксперта
Ответы на вопрос 3
@masterfreelance
программист со стажем
Вот так "строит" колонки GridView, если его свойство $columns пустое.
protected function guessColumns()
    {
        $models = $this->dataProvider->getModels();
        $model = reset($models);
        if (is_array($model) || is_object($model)) {
            foreach ($model as $name => $value) {
                if ($value === null || is_scalar($value) || is_callable([$value, '__toString'])) {
                    $this->columns[] = (string) $name;
                }
            }
        }
    }
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
$models = $this->dataProvider->getModels(); //массив с моделями

все тут: www.yiiframework.com/doc-2.0/yii-data-activedatapr...
Ответ написан
Комментировать
@AlexKuznec
Можно указывать для каждой колонки параметр 'visible', примерно так:
[
         'attribute' => 'verified',
         'visible' => is_visible('verified'),
],

где is_visible некая функция или метод, или ассоциативный массив со значениями.

В целом, смотрите исходный код виджетов и других классов, заполняйте данные по аналогии или наследуйте класс и модифицируйте сами функции. Часто это быстрее поиска ответов через гугл (но документацию тоже знать надо). Я уже много чего таким образом подправил)

Например, чтобы DetailView не выводил пустые значения, достаточно сделать так:
class NotNullDetailView extends DetailView
{
    protected function normalizeAttributes()
    {
        parent::normalizeAttributes();

        foreach ($this->attributes as $i => $attribute) {
            if ($attribute['value'] === null || $attribute['value'] === '')
                unset($this->attributes[$i]);
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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