Генерация PDF из GridView

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Генерация PDF из GridView

Сообщение dintro »

Пытаюсь создать PDF-файл по данным из CGridView. В качестве расширения выбрал tcpdf.
Вот мой экшн:

Код: Выделить всё

public function actionPrint($id) {
    
    $model=Deps::model()->findAll($department);

        $pdf = Yii::createComponent('application.extensions.tcpdf.ETcPdf', 'P', 'cm', 'A6', true, 'UTF-8');
        $pdf->SetCreator(PDF_CREATOR);
        $pdf->SetAuthor("Author Here");
        $pdf->SetTitle("Title Here");
        $pdf->SetSubject("TCPDF Tutorial");
        $pdf->SetKeywords("TCPDF, PDF, example, test, guide");
        $pdf->setPrintHeader(false);
        $pdf->setPrintFooter(false);
        $pdf->AddPage();
        $pdf->SetFont("times_", "", 14);
        
        $tbl = "" . date('d.m.Y', time()) . "<br><br>";
        $tbl .= '<table style="border:1px solid #000000; padding: 8px;"><tbody><tr bgcolor="#cccccc"><th ><strong>Пользователь</strong></th><th><strong>Отделение</strong></th><th><strong>Док</strong></th><th><strong>Дата</strong></th><th ><strong>Время</strong></th><th ><strong>Номер</strong></th></tr>';
        $tbl .= "<tr><td>";
        $tbl .= "{$model->user_id}";
        $tbl .= "</td><td>";
        $tbl .= "{$model->deps_id}";
        $tbl .= "</td><td>";
        $tbl .= "{$model->staff_id}";
        $tbl .= "</td><td>";
        $tbl .= "{$model->meetdate}";
        $tbl .= "</td><td>";
        $tbl .= "{$model->meettime}";
        $tbl .= "</td><td>";
        $tbl .= "{$model->office_num}";
        $tbl .='</td></tr></tbody></table>'; 
            
        $pdf->writeHTML($tbl, true, true, false, false, '');
        $pdf->Output("example.pdf", "I");

    }
Вот кнопка для генерации PDF:

Код: Выделить всё

...
array(
            'class'=>'CButtonColumn',
            'template' => '{print}',
            'buttons'=>array(
                        'print' => array(
                                'label'=>'PDF', // text label of the button
                                'url'   => 'Yii::app()->createUrl("admin/mednotes/print")'
                                ),
                                //'imageUrl'=>'/path/to/copy.gif',  // image URL of the button. If not set or false, a text link is used
                                'options' => array('class'=>'print'), // HTML options for the button
                        ),
                ),
                ...

При нажатии на "Распечатать" выдает ошибку "Error 400 Некорректный запрос."
Делаю по примеру, который видел здесь, на форуме.
Не могу понять, что не так делаю.
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Re: Генерация PDF из GridView

Сообщение dintro »

Генерация самого PDF уже проходит успешно, но вот данные в таблице не отображаются. Просто пустая таблица с наименованиями столбцов: "Отделение", "Док" и т.д.
Из-за чего это может быть? Буду рад выслушать советы.
Аватара пользователя
valentinich
Сообщения: 171
Зарегистрирован: 2014.03.25, 13:58

Re: Генерация PDF из GridView

Сообщение valentinich »

Что ожидаете получить в $model, если переменная $department не определена?
Тяжела и неказиста жизнь простого программиста :|
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Re: Генерация PDF из GridView

Сообщение dintro »

Извиняюсь, что не привел исправленный код. Генерируется сейчас чистая таблица в PDF след. образом:

Код: Выделить всё

public function actionCreatePdf()
        {
            $model=Mednotes::model()->findAll();

            $pdf = Yii::createComponent('application.extensions.tcpdf.ETcPdf', 'L', 'cm', 'A5', true, 'UTF-8');
            $pdf->SetCreator(PDF_CREATOR);
            $pdf->SetAuthor("Nicola Asuni");
            $pdf->SetTitle("Документ");
            $pdf->SetSubject("TCPDF Tutorial");
            $pdf->SetKeywords("TCPDF, PDF, example, test, guide");
            $pdf->setPrintHeader(false);
            $pdf->setPrintFooter(false);
            $pdf->AddPage();
            $pdf->SetFont('dejavusans', " ", 10);
            
            //$tbl = "" . date('d.m.Y', time()) . "<br><br>";
            $tbl .= '<table style="border:1px solid #000000; padding: 8px;"><tbody><tr bgcolor="#cccccc"><th ><strong>Пользователь</strong></th><th><strong>Отдел</strong></th><th><strong>Док</strong></th><th><strong>Дата</strong></th><th><strong>Время</strong></th><th><strong>Кабинет</strong></th></tr>';
            $tbl .= "<tr><td>";
            $tbl .= "{$model->user_id}";
            $tbl .= "</td><td>";
            $tbl .= "{$model->deps_id}";
            $tbl .= "</td><td>";
            $tbl .= "{$model->staff_id}";
            $tbl .= "</td><td>";
            $tbl .= "{$model->meetdate}";
            $tbl .= "</td><td>";
            $tbl .= "{$model->meettime}";
            $tbl .= "</td><td>";
            $tbl .= "{$model->office_num}";
            $tbl .='</td></tr></tbody></table>'; 
                
            $pdf->writeHTML($tbl, true, true, false, false, '');
            $pdf->Output("example_002.pdf", "I");
        } 
Аватара пользователя
valentinich
Сообщения: 171
Зарегистрирован: 2014.03.25, 13:58

Re: Генерация PDF из GridView

Сообщение valentinich »

findAll возвращает массив http://www.yiiframework.com/doc/api/1.1 ... All-detail
Тяжела и неказиста жизнь простого программиста :|
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Re: Генерация PDF из GridView

Сообщение dintro »

Понял, разобрался! Спасибо за толчок в нужном направлении. Генерирует все отлично.
Но вот еще хотелось бы узнать. У меня в CGridView (из которого, собственно, и генерится PDF) много записей, а для генерации выбирается только первая запись. В самом gridView у меня есть колонка с CCheckBox. Как сделать чтобы генерировались только выбранные записи?
Вот, кстати, код исправленного экшена:

Код: Выделить всё

public function actionCreatePdf()
        {
            $model=Mednotes::model()->find();

            $pdf = Yii::createComponent('application.extensions.tcpdf.ETcPdf', 'L', 'cm', 'A5', true, 'UTF-8');
            $pdf->SetCreator(PDF_CREATOR);
            $pdf->SetAuthor("Nicola Asuni");
            $pdf->SetTitle("Документ PDF");
            $pdf->SetSubject("TCPDF Tutorial");
            $pdf->SetKeywords("TCPDF, PDF, example, test, guide");
            $pdf->setPrintHeader(true);
            $pdf->setPrintFooter(false);
            $pdf->AddPage();
            $pdf->SetFont('dejavusans', " ", 17);
            
            $tbl = "ДОКУМЕНТ" . "<br><br>"; //. date('d.m.Y', time()) . "<br><br>";
            $tbl .= '<tbody> <li><b>Юзер</b>:';
            $tbl .= "{$model->user->fullname}";
            $tbl .= '</li>';
            $tbl .= '<p>';
            $tbl .= '<tbody> <li><b>Отдел</b>:';
            $tbl .= "{$model->deps->department}";
            $tbl .= '</li>';
            $tbl .= '<p>';
            $tbl .= '<tbody> <li><b>Док</b>:';
            $tbl .= "{$model->staff->fullname}";
            $tbl .= '</li>';
            $tbl .= '<p>';
            $tbl .= '<tbody> <li><b>Дата</b>:';
            $tbl .= "{$model->meetdate}";
            $tbl .= '</li>';
            $tbl .= '<p>';
            $tbl .= '<tbody> <li><b>Время</b>:';
            $tbl .= "{$model->meettime}";
            $tbl .= '</li>';
            $tbl .= '<p>';
            $tbl .= '<tbody> <li><b>Кабинет</b>:';
            $tbl .= "{$model->office_num}";
            $tbl .= '</li>';
            $tbl .='</tbody>';
                
            $pdf->writeHTML($tbl, true, true, false, false, '');
            $pdf->Output("example_002.pdf", "I");
        }
Аватара пользователя
valentinich
Сообщения: 171
Зарегистрирован: 2014.03.25, 13:58

Re: Генерация PDF из GridView

Сообщение valentinich »

Отправляете id выбранных записей на сервер, находите массив нужных моделей, проходите циклом по этому массиву и формируете HTML для генерации.
Тяжела и неказиста жизнь простого программиста :|
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Re: Генерация PDF из GridView

Сообщение dintro »

пробую делать, но теперь вообще просто элементы списка только выводятся, без данных
Аватара пользователя
vovasit91
Сообщения: 98
Зарегистрирован: 2015.01.08, 17:43

Re: Генерация PDF из GridView

Сообщение vovasit91 »

Вы же получаете записи с помощью Mednotes::model()->find(); поэтому одна запись только и выбиралась из базы.
Формируйте массив выбраных чекпоинтами айдишек, а затем тем же Mednotes::model()->findAll(); (с ALL вконце) получаете массив записей и foreach'em генерируете каждую строку для pdf
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Re: Генерация PDF из GridView

Сообщение dintro »

vovasit91 писал(а):Вы же получаете записи с помощью Mednotes::model()->find(); поэтому одна запись только и выбиралась из базы.
Формируйте массив выбраных чекпоинтами айдишек, а затем тем же Mednotes::model()->findAll(); (с ALL вконце) получаете массив записей и foreach'em генерируете каждую строку для pdf
Как сформировать массив именно с выбранными полями чек-боксов, разъясните пожалуйста. У меня просто есть похожий CgriDView и там тоже подобная задача реализована (действия с выбранными чек-боксами), я пытался делать по тому примеру, но ничего не получается. Уже несколько дней сижу с этой проблемой.
Аватара пользователя
vovasit91
Сообщения: 98
Зарегистрирован: 2015.01.08, 17:43

Re: Генерация PDF из GridView

Сообщение vovasit91 »

Скиньте код представления в котором лежит этот CGridView в тему
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Re: Генерация PDF из GridView

Сообщение dintro »

index.php (с самим CGridView)

Код: Выделить всё

<?php

$this->menu=array(
    array('label'=>'Добавить запись', 'url'=>array('create')),
);

Yii::app()->clientScript->registerScript('search', "
$('.search-button').click(function(){
    $('.search-form').toggle();
    return false;
});
$('.search-form form').submit(function(){
    $('#mednotes-grid').yiiGridView('update', {
        data: $(this).serialize()
    });
    return false;
});
");
?>

<h1>Журнал</h1>

<?php echo CHtml::link('Расширеный поиск','#',array('class'=>'search-button')); ?>
<div class="search-form" style="display:none">
<?php $this->renderPartial('_search',array(
    'model'=>$model,
)); ?>
</div><!-- search-form -->

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'mednotes-grid',
    'selectableRows'=>2,
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    //'afterAjaxUpdate' => 'reinstallDatePicker',
    'columns'=>array(
        'id',
        array(
        'class'=> 'CCheckBoxColumn',
        'id'=> 'user_id'
        ),
        'user_id' => array(
            'name' => 'user_id',
            'value' => '$data->user->name . " " . $data->user->fname . " " .$data->user->lastname',
            'filter' => User::all(),
        ),
        'deps_id' => array(
            'name' => 'deps_id',
            'value' => '$data->deps->department',
            'filter' => Deps::all(),
        ),
        'staff_id' => array(
            'name' => 'staff_id',
            'value' => '$data->staff->firstname . " " . $data->staff->fathername . " " .$data->staff->lastname',
            'filter' => Staff::all(),
        ),
        'meetdate' => array(
            'name' => 'meetdate',
            'value'=>'date("d-m-Y",strtotime($data->meetdate))',
        ),
        'meettime',
        'office_num',
        array(
            'class'=>'CButtonColumn',
             ),

        ),
)); ?>

<?php
    echo CHtml::form();
    echo CHtml::link('Создать PDF', array('mednotes/createpdf'));
?>
<?php
    echo CHtml::endForm();
?>
Аватара пользователя
vovasit91
Сообщения: 98
Зарегистрирован: 2015.01.08, 17:43

Re: Генерация PDF из GridView

Сообщение vovasit91 »

Код не напишу, но дам толчок в нужном направлении.
1)Формой нужно обернуть весь грид. Тоесть вот так должно быть на код грида не смотрите(у себя проверял), но смысл остается тем же.

Код: Выделить всё

<?php echo CHtml::form('/mednotes/createpdf');
$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'mednotes-grid',
    'selectableRows'=>2,
    'dataProvider'=>new CSqlDataProvider('SELECT * FROM `sp_post`'),
    //'afterAjaxUpdate' => 'reinstallDatePicker',
    'columns'=>array(
        'id',
        array(
            'class'=> 'CCheckBoxColumn',
            'id'=> 'author_id'
        ),
        'user_id' => array(
            'name' => 'author_id',
            'value' => '$data["author_id"]',
        ),
    ),
));
echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save');
echo CHtml::endForm();
?>
2)Ошибка это то что должна быть не ссылка ака "Сохранить" а SubmitButton(как в примере выше)

Код: Выделить всё

echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save');
3) После этих манипуляций результат сабмита станет доступный в $_POST того экшена куда отправляет форма

Код: Выделить всё

CHtml::form('/mednotes/createpdf')

вот в таком виде (естественно с вашими полями и т.д.)

Код: Выделить всё

array
  'author_id' => 
    array
      0 => string '1' (length=1)
      1 => string '2' (length=1)
  'yt0' => string 'Save' (length=4) 
А отсюда уже я думаю вы справитесь сделать строчку для IN sql. К примеру один из вариантов. Но тут все зависит от того как именно вы с БД работаете

Код: Выделить всё

$some_values = array(1,2,3,4,5);
$criteria = new CDbCriteria();
$criteria->addInCondition('z',$some_values);

$sql = 'SELECT x FROM y WHERE '.$criteria->condition;
$command = Yii::app()->db->createCommand($sql);
$results = $command->queryAll(true, $criteria->params)
Аватара пользователя
dintro
Сообщения: 30
Зарегистрирован: 2015.02.12, 22:27

Re: Генерация PDF из GridView

Сообщение dintro »

Спасибо. Буду разбираться
Ответить