Yii2 GridView. Виджет вывода данных


Содержание материала:

Yii2 Gr >

У меня есть вид, где я пытаюсь вывести данные:

… и т.д. Проблема, с которой я столкнулся, заключается в том, что ни одно из полей не отображается, даже если они находятся в базе данных и должны выбираться в модели с помощью:

…и т.д. Это проблема, на мой взгляд, или в модели?

Решение

Думаю, я исправил это, проблема была на самом деле в контроллере, где «dataProvider», который я использовал, указывался как нечто другое. На данный момент я создал своего рода «хакерское» исправление, в котором я создаю экземпляр нового dataProvider внутри фактического представления, и теперь я могу заставить его отображать данные.

Gridview виджет в Yiiframework 2.x

Виджет Gridview используется для отображения различных данных в сетке, таких как текст, изображения и имеет множество функций, таких как сортировка, постраничная разбивка и т.д.

Сгенерированный пример Gridview

Свойство options в Gridview

По умолчанию класс Gridview называется ‘grid-view’, если мы хотим его изменить добавляем свойство options

Свойство options таблицы в Gridview

Таблица с данными в GridView по умолчанию содержит классы ‘table table-striped table-bordered’, для смены этих классов добавляем свойство ‘tableOptions’

Добавляем стили к записям таблицы

Для этого используем свойстов ‘rowOptions’

Формат макета Gridview

По умолчанию Gridview содержит постраничную разбивку (pager), информацию о количестве записей (summary), сортировку (sorter) и саму таблицу с данными ( items). Настраивается шаблон gridview через свойство layout .

Скрытие, отображение информации отображающей количество записей, заголовка и футера Griedview

Скрытие, отображение не заполненного Griedview

Замена пустых ячеек

Кнопки действия в GridView

Формат данных в столбцах GridView

Для назначения атрибутов ячейкам таблицы GridView используем параметр ‘contentOptions’. Атрибуты таблицы могут быть определены как анонимной функцией, так и массивом. Первый и второй вариант наглядно это показывают.

Настройки Gr >Сентябрь 22nd, 2015

Тема вроде как изжеванна вдоль и поперек, но так как просили больше статьей для новичков, расскажу об интересных особенностях виджета GridView, т.к без него у меня еще не обходился ни один проект. В дальнейшем буду пополнять данный FAQ.

Поменять фон строки в зависимости от данных

Есть таблица с данными, допустим список пользователей, нужно некоторые из строк выделить другим цветом (например заблоченных юзеров выводить на сером фоне), т.к это куда нагляднее, чем просто надпись «вкл/выкл» в отдельном столбце. И реализуется проще простого: нужно добавить анонимную функцию в атрибут rowOptions

Т.к в функцию передается $index — текущий номер строки, можно четные строки раскрасить в один цвет, не четные в другой. Точно также можно передать любые параметры, которые попадут в нутрь тега tr. Если же вычислять ничего не нужно, то можно сразу указать массив параметров без анонимной функции

Добавить подстроки в зависимости от данных

Есть таблица с данными и к примеру нам нужно выводить дату записей с группировкой по месяцам. Январь — дальше строки таблицы за январь. Февраль и тп.Для этого существуют атрибуты beforeRow и afterRow.
Атрибуты beforeRow и afterRow работают по тому же принципу, что и rowOptions за тем исключением, что результат, полученный для этих функций будет выведен до и после тега tr.

Просуммировать данные по столбцу с учетом фильтров

Если вы используете ActiveDataProvider, то для решения достаточно понимать, что в query у вас экземпляр класса Query. Это такой не выполненный запрос. ActiveDataProvider добавит к нему limit и offset для постраничного вывода. Но вы может использовать этот запрос и сами, так как вам нужно. Например так:

Поменять url для ссылок в ActionColumn

Если у вас используется один контроллер для множества гридов и вам нужно изменить только адрес ссылок для GridView, то сделать это можно передав анонимную функцию в качестве параметра urlCreator. Функция должна возвращать правильно сформированную ссылку:

Как видно из примера — простой способ изменить порядок кнопок или удалить каку-нибудь из стандартных ( ) — это передать параметр template.

Оставить комментарий

Спасибо большое, подстроки как раз мне нужны были). Ещё интересует на уровне новичков тема хранения например pdf файлов с возможностью для пользователей их скачки по временному рандомному пути, который они получат в сообщении.

Самое простое решение:
1) генерим ссылку с параметром, по которому можно понять о каком файле речь и даем ее пользователю как ссылка на скачку
2) по ссылке отдаем заголовки с рандомным именем файла и содержимое оригинального файла

Минусы: отсутствие докачки, нагрузка на сервер. Для отдачи статических файлов лучше всего поднять отдельный сервер nginx.

Ещё вспомнил. Как то меня попросили сделать данные в гриде покомпактнее, уменьшить высоту строк и сделать поменьше шрифт. Подскажите, пожалуйста, как лучше это сделать в стандартном гриде в yii2?

Нужно прописать свои CSS-классы или стили. Заставить grid использовать их можно через такие атрибуты как tableOptions, options, captionOptions и тп (см класс yii\grid\GridView)
Т.е будет примерно так:

Добрый день. А возможно ли в GridView сделать так, чтобы колонки были по одним данным, а фильтр по другим. Например табличка с данными по отзывам(отзыв, дата,положительный или отрицательный), а фильтр по пользователям этих отзывов(пол, возраст,…) ?
Или разместить 2 связанных GridView, но в одном убрать фильтр, а в другом как-то скрыть строки, через rowOptions?

Можно. Если фильтровать более чем по 1 полю, то лучше делать форму поиска и результаты выводить в виде GridView (как форму search генерит gii). Если фильтровать столбец по одному параметру, то делаем так

Т.е что происходит:
— метод Users::getYears() возвращает массив возрастов, он будет выпадающим списков сверху в фильтре.
— в search методе нужно обработать это значение. Оно придет как значение аттрибута date
Если массив значений для фильтра не нужен, то параметр filter не добавляем вообще, а просто в search методе обрабатываем значение как нам надо:

Надеюсь смогла объяснить.

Подскажите, пожалуйста, как сделать две таблички.Чтобы при нажатии на любую строчку из первой таблички, например, справа во второй табличке раскрывались подробные характеристики строчки из первой таблицы.

В первой таблице ссылка должна отправлять ajax запрос и отображать результат в том месте где 2-я таблица.

В контроллере нужно не забывать делать renderAjax вместо render. Надеюсь стало понятнее в какую сторону смотреть.

По предыдущему вопросу по двум зависимым табличкам.
А можно решить эту проблему с помощью partial view? Без ajax. Подскажите, пожалуйста

Смотрите как это работает: юзер кликнул на ссылку. Вместо того, чтобы перезагружать страницу, отправляем запрос на сервер (ajax) и в ответ получаем кусочек view (renderPartial или renderAjax) только той части, которая нужна для второй таблицы и с помощью JavaScript выводим полученные данные в нужном месте страницы (нужный яваскрипт уже есть в компоненте yii Pjax). Т.е без ajax запроса на сервер не получится.
Но можно сделать и по другому: загружать на страницу сразу всю информацию и скрывать лишнюю в скрытых css дивах. По клику на ссылку с помощью JavaScript нужный див показывается, а все остальные остаются скрытыми.

Yii 2 : кратко о Grid View

За основу взять код, полученный при помощи генератора Gii. Типичный код GridView после автоматической генерации:

Настройки строк gridview yii 2.0

Добавить класс строкам можно через свойство rowOptions. Рассмотрим вариант с использованием анонимной функции.

Топ-пост этого месяца:  Как осуществляется в PHP загрузка файла во временный и целевой каталог, примеры кода

Шаблон GridView в yii2

По-умолчанию, шаблон GridView содержит информацию об общем количестве записей и отображенных записей summary , саму таблицу с данными items и блок постраничной навигации pager . Настраивается шаблон gridview через свойство layout . Простой пример:

Свойство summary позволяет переопределить соответствующее поле.


Свойства showFooter и showHeader управляют отображением заголовка и футера GridView.

Свойство showOnEmpty разрешает отображение пустой таблицы, в случае отсутствия данных для отображения.

Замена пустых данных в GridView

emptyCell позволяет задать значение для отображения в пустых ячейках.

Отображение управляющих кнопок в GridView

Настройка вывода и вида кнопок в GridView осуществляется указанием класса, шаблона и других параметров столбца.

Вывести нестандартные кнопки можно при помощи анонимных функций.

Формат данных в столбцах GridView

Для установки своих атрибутов ячейкам таблицы GridView в Yii 2.0, достаточно указать их в параметре contentOptions . Атрибуты могут быть определены как массивом, так и анонимной функцией function ($model, $key, $index, $column) , которая может вычислять и возвращать массив атрибутов, таких как class , style , data-key и других.

Сокращенный формат

Yii 2.0 GridView позволяет сократить код настройки поля до вида ‘attribute:format:label’ , где attribute — данные из модели, format — шаблон вывода данных ( ‘raw’ , ‘text’ , ‘html’ , ‘image’ , ‘datetime’ , ‘time’ , ‘date’ , [‘date’, ‘php:Y-m-d’] и другие), label — заголовок столбца. В итоге, код

можно сократить до

Класс DataColumn::className() присваивается автоматически, если он не указан. Формат данных обрабатывается formatter , используемым GridView. По-умолчанию это yii\i18n\Formatter.

Картинка в Yii 2.0 GridView

Отобразить картинку в GridView можно несколькими способами:

Самый простой: указать тип поля после двоеточия ‘categoryImagePath:image’ . Второй вариант — расширенная настройка поля.

Ссылка в GridView

Настроим поле для вывода ссылки из модели.

Данные из связанных моделей в GridView

Связанные данные выводятся аналогично данным самой модели.

В модели Category описаны соответствующие методы.

Вывод даты и времени в GridView

Отобразить данные в формате даты/времени можно либо прямым указанием типа данных для вывода ‘created_at:datetime’ , ‘created_at:date’ , ‘created_at:time’ или с использованием расширенного варианта.

DropDownList в фильтре GridView Yii 2.0

По-умолчанию, GridView использует текстовый фильтр. Для создания фильтра в виде выпадающего меню, достаточно указать массив значений, по которым будет производиться фильтрация в параметре filter .

Массив можно задать вручную или получать из модели.

Получение списка категорий, имеющих дочерние, организовано в модели.

Заключение

Стандартный виджет Yii2 фреймворка GridView имеет богатые возможности для отображения данных. Возможно как отображение «сырых» данных, так и вычисление их на лету, при помощи анонимных функций.

Gr > 26.08.2020 Admin Один комментарий

Отображение данных из связанных таблиц в GridView одна из самых распространённых задач при работе с Yii/Yii2 .

Рассмотрим, её решения для Yii 2.

Допустим у нас имеются две связанные таблицы. Одна ( Users) хранит сведения о пользователях, а вторая () перечень их ролей (Администратор, Пользователь и т. д.).

Структура этих таблиц показана на скриншоте ниже.

Как отобразить соответствующие сведения в GridView с поддержкой стандартных сортировки и поиска (как это показано на следующем скриншоте)?

Подготовка

Вначале мы должны явно прописать связи между моделями таблиц.

В нашем случае за связь отвечает метод getRole модели Users.

Далее создаём в модели поиска (в нашем случае класс SearchUsers) поле по которому мы будем осуществлять поиск.

Так как в модели Users свойство role_id имеет тип integer, а свойство role доступно только для чтения, нам необходимо дополнительное поле, чтобы мы могли осуществлять поиск и сортировку по названию роли, а не по её id.

Реализация

В начала продолжим дорабатывать модель поиска.

Пропишем наше новое поле в rules, чтобы оно стало доступным для стандартногопоиска.

Далее нам нужно доработать метод search.

Получим сведения о ролях пользователей при помощи метода joinWith объекта ActiveQuery.

Обратите внимание, в методе joinWidth мы указываем свойство role.

Теперь добавим для dataProvider критерии для сортировки по нашему полю.

Для параметров asc и desc мы указываем уже имя таблицы, в которой хранятся роли (получаем его при помощи метода tableName соответствующей модели) и название поля, по которому нужно выполнить сортировку.

Названия таблицы и поля указываются в виде строки в формате «Таблица.Поле». Поэтому, не точка перед именем поля обязательна.

Для полей созданных самостоятельно (как в нашем примере) критерии для сортировки следует обязательно указывать до вызова метода load объекта ActiveQuery.

Зададим критерии для поиска.

Первые два вызова метода andFilterWhere в приведённой цепочке задают критерии для поиска по полям исходной модели user_name и fio. Третий задаёт эти критерии уже для нашего поля.

Критерии поиска задаются в виде простого массива.

Первый элемент – метод поиска (строка). Здесь задан метод like используемый в Yii2 по умолчанию (поиск по частичному совпадению).

Второй элемент – поле в таблице, по которому осуществляется поиск (в нашем случае с указанием названия таблицы, как при сортировке, т. к. поле находится в другой таблице, а не в той, которой сопоставлена данная модель).

Третий элемент — поле модели, которому сопоставляется предыдущий элемент.


Всё вместе

Ниже приведён пример метода search, в котором все вышеописанные действия уже выполнены.

Делаем удобный фильтр по полю «status» для виджета Gr >

Очень часто, для административных целей при работе с пользователями, постами, комментариями и тд. в соответствующих таблицах базы данных создается специальное поле «status». Называться оно может и по другому но выполняет всегда одну роль – в зависимости от указанного в нем значения меняется логика обработки данных.

Например для таблицы posts с постами, данное поле может принимать значения:

  • черновик (draft);
  • опубликован (publish);

и тд.
Таким образом программист может настроить вывод только опубликованных постов для просмотра посетителю сайта.

Сам фреймворк yii2 версии Advanced по-умолчанию так же использует такую схему работы с пользователями, устанавливая им статус «активен» или «удален».

Поэтому стоит подробнее разобраться как настроить работу с полем «status». В данной заметке Разберемся с выводом данного поля с помощью стандартного для yii2 виджета GridView (и не только), которой очень часто используется при создании административной части с помощью CRUD. Для примера будет использоваться таблица posts.

Создание поля в БД.

Создаем поле status для таблицы posts. По аналогии с миграцией создания пользователя для этого в своем файле миграции прописываем строку
которая создаст поле status со значением по-умолчанию «0». Т.е. для обозначения статусов будем использовать цифровые значения.

Модель(сущность) Post.

Далее создаем или генерируем модель Post, где прописываем все нужные статусы в виде констант:

Таким образом видно, что по-умолчанию используется статус 0, т.е. «черновик», а по завершению редактирования администратор вручную поменяет статус поста и он станет доступным для просмотра посетителями сайта. Сами цифры могут быть любые, не обязательно 0 или 10.

Для валидации в методе rules нам нужны такие правила касающиеся поля ‘status‘:
Вторым правилом мы разрешаем выбор одного из указанных значений, что бы в таблицу не попало что-то лишнее.

Вспомогательный класс – helper.

По-умолчанию, при выводе в виджете GridView, в поле фильтрации нужно вручную вводить 0 или 10 или другие числа, которые нужно найти в БД. Так же, в строках снизу выводятся числовые значения, с которыми работать не удобно. Нам же хочется видеть статусы в виде соответствующих слов, а в поле фильтрации не вводить что-то, а выбирать из списка доступных статусов.

Для того, что бы сделать такие удобства необходимо написать нужный функционал. Вынесем его в дополнительный класс – помощник, т.к. не в контроллере не в сущности «Post» ему не место.
Файл common/helpers/PostHelper.php :

В методе statusList прописываем значения для выпадающего списка. Метод statusName будет получать для виджета GridView значение в виде строки соответствующее числовому значению из БД используя как раз метод statusList. Ну а метод statusLabel используется для создания элемента с классом в зависимости от текущего статуса. Например, статус «черновик» выведем в красной рамке, что бы администратор его не упустил из виду, а статус «опубликован» — в зеленой.

Вывод — корректируем виджеты.

index.php
Для создания/редактирования и др. постов генерируем CRUD, который создаст нам контроллер с соответствующими действиями и видами. Основной файл представления index.php по-умолчанию использует GridView. необходимо найти там подключение поля «status» и заменить на такой блок:

Пространства имен классов, можно прописать вверху файла используя директиву «use».
В результате получим красивое и человеческое обозначение текущего статуса поста и удобный выпадающий список для фильтрации:

ProgerGirl

Блог девушки-программиста. Zend, Yii, MODx. Перевод документации

  • Получить ссылку
  • Facebook
  • Twitter
  • Pinterest
  • Электронная почта
  • Другие приложения

Yii2. Gr >

Разбираемся в том, как настроить внешний вид полей фильтра в GridView. За документацией идем в класс DataColumn.

В этом классе есть целых 3 замечательных свойства для настройки фильтрации по полю:

$filter string|array|null|false – HTML-код поля фильтра (поле ввода, выпадающий список и т.д.)
$filterInputOptions массив html-опций поля фильтра
$filterOptions массив html-опций ячейки
Топ-пост этого месяца:  FancyBox для WordPress плагины для работы с библиотекой

Не выводится фильтр?

Вывод фильтра по умолчанию

Как скрыть (отключить) фильтр для поля

Как задать ячейке с фильтром ширину

Как добавить ячейке с фильтром css-класс

Как добавить полю с фильтром css-класс

Аналогичным образом, только используем свойство filterInputOptions. Также здесь прописываем любые html-атрибуты (style, data- и т.д.)

О том, как вывести в поле фильтра выпадающий список или использовать плагин, читать в посте Yii2. GridView. Filter: выпадающие списки, datepicker

yii2 все о gr > 1181
  • Yii2
  • Gridview
  • Урок

Вот и настал долгожданный момент практики. Кто не читал предыдущий урок, обязательно с ним ознакомьтесь. В нем говорится о теории gridView (ссылка: здесь). А теперь я бы хотел предложить вам реализовать следующий функционал (можно не читать, а сразу перейти к Миграции):

1 Вывод таблицы типа Stripped (полосатая): когда одна строка имеет фон, а следующая — нет
2 Один из фильтров показывает данные по выбранным чекбоксам
3 Один из фильтров имеет выпадающий список
4 Одна из колонок содержит отформатированную дату
5 Одна из колонок содержит изображение
6 Если данные пустые, то мы закрашиваем ячейку в красный цвет
7 Обрезать длинные тексты, если они превышают 10 знаков
8 В футере вывести пояснения к ячейкам
9 Разместить 2 пагинации: одну — сверху, а другую-снизу.
10 Сделать заголовок синим
11 Сделать текст футера серого цвета
12 Вывести ошибки с фильтра вверх в общий контейнер
13 Изменить текст количества отображаемых элементов на странице
14 Если запись удалена, в ячейке использовать крестик, если активная — галочку

Структура базы данных, Миграции

Как и обычно, начнем с миграции базы данных. Дадим название БД: gridview. Напишем поочередно 2 команды:

Будет создано 2 файла в папке /migrations. Поменяем функции safeUp и safeDown поочередно в каждом файле. Наполнение вы найдете в моем репозитории: github. Для примера можете посмотреть, как мы выполняли данные действия в этом уроке: Простое приложение на Yii2 и Angular 2 Часть1


Для файла books_init:

Для файла books_insert:

После наполнения выполните команду:

Теперь наша база данных готова!

Модели и контроллеры

Далее нам нужно создать базовую модель (в нашем случае это Books) и ту, которая будет работать с ActiveDataProvider, чтобы организовать фильтрацию, сортировку и пагинацию. Приступим к созданию главной модели: Books. Расположить ее нужно в папке /models. Листинг этого кода вы найдете на github

Также в этой папке рядом нужно создать файл: BooksSearch.php. Здесь я прокомментирую листинг кода

Наш класс BooksSearch наследуется от класса Books. Это нужно для того, чтобы получить доступ к важному классу Model, на котором и держится наша валидация, а также, при возможности, дополнительные функции и свойства родителя. Например, различные связи (relations)

Ниже идет полностью переопределенный метод rules. Так как нам не нужно здесь правило required, нам важно, чтобы значения в принципе отправлялись (это касается фильтра) и имели нужный нам тип (например, чтобы защититься от SQL инъекции) Замечу, что благодаря свойствам этой модели и строится фильтр. Если свойства в этой модели не будет, то и поле в фильтре вы не увидите. Говоря, простым языком: все, что есть в function rules(), будет работать в фильтрации. И логично предположить: все, что отправляется из фильтра, попадает сюда. Сценарии мы просто пропустим, там ничего интересного, и сразу переходим к методу search()

В методе search() работает основная логика отображения данных. Во-первых, обратите внимание на переменную $query — это instance запроса ActiveRecord (то есть, select, where, join), НО! Здесь не должны использоваться методы ->all(), ->one(), ->count() Это очень важно! За вас всё сделает ActiveDataProvider. Там и будут работать count при построении пагинации и offset() и и выборка данных на основе условий и прочее.

Вот мы и дошли до самой основной переменной $dataProvider. Это результат класса ActiveDataProvider(). Если вам интересно, вы можете посмотреть, что там внутри. В двух словах: там настройки пагинации, сортировки и много всего остального. Можете вкратце ознакомиться с гайдом (тут все нормально написано: ссылка)
В целом, вы его можете подкрутить в плане: в каком порядке выводить данные при инициализации и по сколько записей на странице.

Теперь обратите внимание на конструкцию:

Она означает, что параметры, пришедшие с фильтра, «вгрузились» в модель, и с ее свойствами можно будет работать (если они валидны конечно).

Далее идет конструкция:

Что в буквальном смысле означает: если не валидно, то просто проинициализировать $dataProvider (по умолчанию)

Но если модель валидная и реально пришли параметры, то мы можем повлиять на переменную $query. Так вот $query->andFilterWhere означает: если в модель удалось вгрузить это свойство, то оно участвует в выдаче, если нет, то ничего не происходит, и данный метод не отработает. Давайте разберем на примере: пусть пришел параметр «delete», то есть пользователь выбрал в фильтре что-то связанное с удалением. Это значит, что будет построен SQL запрос: SELECT * FROM gr не попадет.

Теперь осталось создать контроллер, заходите в /controllers/SiteController.php найдите там actionIndex (63 строчка), добавьте следующее:

Я здесь заострю внимание на Yii::$app->request->queryParams. Образно говоря: взять все параметры и попытаться вгрузить их в метод search(). Там он уже будет разбираться и валидировать все. Теперь переходим к самому пикантному файлу: /views/site/index.php. Там находится основной код построение gridView виджета

Теперь давайте на примере кода ответим на все вопросы, которые мы задали себе вначале:

1 Вывод таблицы типа Stripped (полосатая): когда одна строка имеет фон, а следующая — нет

Понятное дело, мы могли это сделать на CSS. Более того это уже сделано по умолчанию, но мы тренируемся в работе функций виджета, поэтому для начала я отключил общий класс таблицы, сделал обычный ее вариант:

И сама функция, которая нам нужна это rowOptions

Мы берем каждый индексный номер и пытаемся нацело поделить на 2. Если делится без остатка, то добавляем класс к stripShow. Ниже я описал это свойство в теге

2 Один из фильтров показывает данные по выбранным чекбоксам

Все что нам нужно здесь, это в колонке определить свойство filter. Для этих целей я буду использовать html-хелпер:

ActiveCheckboxList принимаем модель, название атрибута, а также массив, данный для построения чекбокса. В нашем случае это массив вида:

[ ‘Дэниел Киз’ => ‘Дэниел Киз’ ]

где ключ используется для передачи в модель, а значение — для вывода в чекбокс лист. Также обратите внимание на ArrayHelper. Функция map выберет только те значения, которые нам нужны из выборки

3 Один из фильтров имеет выпадающий список

Здесь вообще все просто: также переопределяем фильтр, только задаем обычный массив:

Еще я добавил свойство, которое фиксирует ширину ячейки, чтобы текст внутри select’a хорошо читался:

4 Одна из колонок содержит отформатированную дату

Используем встроенный форматер, а для представления формат php дат:

5 Одна из колонок содержит изображение

Повторяем предыдущие действия: используем форматтер, а фильтр вообще отключим:

6 Если данные пустые, то мы закрашиваем ячейку в красный цвет

Решение, которое я вам предложу мне не очень нравится. Оно получается несколько громоздким, но, тем не менее, иных вариантов я не нашел. Если есть идеи, пишите ваши предложения. Мое решение — добавить к каждой ячейке данное свойство:

Соответветственно, ниже вы найдете опеределение этого CSS класса

7 Обрезать длинные тексты, если они превышают 10 знаков

Для этих целей отлично подойдет встроенный StringHelper, а свойство, которое нам нужно — это контент, отвечающий за вывод данных в ячейку:

8 В футере вывести пояснения к ячейкам

Для начала нам нужно активировать сам футер:

А теперь в каждой ячейке можно написать пояснение:

9 Разместить 2 пагинации, одну сверху другую снизу И 12 Вывести ошибки с фильтра вверх в общий контейнер

Я объединил два вопроса в один, так как они решаются на уровне layout:

ошибки — это — теперь можно проверить попробуйте в фильтер created_at передать строку.

— это пагинации. Для того, чтобы ее увидеть, я бы предложил зайти в BooksSearch и найти там наш ActiveDataProvider, добавить лимит на отображаемые записи, например, 5. Должно получиться как-то так:

10 Сделать заголовок синим и 11 Сделать текст футера серого цвета

Я также объединил 2 этих вопроса. Для заголовка это свойство headerRowOptions и для футера footerRowOptions (но не забывайте, что свойство showFooter должно быть true). Получилось вот так:

CSS свойство headerCustomRow задано ниже

13 Изменить текст количества отображаемых элементов на странице

Здесь, я думаю, все понятно, и отсутствует необходимость в комментариях.

14 Если запись удалена в ячейке использовать — крестик, если активная то — галочку

Также пользуемся свойством content в внутри ячейки:

В моем случае выводится glyphicon, и, соответственно, условие: если delete == 0, то мы выводим галочку, если 1 — крестик.

Заключение


На этом все. Если вы нашли какие-то неточности или даже ошибки, то обязательно пишите о них мне, а я буду исправлять и делать для вас контент лучше. Лучи добра!

Топ-пост этого месяца:  Инстаграм сделал подборки для шоппинга и торговые теги для видео

Облако тегов

Следующая статья

Bootstrap 4.1 – модальное окно

Добро пожаловать! При построении модальных окошек используются HTML, JS, и CSS. Они выводятся поверх всего контента, при этом скролл работает только внутри всплывающего окна.

Как скрестить ежа с ужом. Используем GridView из Yii 2 в проекте на Laravel

Недавно была статья про Yii, где в комментариях обсуждали специфичные для Yii компоненты, в частности GridView и ActiveForm, и фреймворк Laravel. Я подумал, а почему бы и нет.

Что из этого получилось, читайте под катом. Потребовалось написать пару небольших обвязок и сконфигурировать определенным образом, но в целом все работает — и грид, и формы. Также есть небольшой обзор существующих аналогов для Laravel.

Какие есть варианты

— верстка Bootstrap
— автоматическая обработка сортировки, пагинации, ошибок валидации формы
— минимум кода, написанного вручную
— кастомизируемость

Хороший грид, не зависит от фреймворков. Для фреймворков есть коннекторы. Довольно громоздкая конфигурация. К тому же, похоже, выводимые данные не экранируются.

Много бойлерплейта, добавляет свою глобальную функцию, какой-то странный способ рендеринга.

Форма сама выбирает роуты для action, ошибки берутся из сессии. Но в целом близко к тому, что нужно.

Мне не нравится подход с передачей ошибок и введенных значений через сессию. Через F5 форму повторно не отправить, если обновить случайно, то все ошибки и значения стираются.

Какой смысл в билдере, если открывать/закрывать группу тегов надо вручную.

Хороший форм-билдер, практически полный аналог ActiveForm. Можно задать хранилище ошибок и введенных значений.

Этот вариант кажется наиболее подходящим. Есть и грид, и формы. Грид вполне неплохой, но с формами проблема.

— Действия view/create/edit висят на одном роуте, различаются через get-параметр. Соответственно и в гриде по умолчанию URL для действий такие же.
— Это одна форма, просто различается режимом отображения. Это создает проблемы, если надо created_at/updated_at показывать только для view. И свой класс для поля надо описывать для всех 3 режимов.
— Не очень хороший код в проекте

Интеграция

Буду делать по шагам, окончательный код можно найти в конце статьи. Так как таблицы и полное редактирование часто встречаются в административном разделе, пример будет в виде админки для некоторого сайта.

Для справки, папка laravel занимает 2.6 Мб, папка symfony 4.6 Мб, папка yiisoft 3.9 Мб, зависимости Yii 5.6 Мб.

Рассмотрим простое приложение с заказами и товарами.

Создадим Eloquent модели и OrderController для раздела заказов. Создадим группу роутов для админки.

Создадим Bootstrap-шаблон со ссылками на CDN.

Делаем middleware с инициализацией и подключаем к роутам админки. Инициализация выглядит так.

spl_autoload_unregister([‘Yii’, ‘autoload’]); — лучше отключить, чтобы не мешался, достаточно автозагрузчиков Laravel. Он ищет файлы через getAlias(‘@’. ) и конечно не находит.
basePath — корневая директория приложения, при неправильной установке могут быть ошибки в путях. В этой же директории создается папка runtime .
assetManager.basePath, assetManager.baseUrl — путь и URL для публикации ассетов, название папки произвольное.
assetManager.bundles — отключаем публикацию jQuery, так как она подключается в главном шаблоне отдельно.
request — переопределяем компонент запроса, в котором заменяем работу с CSRF-токеном, название поля такое же как в настройках Laravel.
urlManager.enablePrettyUrl — надо включить, если нужны дополнительные модули типа Gii.
(new \yii\web\Application($config)) — в конструкторе происходит присвоение Yii::$app = $this;

Компонент запроса выглядит так:

Токеном управляет Laravel, поэтому регенерацию обрабатывать не надо.

Теперь можно попробовать запустить. Добавим код для списка заказов.

Нужно установить dataProvider.pagination.route и dataProvider.sort.route , иначе произойдет обращение к Yii::$app->controller->getRoute() , а контроллер у нас null . Аналогично с ActionColumn , только там будет проверка и InvalidParamException . URL генерируется через \yii\web\UrlManager , но результат получается такой же, как с роутингом Laravel. Можно задать менеджер через dataProvider.pagination.urlManager , если нужно.
Метки колонок пока оставим автогенерируемые.
Также надо задать некоторые стили для иконок сортировки.

Грид выводится, но так как нет фронтенд-скриптов, то кнопка Delete не работает.

Надо вывести скрипты, которые находятся в компоненте \yii\web\View . Методы renderHeadHtml(), renderBodyBeginHtml(), renderBodyEndHtml() защищены (непонятно от кого, особенно учитывая, что все переменные public ). Как ни странно, есть повод применить антипаттерн «public morozov». Или можно просто скопипастить их в главный шаблон.

В Yii регистрация ассетов происходит в функции endBody() , а также весь рендеринг оборачивается в буфер, в котором потом производится замена магических констант CDATA на реальные ассеты. Эмуляция этого поведения находится в функции initAssets() . Заменять мы ничего не будем, нам нужно просто чтобы были заполнены свойства $this->js, $this->css и другие.

Вызов Html::csrfMetaTags() нужен, так как скрипт yii.js берет csrf-токен из HTML страницы.

ArrayDataProvider работает, но надо сделать аналог ActiveDataProvider , чтобы получать из базы только то что нужно.

Метки и фильтры

Нужно сделать базовую модель, унаследованную от \yii\base\Model , которая будет возвращать гриду метки для колонок и правила полей для фильтрации. Для этого есть параметр filterModel . Сделаем ее конфигурируемой через конструктор.

Можно унаследоваться и определить специализированную модель, и поместить все туда.

Есть небольшая проблема, что если задана filterModel, но нет ни одного поля для фильтра, то все равно отображается строка с пустыми ячейками. В этом случае можно метки вручную проставить. Хотя лучше было бы, если бы в самом компоненте была такая проверка.

Просмотр

Тут делаем аналогично, настройки колонок можно скопировать из грида. Товары в заказе сделаем отдельным гридом на странице просмотра. Метки тоже пока оставим автогенерируемые.

Создание / Обновление

Сначала нужно сделать модель формы, враппер для Eloquent моделей, унаследованный от \yii\base\Model , чтобы компонент ActiveForm мог вызывать нужные методы.

Теперь можно сделать редактирование.

Правила валидации задаются в стиле Yii. Если нужно, можно переопределить метод validate() и вызывать там валидатор Laravel. В данном примере мы этого делать не будем.

Blade не разрешает объявлять переменные. А ActiveForm::begin() и выводит теги и возвращает значение. Можно явно написать тег , можно сделать новый тег через Blade::extend() , как советуют здесь, можно сделать обертку для ActiveForm . Пока оставим .

Как и в случае с фильтром, можно унаследоваться от FormModel и поместить все объявления туда.

Метки на странице просмотра

Теперь можно использовать OrderForm , чтобы задать метки в методе app/Http/Controllers/Admin/OrderController.php .

Удаление

Дополнения

Можно подключить Gii. В чистом виде он не нужен, но можно брать из генератора моделей правила валидации формы и метки для полей, чтобы не генерировать их вручную. Или можно свой генератор написать.

Yii::setAlias(‘@App’) — путь к файлам определяется через Yii::getAlias(‘@’. ) , поэтому для класса App\Models\Order будет проверяться путь ‘@App/Models/Order.php’ .

setBaseUrl(‘/admin’) — нужно, чтобы роутинг Yii обрабатывал только часть после ‘/admin’.

С Yii::setAlias(‘@App’) и [‘Yii’, ‘autoload’] есть такая проблема. Если не отключить автозагрузчик, то при неправильном названиии класса или неймспейса в существующем файле происходит ошибка, которая неправильно обрабатывается. Происходит это так. Он подключает файл, но потом не находит класс и бросает исключение UnknownClassException . Вызывается автозагрузчик Laravel, который проверяет фасады и алиасы и тоже ничего не находит. Потом вызывается автозагрузчик Composer, который снова подключает файл, и возникает уже другая ошибка ‘Cannot declare class ‘. ‘, because the name is already in use’. Приложение падает с ошибкой 500 без записи в лог.

Gii будет работать, несмотря на то, что мы отключили jQuery, так как у него свой шаблон отображения, и поэтому он сбрасывает настройки ассетов приложения.

Можно вынести конфигурацию ActionColumn в отдельный класс, чтобы не копировать в разные гриды.

Можно сделать обертку для ActiveForm, куда поместить вызов виждета, и передавать модель в конструктор. Это позволит убрать прямые теги и передачу модели в каждое поле. Также туда можно добавлять дополнительные методы для инициализации сторонних виджетов полей типа Select2. Такой билдер можно использовать и в проектах на Yii.

Исходный код

Исходный код можно найти здесь. Все шаги сделаны отдельными коммитами. Есть миграции и тестовые данные.

Обертки находятся в папке app/Yii .

Без остальных можно обойтись, но с ними удобнее:

Также, думаю, это неплохой пример для сравнения разных реализаций. Если есть время и желание, приводите в комментариях свою реализацию этой админки на другом стеке технологий.

Вывод yii2 в виде фильтра виджета gridview

Я хочу сделать закрытые значения dropdownlist в виджетах Gridview структуры YII2. теперь у меня есть код:

и statudId должно быть одним из трех возможных значений. (1-открытый, 2-ход, 3-закрытый)

Привет ответ прост от того, что вы думаете.

Спасибо за это решение. Это мне очень помогло. Осталась еще одна маленькая проблема. Как я могу поставить заголовок по умолчанию? Теперь у меня есть выпадающее меню с пустым первым полем для выбора всех элементов, а после него элементы («открыто», «в процессе», «закрыто») отображаются. Хотелось бы поставить «Выбрать все» для пустого поля по умолчанию.

Добавить комментарий