Tworzenie pdf

Generuję losowo dane, następnie przekazuje je do widoku gdzie są wyświetlane.

Jak mało jest danych przekazuję je za pomocą formularza do akcji w której generowany jest pdf.

Wygląda to tak:


<?php

    $form = ActiveForm::begin([

        'id' => 'form',

        'options' => ['class' => 'form-horizontal text-center'],

        'method' => 'post',

        'action' => ['/form/pdf'],

    ]);?>


    <?php foreach($wynk as $a => $<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' />{ ?>

        <input type="hidden" name="<?= $a ?>" value="<?= $b ?>">

    <?php }?>


    <div class="form-group text-center">

        <div class="col-lg-offset-1 col-lg-11">

            <?= Html::submitButton('PDF', ['class' => 'btn btn-success']) ?>

        </div>

    </div>


    <?php ActiveForm::end(); ?>

Akcja tworząca pdf:


public function actionPDF()

    {

        $request = Yii::$app->request;

        $wynik = $request->post();


        $mpdf = new mPDF;

        $mpdf->WriteHTML($this->renderPartial('pdf_', ['wynik'=>$wynik]));

        $mpdf->Output('pdf.pdf', 'D');

        exit;

    }

Działa to dla małej ilości danych. Problem jest gdy danych jest wiele i są tablice w tablicy.

Co chcę uzyskać?

Chodzi mi jak kod tworzący pdf zawrzeć razem w jednej akcji tak, aby z wygenerowanych danych wyświetlić widok, ale został również utworzony pdf i przekazany do widoku do pobrania po naciśnięciu przycisku, albo jakoś inaczej. Nie wiem jak to rozwiązać.

Do pdf’ów używam mpdf.

Nie wiem czy przedstawiłem to zrozumiale, jak nie to proszę dopytywać.

Najlepiej to było by mi tak jak robię to do tej pory czyli przycisk, tylko nie jestem wstanie przekazać tak dużej ilości informacji.

Przenieść tworzenie pdf do widoku i na podstawie zmiennych z widoku generować pdf’a?

Generalnie myślę w jaki sposób w będąc już w widoku wywołać funkcję renderującą kolejny widok np. po naciśnięciu przycisku?

Witaj,

Zostawiłbym to mniej więcej tak jak jest, oddzielna akcja do generowania PDF i oddzielna akcja do generowania strony z formularzem. Rozdzielone elementy łatwiej będzie ci prowadzić.Akcja actionPDF nie potrzebuje generować widoku a jedynie trochę więcej logiki przyjmowania i zwracania danych.

Jeżeli komunikacja między tymi elementami szwankuje to F12 (jeżeli masz mozille) i przeanalizuj zapytanie i odpowiedź w Sieci.

Nie używałbym ukrytych inputów do przenoszenia informacji. Do actionPDF możesz wysłać informacje na wiele sposobów. Np akcjaPDF może pobierać potrzebne dane ze źródła. A z formularza brać tylko to co ma wpisać człowiek.

To tak jakby budować za każdym razem ciężarówkę żeby towar do sklepu wysłać. W twoim przypadku zrobiłbym tak

Akcja generująca formularz zwraca dane do formularza:


return $this->render('widokFormularza', ['wynk' => $wynk,])

A formularz może wysyłać dane nie do domyślnego kontrolera/ackji tylko tak jak im ustawisz np ‘action’ => [‘controller/actionPDF’],

Osobiście to bym zrobił jeszcze inaczej :

Po kliknięciu na button (tylko sam guzik bez formularza) uruchamia się akcja jQuery wysyłająca zapytanie ajax na wskazany adres akcji actionPDF (bo nawet jej mało brakuje aby przyjmować request AJAX)a on zwraca plik do pobrania.

Możliwe że jest jeszcze inne rozwiązanie bo nigdy nie wykonałem czegoś takiego w praktyce.

Dzięki za odpowiedź, właśnie takich przemyśleń potrzebowałem.

Dobry pomysł z tym, aby samego pdfa tworzyć już na etapie akcji pierwszego kontrolera a późnej tylko wywoływać akcję do jego pobrania.

Wykombinowałem również, aby duże ilości danych zapisywać sobie w sesji, potem tylko je odczytuje i generuje na podstawie tego pdf’a.