2013-06-19 60 views
0

我有一個Web應用程序,它使用CGridView根據用戶輸入的搜索參數顯示來自$模型的過濾數據。Yii - 將CGridView數據過濾爲PDF格式

我的目標是讓用戶能夠點擊按鈕將過濾後的數據導出爲PDF。

爲了做到這一點,我使用擴展yii-pdf.

我需要通過存儲在CActiveDataProvider陣列中的信息在一個單獨的控制器和視圖的創建PDF使用?

使用相同的控制器/操作並將數據呈現到可以導出到PDF的視圖中似乎更容易。但是,唉,我無法弄清楚如何做到這一點。

在此先感謝。

_search檢視:

<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 */ 
    ), 
)); 
?> 
+2

至於我記得你需要先渲染這個文件將html傳遞給pdf。那麼問題是什麼?在CGridview中製作按鈕來導出pdf並執行'$ this_renderpartial('mypdfview',array('dataProvider'=> $ dataProvider))'或渲染,甚至可以製作'renderInternal'。然後將其改爲pdf。 – ineersa

回答

3

你是非常接近的解決方案,我會寫在這裏,你可以使用的邏輯。

  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/

+0

謝謝@Eduardo。我現在正在處理這件事,會讓你知道它是如何發生的。 – DaveyLaser

+0

好的!這讓我朝着正確的方向前進。我在你建議的解決方案中做了幾處修改,以顯示最終爲我工作的結果。謝謝! – DaveyLaser

+0

很酷,很開心這個作品!感謝您的編輯。 :-) –