#php #laravel #graph #admin #laravel-backpack
#php #laravel #График #администратор #laravel-рюкзак
Вопрос:
пожалуйста, не оставляйте мне отрицательные отзывы, спасибо
в Laravel Backpack admin, когда мы нажимаем на фильтры диапазона дат, он фильтрует данные нашей таблицы, которые работают нормально, но я хочу, чтобы график также менялся при смене фильтров ajax.
насколько я знаю, код фильтра диапазона дат ajax в CrudConTroller :
$this->crud->addFilter([
'type' => 'date_range',
'name' => 'created_at',
'label' => 'Date range'
],
false,
function ($value) { // if the filter is active, apply these constraints
$dates = json_decode($value);
$this->crud->addClause('where', 'created_at', '>=', $dates->from);
$this->crud->addClause('where', 'created_at', '<=', $dates->to . ' 23:59:59');
});
и график появляется в виджете, файле шаблонов блейда: list.blade.php .
$widgets['before_content'][] = [
'type' => 'div',
'class' => 'row',
'content' => [ // widgets
[
'type' => 'chart',
'wrapperClass' => 'mt-4 col-md-12',
// 'class' => 'col-md-12',
'controller' => AppHttpControllersAdminChartsUserChartController::class,
'content' => [
'header' => 'New Users', // optional
'body' => 'This chart should make it obvious', // optional
]
],
],
]
Комментарии:
1. Существует множество решений, которые вы можете использовать php для генерации графика вместо шаблона. Смотрите соответствующий раздел в. Документация. Затем используйте параметр запроса для фильтрации данных для графика. Я попытаюсь опубликовать пример.
2. @CastroAlhdo Большое тебе спасибо, приятель, да, я делаю это с помощью твоего метода / способа, потому что я не смог найти никакого решения в CRUD BACKPACK.
3. Добро пожаловать. я добавлю это в качестве ответа, чтобы кто-то другой мог его использовать. Не стесняйтесь также публиковать пример вашего решения.
Ответ №1:
Мне тоже нужна была именно эта вещь. Довольно банально, но то, что я сделал, это создал новый фильтр, начиная с date_range
фильтра, который вместо обновления только таблиц данных обновляет всю страницу.
Вот оно. Если вы поместите его в resources/views/vendor/backpack/crud/filters/date_range_refresh.blade.php
, вы сможете использовать date_range_refresh
вместо date_range
, как тип фильтра, и получить желаемые результаты:
{{-- Date Range Backpack CRUD filter --}}
<li filter-name="{{ $filter->name }}"
filter-type="{{ $filter->type }}"
filter-key="{{ $filter->key }}"
class="nav-item dropdown {{ Request::get($filter->name)?'active':'' }}">
<a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ $filter->label }} <span class="caret"></span></a>
<div class="dropdown-menu p-0">
<div class="form-group backpack-filter mb-0">
<div class="input-group date">
<div class="input-group-prepend">
<span class="input-group-text"><i class="la la-calendar"></i></span>
</div>
<input class="form-control pull-right"
id="daterangepicker-{{ $filter->key }}"
type="text"
@if ($filter->currentValue)
@php
$dates = (array)json_decode($filter->currentValue);
$start_date = $dates['from'];
$end_date = $dates['to'];
$date_range = implode(' ~ ', $dates);
$date_range = str_replace('-', '/', $date_range);
$date_range = str_replace('~', '-', $date_range);
@endphp
placeholder="{{ $date_range }}"
@endif
>
<div class="input-group-append daterangepicker-{{ $filter->key }}-clear-button">
<a class="input-group-text" href=""><i class="la la-times"></i></a>
</div>
</div>
</div>
</div>
</li>
{{-- ########################################### --}}
{{-- Extra CSS and JS for this particular filter --}}
{{-- FILTERS EXTRA CSS --}}
{{-- push things in the after_styles section --}}
@push('crud_list_styles')
<!-- include select2 css-->
<link rel="stylesheet" type="text/css" href="{{ asset('packages/bootstrap-daterangepicker/daterangepicker.css') }}" />
<style>
.input-group.date {
width: 320px;
max-width: 100%; }
.daterangepicker.dropdown-menu {
z-index: 3001!important;
}
</style>
@endpush
{{-- FILTERS EXTRA JS --}}
{{-- push things in the after_scripts section --}}
@push('crud_list_scripts')
<script type="text/javascript" src="{{ asset('packages/moment/min/moment.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('packages/bootstrap-daterangepicker/daterangepicker.js') }}"></script>
<script>
function applyDateRangeFilter{{$filter->key}}(start, end) {
if (start amp;amp; end) {
var dates = {
'from': start.format('YYYY-MM-DD'),
'to': end.format('YYYY-MM-DD')
};
var value = JSON.stringify(dates);
} else {
//this change to empty string,because addOrUpdateUriParameter method just judgment string
var value = '';
}
var parameter = '{{ $filter->name }}';
// behaviour for ajax table
var ajax_table = $('#crudTable').DataTable();
var current_url = ajax_table.ajax.url();
var new_url = addOrUpdateUriParameter(current_url, parameter, value);
// replace the datatables ajax url with new_url and reload it
new_url = normalizeAmpersand(new_url.toString());
ajax_table.ajax.url(new_url).load();
// add filter to URL
crud.updateUrl(new_url);
// mark this filter as active in the navbar-filters
if (URI(new_url).hasQuery('{{ $filter->name }}', true)) {
$('li[filter-key={{ $filter->key }}]').removeClass('active').addClass('active');
}
else
{
$('li[filter-key={{ $filter->key }}]').trigger('filter:clear');
}
// ---------------------------------------------------------------
// THIS is where it's different from the regular date_range filter
// ---------------------------------------------------------------
// When the filter is changed, refresh the page,
// so that the NPS widget up-top get reloaded.
document.location.reload();
}
jQuery(document).ready(function($) {
var dateRangeInput = $('#daterangepicker-{{ $filter->key }}').daterangepicker({
timePicker: false,
ranges: {
'Last Year': [moment().startOf('year').subtract(1, 'year'), moment().endOf('year').subtract(1, 'year')],
'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
'Last Week': [moment().subtract(1, 'week').startOf('week'), moment().subtract(1, 'week').endOf('week')],
'This Year': [moment().startOf('year'), moment().endOf('year')],
'This Month': [moment().startOf('month'), moment().endOf('month')],
'This Week': [moment().startOf('week'), moment().endOf('week')]
},
@if ($filter->currentValue)
startDate: moment("{{ $start_date }}"),
endDate: moment("{{ $end_date }}"),
@endif
alwaysShowCalendars: true,
autoUpdateInput: true
});
dateRangeInput.on('apply.daterangepicker', function(ev, picker) {
applyDateRangeFilter{{$filter->key}}(picker.startDate, picker.endDate);
});
$('li[filter-key={{ $filter->key }}]').on('hide.bs.dropdown', function () {
if($('.daterangepicker').is(':visible'))
return false;
});
$('li[filter-key={{ $filter->key }}]').on('filter:clear', function(e) {
// console.log('daterangepicker filter cleared');
//if triggered by remove filters click just remove active class,no need to send ajax
$('li[filter-key={{ $filter->key }}]').removeClass('active');
// ---------------------------------------------------------------
// THIS is where it's different from the regular date_range filter
// ---------------------------------------------------------------
// When the filter is changed, refresh the page,
// so that the NPS widget up-top get reloaded.
document.location.reload();
});
// datepicker clear button
$(".daterangepicker-{{ $filter->key }}-clear-button").click(function(e) {
e.preventDefault();
applyDateRangeFilter{{$filter->key}}(null, null);
})
});
</script>
@endpush
{{-- End of Extra CSS and JS --}}
{{-- ########################################## --}}
Это не красиво … но … это решение 😀
Ответ №2:
Существует множество решений, которые вы можете использовать php для генерации графика вместо шаблона. Смотрите соответствующий раздел в. Документация.
Затем используйте параметр запроса для фильтрации данных для графика. Я попытаюсь опубликовать пример.