Yii - передать отфильтрованные данные CGridView в формат PDF

У меня есть веб-приложение, которое использует CGridView для отображения отфильтрованных данных из $model на основе введенных пользователем параметров поиска.

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

Для этого я использую расширение yii-pdf.

Нужно ли передавать информацию, хранящуюся в массиве CActiveDataProvider, для использования в отдельном контроллере и представлении для создания PDF?

Кажется, проще использовать тот же контроллер/действие и отображать данные в виде, который затем можно экспортировать в PDF. Но, увы, я не могу понять, как это сделать.

Заранее спасибо.

_поисковое представление:

<div class="wide form"> 
<?php 
     $form = $this->beginWidget('GxActiveForm', array(
    'action' => Yii::app()->createUrl($this->route),
    'method' => 'get',
    )); 
?>                
  <!-- Search Fields here -->    
  <!-- Search and Export to PDF buttons -->
  <div class="row buttons">
      <?php echo GxHtml::submitButton(Yii::t('app', 'Search')); ?>
      <?php echo GxHtml::button(Yii::t('app', 'PDF'),  array('id' => 'exportToPdf')); ?>
  </div>    
<?php $this->endWidget(); ?>   
</div><!-- search-form -->

просмотр_pdf

<div class="pdfContainer" id="pdfPage">    
  <div class="pdfHeader">
    <img src="images/logo.png" style="float:left; text-align: top;"></img>
    <div class="pdfTitle" style="text-align: right; float: right;">                    
       <h3>Service Report</h3>                    
    </div>
  </div><!-- header -->    
  <?php echo "Prepared by: ".Yii::app()->user->name."\n" ?>           
  <?php **//Possibly echo contents here?** ?>   
  <div class="clear"></div>    
    <div class="pdfFooter">         
    </div><!-- footer -->    
  </div><!-- page -->
</div>

контроллер/действие

public function actionPdf(){       
    $this->layout='pdf';
    /* mPDF */
    $mPDF1 = Yii::app()->ePdf->mpdf();

    /* render (full page) */
    $mPDF1->WriteHTML($this->render('pdf', array(), true));

    /* renderPartial (only 'view' of current controller) */
    $mPDF1->WriteHTML($this->renderPartial('pdf', array(), true));

    /* Outputs ready PDF */
    $mPDF1->Output();      
}

Вид администратора:

<?php        
Yii::app()->clientScript->registerScript('search', "       
   $('#exportToPdf').click(function(){
   window.location = '". $this->createUrl('Weeklyservicereport/pdf') . "?' + $(this).parents('form').serialize() + '&export=true';
   return false;
});           

$('.search-form form').submit(function(){
    $('#weeklyservicereport-grid').yiiGridView('update', {
        data: $(this).serialize()
    });
    return false;
    });
    ");
?>
<div class="search-form" style="display:block">               
    <?php $this->renderPartial('_search', array('model' => $model,)); ?>           
</div> <!-- Search Form -->
/* Gridview Widget */  
<?php $this->widget('application.components.widgets.tlbExcelView', array(
    'id'            => 'weeklyservicereport-grid',
    'dataProvider'  => $model->search(),
     .....
     .....
    'columns'=>array(
        /* Column names */
    ),
 )); 
?>

person davepmiller    schedule 19.06.2013    source источник
comment
Насколько я помню, вам нужно сначала отрендерить этот файл, а затем передать html в pdf. Так в чем проблема? Сделайте кнопку в CGridview, чтобы экспортировать pdf и сделать $this_renderpartial('mypdfview', array('dataProvider'=>$dataProvider)) или сделать рендер, или даже вы можете сделать renderInternal. Затем преобразовать его в pdf.   -  person ineersa    schedule 20.06.2013


Ответы (1)


Вы довольно близки к решению, я напишу здесь логику, которую вы можете использовать.

  1. Создайте представление для вашего заголовка PDF;
  2. Создайте представление для нижнего колонтитула PDF;
  3. Создайте представление для вашего Gridview;

представление: _pdf_header.php

<div class="pdfHeader">
  <img src="images/logo.png" style="float:left; text-align: top;"></img>
  <div class="pdfTitle" style="text-align: right; float: right;">                    
     <h3>Service Report</h3>                    
  </div>
</div>

вид: _pdf_footer.php

<div class="pdfFooter">
  <h5>Your Footer Page</h5>
</div>

представление: _gridview.php

<?php $this->widget('application.components.widgets.tlbExcelView', array(
    'id'            => 'weeklyservicereport-grid',
    'dataProvider'  => $dataProvider,
    'columns'       => array( /*YOUR COLUMNS */   ),
));
?>

В вашем actionPdf вы просто отображаете частичные представления, как это было предложено @ineersa:

public function actionPdf(){      

    $this->layout      = 'pdf';
    $model             = new Model();
    $model->attributes = $_GET['Model']; /* to execute the filters (if is the case) */
    $dataProvider      = $model->search();

    /* if yu want to ignore the pagination and retrieve all records */
    $dataProvider->pagination = false; 

    $mPDF1 = Yii::app()->ePdf->mpdf();

    $mPDF1->WriteHTML($this->renderPartial('_pdf_header', array(), true));

    $mPDF1->WriteHTML($this->renderPartial('_gridview', array('dataProvider' => $dataProvider), true));

    $mPDF1->WriteHTML($this->renderPartial('_pdf_footer', array(), true));

    $mPDF1->Output();      
}

Ссылка:

http://www.yiiframework.com/forum/index.php/topic/15677-printing-a-cgridview/

person Eduardo M    schedule 26.06.2013
comment
Спасибо @Эдуардо. Я работаю с этим прямо сейчас, дам вам знать, как это происходит. - person davepmiller; 27.06.2013
comment
Ok! Это заставило меня двигаться в правильном направлении. Я внес пару правок в предложенное вами решение, чтобы показать, что в итоге сработало для меня. Спасибо! - person davepmiller; 27.06.2013