Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,10 @@ class ReportController extends AbstractActionController
public function monthlyReportPdfAction()
{
$pdf = new PdfModel();
$pdf->setOption('fileName', 'monthly-report'); // Triggers PDF download, automatically appends ".pdf"
$pdf->setOption('paperSize', 'a4'); // Defaults to "8x11"
$pdf->setOption('paperOrientation', 'landscape'); // Defaults to "portrait"
$pdf->setOption('fileName', 'monthly-report'); // "pdf" extension is automatically appended
$pdf->setOption('display', PdfModel::DISPLAY_ATTACHMENT); // Triggers browser to prompt "save as" dialog
$pdf->setOption('paperSize', 'a4'); // Defaults to "8x11"
$pdf->setOption('paperOrientation', 'landscape'); // Defaults to "portrait"

// To set view variables
$pdf->setVariables(array(
Expand Down
7 changes: 6 additions & 1 deletion src/DOMPDFModule/View/Model/PdfModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@

class PdfModel extends ViewModel
{
const DISPLAY_INLINE = 'inline';
const DISPLAY_ATTACHMENT = 'attachment';
const DEFAULT_FILE_NAME = 'untitled.pdf';

/**
* Renderer options
* @var array
Expand All @@ -31,7 +35,8 @@ class PdfModel extends ViewModel
'paperSize' => '8x11',
'paperOrientation' => 'portrait',
'basePath' => '/',
'fileName' => 'untitled.pdf'
'fileName' => self::DEFAULT_FILE_NAME,
'display' => self::DISPLAY_INLINE
);

/**
Expand Down
29 changes: 15 additions & 14 deletions src/DOMPDFModule/View/Strategy/PdfStrategy.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,26 +108,27 @@ public function injectResponse(ViewEvent $event)
}

$result = $event->getResult();

if (!is_string($result)) {
// @todo Potentially throw an exception here since we should *always* get back a result.
// No output to display. Good bye!
return;
}

$response = $event->getResponse();
$response->setContent($result);
$response->getHeaders()->addHeaderLine('content-type', 'application/pdf');

$fileName = $event->getModel()->getOption('fileName');
if (isset($fileName)) {
if (substr($fileName, -4) != '.pdf') {
$fileName .= '.pdf';
}

$response->getHeaders()->addHeaderLine(
'Content-Disposition',
'attachment; filename=' . $fileName
);

$model = $event->getModel();
$options = $model->getOptions();

$fileName = $options['fileName'];
$dispositionType = $options['display'];

if (substr($fileName, -4) != '.pdf') {
$fileName .= '.pdf';
}

$headerValue = sprintf('%s; filename="%s"', $dispositionType, $fileName);

$response->getHeaders()->addHeaderLine('Content-Type', 'application/pdf');
$response->getHeaders()->addHeaderLine('Content-Disposition', $headerValue);
}
}
5 changes: 5 additions & 0 deletions tests/DOMPDFModuleTest/View/Model/PdfModelTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ public function testItHasDefaultFileName()
$this->assertEquals('untitled.pdf', $this->model->getOption('fileName'));
}

public function testItHasDefaultDisplayOption()
{
$this->assertEquals(PdfModel::DISPLAY_INLINE, $this->model->getOption('display'));
}

public function testItIsTerminal()
{
$this->assertTrue($this->model->terminate());
Expand Down
34 changes: 29 additions & 5 deletions tests/DOMPDFModuleTest/View/Strategy/PdfStrategyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public function testDoesNotRenderPdfWhenResultIsNotString()
$this->assertNull($result);
}

public function testContentTypeResponseHeader()
public function testItAddsApplicationPdfContentType()
{
$model = new PdfModel();
$model->setTemplate('basic.phtml');
Expand All @@ -103,19 +103,20 @@ public function testContentTypeResponseHeader()
$this->strategy->injectResponse($this->event);

$headers = $this->event->getResponse()->getHeaders();
$contentTypeHeader = $headers->get('content-type');
$contentTypeHeader = $headers->get('Content-Type');

$this->assertInstanceOf('Zend\Http\Header\ContentType', $contentTypeHeader);
$this->assertEquals($contentTypeHeader->getFieldValue(), 'application/pdf');

ob_end_flush(); // Clear out any buffers held by renderers.
}

public function testResponseHeadersWithFileName()
public function testItAddsAttachmentDispositionType()
{
$model = new PdfModel();
$model->setTemplate('basic.phtml');
$model->setOption('fileName', 'testPdfFileName');
$model->setOption('display', PdfModel::DISPLAY_ATTACHMENT);

$this->event->setModel($model);
$this->event->setResponse($this->response);
Expand All @@ -124,11 +125,34 @@ public function testResponseHeadersWithFileName()

$this->strategy->injectResponse($this->event);

$headers = $this->event->getResponse()->getHeaders();
$headers = $this->event->getResponse()->getHeaders();
$contentDisposition = $headers->get('Content-Disposition');

$this->assertInstanceOf('Zend\Http\Header\ContentDisposition', $contentDisposition);
$this->assertEquals($contentDisposition->getFieldValue(), 'attachment; filename=testPdfFileName.pdf');
$this->assertEquals($contentDisposition->getFieldValue(), 'attachment; filename="testPdfFileName.pdf"');

ob_end_flush(); // Clear out any buffers held by renderers.
}

public function testItAddsInlineDispositionType()
{
$model = new PdfModel();
$model->setTemplate('basic.phtml');
$model->setOption('fileName', 'testPdfFileName');
$model->setOption('display', PdfModel::DISPLAY_INLINE);

$this->event->setModel($model);
$this->event->setResponse($this->response);
$this->event->setRenderer($this->renderer);
$this->event->setResult($this->renderer->render($model));

$this->strategy->injectResponse($this->event);

$headers = $this->event->getResponse()->getHeaders();
$contentDisposition = $headers->get('Content-Disposition');

$this->assertInstanceOf('Zend\Http\Header\ContentDisposition', $contentDisposition);
$this->assertEquals($contentDisposition->getFieldValue(), 'inline; filename="testPdfFileName.pdf"');

ob_end_flush(); // Clear out any buffers held by renderers.
}
Expand Down