Yii2. Журнал ботов. Туториал 0. Часть IV

Продолжаем создавать страницу — «Журнал для ботов». Первая часть.

Список адресов

Файл представления

Теперь займёмся выводом актуальных адресов. Файл представления всех адресов находится по адресу \views\address\index.php.

Тут основную работу выполняет GridView, этот виджет и будем настраивать.

GridView

Этот виджет хорошо настраивается через параметры.

dataProvider ожидает специальный класс, который мы подготовим в модели AdressSearch, этот класс помогает искать данные.

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

columns — список столбцов, которые будут выводиться в таблице, в виде массива.

Существуют ещё и другие параметры виджета GridView, более подробней смотрите в документации.

Займёмся теперь столбиками более внимательно. Тут в виде элемента масива в виде строчек указаны в основном поля dataProvider, которые описаны в модели AddressSearch. А пока эта модель AddressSearch не была изменена, то речь идёт лишь о полях таблицы ‘addresses’. И конечно же столбики, которые будет генерировать этот виджет, можно иначе настроить.

[‘class’ => ‘yii\grid\SerialColumn’] — добавляет столбик с порядковым номером элемента. Причём, это номер не ID в таблице, а свой внутренний номер. (Нам это не надо, убираем.)

‘id’ — как и описывалось выше, это добавляет столбик с полем ‘id’, который будет найден в модели AddressSearch (столбик в таблице ‘addresses’).

Тоже самое касается элементов массива ‘bot_id’, ‘ip’ и ‘create_date’.

[‘class’ => ‘yii\grid\ActionColumn’] — последний из столбиков, который добавляется автоматически Gii. Этот класс добавляет иконки для управления отдельными записями (посмотреть, изменить и удалить). Но для нашей задачи это не надо.

Настраиваемый столбик

Теперь же рассмотрим как создавать свои столбики, данные из которых не напрямую хранятся в таблице ‘addresses’.

В нужное место, где мы хотим поставить столбик, ставим массив со следующими ключами:

attribute — ожидает аттрибут модели, с которой будет связан этот столбик. Благодаря этому этот столбик может быть отсортирован.

label — определение названия столбика

value — значение, которое будет подставляться в ячейки столбика. Тут в качестве значения мы можем использовать обозначение столбика, который мы можем получить благодаря описаным связям в модели Address. Т.е. мы можем тут написать ‘bot.name’, поскольку в модели Address описан метод getBot(), который связывает эту модель с моделью Bot. Так же в качестве значения можно передать анонимную функцию, например: ‘value’ => function ($data) { return $data->bot->name; }, которая выдаёт аналогичную информацию.

В результате мы получаем следующий код файла представления index.php

<?php
use yii\helpers\Html;
use yii\grid\GridView;
/* @var $this yii\web\View */
/* @var $searchModel app\models\AddressSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = ‘Addresses’;
$this->params[‘breadcrumbs’][] = $this->title;
?>

title) ?>

$dataProvider,
‘columns’ => [
[
‘attribute’ => ‘bot_id’,
‘label’ => ‘Название бота’,
‘value’ => ‘bot.name’
],
‘ip’,
‘create_date’,
],
]); ?>

Модель

Теперь изменим модель AddressSearch, которая и готовит данные для этого вида. Если быть точнее, то различные «гриды» одной и той же основной модели могут выдавать разные значения, а следовательно для каждого «грида» лучше всего и создавать отдельные поисковые модели. Вот и настрим модель AddressSearch под нашу цель.

Тут надо лишь изменить метод search():

public function search($params) {
$query = Address::find()
->where([‘>’, ‘create_date’, date(‘Y-m-d H:i:s’, time()-60*60*24)]);
$dataProvider = new ActiveDataProvider([
‘query’ => $query,
]);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
return $dataProvider;
}

->where([‘>’, ‘create_date’, date(‘Y-m-d H:i:s’, time()-60*60*24)]) — дополнительное условие, нас интересуют лишь те записи, которые были сделаны за последний день. Поскольку в условие нам надо не «равенство», а сравнение — «больше», то в массиве не два параметра, а три. Причём на первом месте стоит оператор («польская нотация»). Я использую методы date() и time(), поскольку у меня не установлен PHP класс DateTime.

Так же убираем все настройки методов andFilterWhere(), поскольку мы не будем использовать фильтры.

Метод actionIndex() контроллера AddressController оставляем без изменений.

Ссылки

https://almat.su/svyazannye-modeli-v-gridview-yii2/

https://www.youtube.com/watch?v=LDGaZZ6szLc

Пятая часть

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.