#274: Page breaks on titles and tables

This commit is contained in:
Ivan Lanin 2014-06-12 02:25:34 +07:00
parent 8e93c91bb0
commit f54d9a1eb4
6 changed files with 8 additions and 52 deletions

View File

@ -19,6 +19,7 @@ This release added drawing shapes (arc, curve, line, polyline, rect, oval) eleme
- Fix rare PclZip/realpath/PHP version problem - @andrew-kzoo GH-261 - Fix rare PclZip/realpath/PHP version problem - @andrew-kzoo GH-261
- `addHTML` encoding and ampersand fixes for PHP 5.3 - @bskrtich GH-270 - `addHTML` encoding and ampersand fixes for PHP 5.3 - @bskrtich GH-270
- Page breaks on titles and tables - @ivanlanin GH-274
### Deprecated ### Deprecated

View File

@ -50,13 +50,6 @@ abstract class AbstractElement
*/ */
protected $withoutP = false; protected $withoutP = false;
/**
* Has page break before
*
* @var bool
*/
private $pageBreakBefore = false;
/** /**
* Write element * Write element
*/ */
@ -96,26 +89,6 @@ abstract class AbstractElement
return $this->element; return $this->element;
} }
/**
* Has page break before
*
* @return bool
*/
public function hasPageBreakBefore()
{
return $this->pageBreakBefore;
}
/**
* Set page break before
*
* @param bool $value
*/
public function setPageBreakBefore($value = true)
{
$this->pageBreakBefore = (bool)$value;
}
/** /**
* Start w:p DOM element * Start w:p DOM element
* *
@ -129,11 +102,6 @@ abstract class AbstractElement
if (method_exists($this->element, 'getParagraphStyle')) { if (method_exists($this->element, 'getParagraphStyle')) {
$this->writeParagraphStyle(); $this->writeParagraphStyle();
} }
// PageBreak
if ($this->pageBreakBefore) {
$elementWriter = new PageBreak($this->xmlWriter, new PageBreakElement());
$elementWriter->write();
}
} }
} }

View File

@ -81,21 +81,9 @@ class Container extends AbstractElement
$elementClass = substr(get_class($element), strrpos(get_class($element), '\\') + 1); $elementClass = substr(get_class($element), strrpos(get_class($element), '\\') + 1);
$writerClass = $this->namespace . '\\' . $elementClass; $writerClass = $this->namespace . '\\' . $elementClass;
// Check it's a page break. No need to write it, instead, flag containers'
// pageBreakBefore to be assigned to the next element
if ($elementClass == 'PageBreak') {
$this->setPageBreakBefore(true);
return $elementClass;
}
if (class_exists($writerClass)) { if (class_exists($writerClass)) {
// Get container's page break before and reset it
$pageBreakBefore = $this->hasPageBreakBefore();
$this->setPageBreakBefore(false);
/** @var \PhpOffice\PhpWord\Writer\Word2007\Element\AbstractElement $writer Type hint */ /** @var \PhpOffice\PhpWord\Writer\Word2007\Element\AbstractElement $writer Type hint */
$writer = new $writerClass($xmlWriter, $element, $withoutP); $writer = new $writerClass($xmlWriter, $element, $withoutP);
$writer->setPageBreakBefore($pageBreakBefore);
$writer->write(); $writer->write();
} }

View File

@ -20,9 +20,6 @@ namespace PhpOffice\PhpWord\Writer\Word2007\Element;
/** /**
* PageBreak element writer * PageBreak element writer
* *
* Originally, page break is rendered as a `w:p`, but this turns out to produce bug #150.
* As of 0.11.0, page break is rendered as a `w:r` with `w:br` type "page" and `w:lastRenderedPageBreak`
*
* @since 0.10.0 * @since 0.10.0
*/ */
class PageBreak extends AbstractElement class PageBreak extends AbstractElement
@ -36,11 +33,12 @@ class PageBreak extends AbstractElement
{ {
$xmlWriter = $this->getXmlWriter(); $xmlWriter = $this->getXmlWriter();
$xmlWriter->startElement('w:p');
$xmlWriter->startElement('w:r'); $xmlWriter->startElement('w:r');
$xmlWriter->startElement('w:br'); $xmlWriter->startElement('w:br');
$xmlWriter->writeAttribute('w:type', 'page'); $xmlWriter->writeAttribute('w:type', 'page');
$xmlWriter->endElement(); // w:br $xmlWriter->endElement(); // w:br
$xmlWriter->writeElement('w:lastRenderedPageBreak');
$xmlWriter->endElement(); // w:r $xmlWriter->endElement(); // w:r
$xmlWriter->endElement(); // w:p
} }
} }

View File

@ -50,7 +50,8 @@ class Settings extends AbstractPart
'w:autofitToFirstFixedWidthCell' => '', 'w:autofitToFirstFixedWidthCell' => '',
'w:underlineTabInNumList' => '', 'w:underlineTabInNumList' => '',
'w:displayHangulFixedWidth' => '', 'w:displayHangulFixedWidth' => '',
'w:splitPgBreakAndParaMark' => '', // Commented for GH-274
// 'w:splitPgBreakAndParaMark' => '',
'w:doNotVertAlignCellWithSp' => '', 'w:doNotVertAlignCellWithSp' => '',
'w:doNotBreakConstrainedForcedTable' => '', 'w:doNotBreakConstrainedForcedTable' => '',
'w:doNotVertAlignInTxbx' => '', 'w:doNotVertAlignInTxbx' => '',

View File

@ -114,15 +114,15 @@ class DocumentTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('page', $element->getAttribute('w:type')); $this->assertEquals('page', $element->getAttribute('w:type'));
// Title // Title
$element = $doc->getElement('/w:document/w:body/w:p[5]/w:pPr/w:pStyle'); $element = $doc->getElement('/w:document/w:body/w:p[6]/w:pPr/w:pStyle');
$this->assertEquals('Heading1', $element->getAttribute('w:val')); $this->assertEquals('Heading1', $element->getAttribute('w:val'));
// List item // List item
$element = $doc->getElement('/w:document/w:body/w:p[6]/w:pPr/w:numPr/w:numId'); $element = $doc->getElement('/w:document/w:body/w:p[7]/w:pPr/w:numPr/w:numId');
$this->assertEquals(3, $element->getAttribute('w:val')); $this->assertEquals(3, $element->getAttribute('w:val'));
// Object // Object
$element = $doc->getElement('/w:document/w:body/w:p[11]/w:r/w:object/o:OLEObject'); $element = $doc->getElement('/w:document/w:body/w:p[12]/w:r/w:object/o:OLEObject');
$this->assertEquals('Embed', $element->getAttribute('Type')); $this->assertEquals('Embed', $element->getAttribute('Type'));
} }