OctoberCms Backend list filter dynamic ajax widget
Предположим что у нас уже есть фильтры. Если нет, сначала добавляем.
Далее добавляем виджет куда-нибудь на страницу контроллера. Для этого создаем в контроллере файл _list_container.htm в папке контроллера (там где config_list.yaml) со следующим содержимым:
<div class="report-container" id="stat">
<?= $this->makePartial('$/site21/myplugin/partials/stat.php'); ?>
</div>
<?php if ($toolbar): ?>
<?= $toolbar->render() ?>
<?php endif ?>
<?php if ($filter): ?>
<?= $filter->render() ?>
<?php endif ?>
<div class="row row-flush">
<?= $list->render() ?>
</div>
В своем плагине я создал файл по пути partials/stat.php. Его содержимое будет примерно таким:
<ul>
<li class="item width-6">
<div class="report-widget">
<h5>Заголовок</h5>
<div
data-control="chart-line"
data-time-mode="datetime"
data-chart-options="
xaxis: {
mode: 'time',
},
yaxis: {
min: 0,
},
series: {
lines: {show: true},
points: {show: true},
},
legend: {
show: false
}
"
class="height-200"
>
<span
data-chart="dataset"
data-set-color="#34495e"
data-set-data="<?=$items ?>"
data-set-label="Заголовок"
></span>
</div>
</div>
</li>
<li class="item width-6">
<!-- еще виджеты при необходимости-->
</li>
</ul>
Другие примеры фильтров можно посмотреть здесь.
Теперь чтобы при открытии страницы контроллера над списком и фильтром появился виджет с графиком chart-line нужно передать парамер $items странице. Для этого переопределяем index в своем контроллере следующим образом:
public function index()
{
// Я использую разметку виджетов с dashboard, пожтому добавляю css
$this->addCss('/modules/backend/widgets/reportcontainer/assets/css/reportcontainer.css');
$this->pageTitle = 'Заголовок страницы';
$this->makeLists();
$listWidget = $this->asExtension('ListController')->listGetWidget();
$data = $this->getStatistics($listWidget);
$items = '';
foreach ($data as $key => $value) {
$items .= '[' . $key . ',' . $value. '],';
}
$this->vars['items'] = rtrim($items, ',');
}
private function getStatistics($listWidget)
{
$q = $listWidget->prepareQuery()->get();
$count = $q->mapToGroups(function ($item, $key) {
$month = Carbon::parse($item['time'])->endOfMonth()->timestamp * 1000;
return [
$month => $item
];
})->map(function ($group) {
return $group->count();
});
return $count;
}
Колонку time нужно переименовать под свой случай. Например created_at.
Теперь у нас появился общий график. Но нужно его оживить при изменении фильтров.
В свой контроллер добавим действие на событие изменения фильтров:
public function listFilterExtendScopes($filter)
{
$filter->bindEvent('filter.update', function () {
$listWidget = $this->asExtension('ListController')->listGetWidget();
$data = $this->getStatistics($listWidget);
$items = '';
foreach ($data as $key => $value) {
$items .= '[' . $key . ',' . $value. '],';
}
$this->vars['items'] = rtrim($items, ',');
return [
'#stat' => $this->makePartial('$/site21/myplugin/partials/stat.php'),
];
});
}
Теперь у нас обновляется наш partial stat.php в наш id stat.
Опубликовано 5 мая 2024 г. в категориях: Winter CMS October CMS
Если Вам необходимо внедрить данную разработку на свой проект, свяжитесь со мной, обсудим цену и срок.