Laravel - Как получить входные данные и передать их из одного представления в другое (Mpdf)

У меня есть фильтр диапазона дат в моем представлении отчетов, поэтому, когда пользователь нажимает кнопку загрузки, он должен передавать выбранные даты в представление PDF.

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

Как передать эти входные данные в другое представление?

Я должен передать переменную $from и $to как из функций индекса, так и из функций фильтрации.

Я пробовал много способов, но ни один из них не работает :(

Любое предложение?

Вот коды :(

Контроллер

 public function index(Request $request){
 $startDate = Carbon::now();
        $from = $startDate->firstOfMonth()->format('Y-m-d');
        $to = Carbon::now()->format('Y-m-d');

 return view('Reports.index',compact('from','to');
}

 public function filter(Request $request)
    {
        $from = Carbon::parse($request->input('datepicker_from'))->format('Y-m-d');
        $to = Carbon::parse($request->input('datepicker_to'))->format('Y-m-d');

  return view('Reports.index',compact('from','to');
}

public function print()
    {
        $pdf = PDF::loadView('Reports.reportPDF');
        return $pdf->stream('my.pdf', array('Attachment' => 0));
    }

Интернет

Route::get('print', 'reportController@print')->name('Reports.reportPDF');

Просмотры

<a href="{{ route('Reports.reportPDF') }}" target="_blank"><button class="btn btn-success" title="Download PDF" data-toggle="tooltip"><i class="fa fa-download"></i></button></a>

person Suvin94    schedule 20.12.2019    source источник
comment
вы используете Barryvdh\DomPDF ??   -  person Hamelraj    schedule 20.12.2019
comment
Нет, я использую Meneses\LaravelMpdf\Facades\LaravelMpdf   -  person Suvin94    schedule 20.12.2019
comment
передать параметры фильтрации в функцию печати или создать функцию фильтрации, которая используется как в filter(), так и в print()   -  person Kamran    schedule 20.12.2019
comment
@Kamran, можете ли вы привести какой-либо пример в разделе «Ответ»?   -  person Suvin94    schedule 20.12.2019
comment
@ Suvin94 что-то вроде это, а также переход к и от URL-запроса в вашей ссылке для печати или якоре   -  person Kamran    schedule 20.12.2019
comment
@Kamran, братан, твой код работает, но он не получает ввод из предыдущего представления, вместо этого он показывает сегодняшнюю дату как для переменной from, так и для переменной.   -  person Suvin94    schedule 23.12.2019
comment
Почему бы вам не передать две переменные в качестве параметров для функции PDF?   -  person ashanrupasinghe    schedule 23.12.2019


Ответы (3)


Передайте две переменные в просмотр PDF.

public function print($from,$to)
    {
        $pdf = PDF::loadView('Reports.reportPDF',['from'=>$from,'to'=>$to]);
        return $pdf->stream('my.pdf', array('Attachment' => 0));
    }

Интернет

Route::get('print', 'reportController@print/{from}/{to}')->name('Reports.reportPDF');

Просмотры

<a href="{{ route('Reports.reportPDF',[$from,$to]) }}" target="_blank"><button class="btn btn-success" title="Download PDF" data-toggle="tooltip"><i class="fa fa-`download"></i></button></a>
person ashanrupasinghe    schedule 23.12.2019
comment
Эй, я получаю сообщение об ошибке Метод App\Http\Controllers\reportController::print/{from}/{to} не существует - person Suvin94; 23.12.2019
comment
Я также изменил ваш код Route::get('/print2', 'reportController@print/{from}/{to}')-›name('Reports.reportPDF,[$from,$to]'); - person Suvin94; 23.12.2019
comment
Вот ссылка после нажатия кнопки печати ''localhost/print2/%7B$ с %7D/%7B$до %7D'' - person Suvin94; 23.12.2019
comment
если вы изменили имя метода на print2, вам не нужно передавать переменные в имя маршрута. вместо имени('Отчеты.reportPDF,[$from,$to]'); вы можете использовать имя ('Reports.reportPDF2'). вроде у других все нормально. но если вы сделали все правильно, ваш URL-адрес не должен быть таким. Он должен передавать правильные значения через URL-адрес. - person ashanrupasinghe; 23.12.2019

Я достиг этого, используя Session. Большое спасибо :)

Отчет.blade.php

@php(session(['to' =>  $to, date('Y-m-d')]))
@php(session(['from' =>  $from, date('Y-m-d')]))

PDF.blade.php

Showing Report From:
{{ Carbon\Carbon::parse(request()->session()->get('from'))->formatLocalized('%d %b %Y') }}
To:
{{ Carbon\Carbon::parse(request()->session()->get('to'))->formatLocalized('%d %b %Y') }}
person Suvin94    schedule 23.12.2019

Ну, проблема в том, что вы делаете это не совсем правильно.

Есть несколько вариантов:

  • Сделайте так, чтобы действие print принимало параметры.

  • Сделайте так, чтобы действие index принимало параметры и параметр, который помечается для загрузки (если параметр приходит, то вашим ответом будет загрузка PDF)

  • Используйте сеанс, как вы это делали.

Для меня подходящим способом было бы заставить print действие принимать параметры. Использование сеанса несколько неясно, и его будет сложно поддерживать.

Итак, резюмируя, вот что я рекомендую:

  • Действие index или view с фильтром диапазона дат.

  • Действие download с фильтром диапазона дат. (в основном тот же ввод, что и действие view). Конечно, при нажатии кнопки вы должны использовать JavaScript для сбора ввода диапазона дат, отображаемого в данный момент пользователю, а затем выполнять вызов AJAX для действия download.

Это самое чистое решение, позволяющее избежать жесткой привязки к сеансу, а также более читабельное и понятное.

person JorgeeFG    schedule 23.12.2019