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. Функция должна возвращать правильно сформированную ссылку:
Как видно из примера — простой способ изменить порядок кнопок или удалить каку-нибудь из стандартных (
Оставить комментарий
Спасибо большое, подстроки как раз мне нужны были). Ещё интересует на уровне новичков тема хранения например 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. Рассмотрим вариант с использованием анонимной функции.
Шаблон 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. Перевод документации
- Получить ссылку
- Электронная почта
- Другие приложения
Yii2. Gr >
Разбираемся в том, как настроить внешний вид полей фильтра в GridView. За документацией идем в класс DataColumn.
В этом классе есть целых 3 замечательных свойства для настройки фильтрации по полю:
$filter | string|array|null|false – HTML-код поля фильтра (поле ввода, выпадающий список и т.д.) |
---|---|
$filterInputOptions | массив html-опций поля фильтра |
$filterOptions | массив html-опций ячейки |
Не выводится фильтр?
Вывод фильтра по умолчанию
Как скрыть (отключить) фильтр для поля
Как задать ячейке с фильтром ширину
Как добавить ячейке с фильтром 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:
ошибки — это
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-закрытый)
Привет ответ прост от того, что вы думаете.
Спасибо за это решение. Это мне очень помогло. Осталась еще одна маленькая проблема. Как я могу поставить заголовок по умолчанию? Теперь у меня есть выпадающее меню с пустым первым полем для выбора всех элементов, а после него элементы («открыто», «в процессе», «закрыто») отображаются. Хотелось бы поставить «Выбрать все» для пустого поля по умолчанию.