.. _elements:

Elements
========

Below are the matrix of element availability in each container. The column shows
the containers while the rows lists the elements.

+-----+---------------+---------+--------+--------+------+----------+----------+
| Num | Element       | Section | Header | Footer | Cell | Text Run | Footnote |
+=====+===============+=========+========+========+======+==========+==========+
| 1   | Text          |   v     |   v    |   v    |  v   |   v      |   v      |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 2   | Text Run      |   v     |   v    |   v    |  v   |   \-     |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 3   | Link          |   v     |   v    |   v    |  v   |   v      |   v      |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 4   | Title         |   v     |   ?    |   ?    |  ?   |   ?      |   ?      |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 5   | Preserve Text |   ?     |   v    |   v    |  v\* |   ?      |   ?      |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 6   | Text Break    |   v     |   v    |   v    |  v   |   v      |   v      |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 7   | Page Break    |   v     |   \-   |   \-   |  \-  |   \-     |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 8   | List          |   v     |   v    |   v    |  v   |   \-     |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 9   | Table         |   v     |   v    |   v    |  ?   |   \-     |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 10  | Image         |   v     |   v    |   v    |  v   |   v      |   v      |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 11  | Watermark     |   \-    |   v    |   \-   |  \-  |   \-     |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 12  | Object        |   v     |   v    |   v    |  v   |   v      |   v      |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 13  | TOC           |   v     |   \-   |   \-   |  \-  |   \-     |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 14  | Footnote      |   v     |   \-   |   \-   | v\*\*|   v\*\*  |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 15  | Endnote       |   v     |   \-   |   \-   | v\*\*|   v\*\*  |   \-     |
+-----+---------------+---------+--------+--------+------+----------+----------+
| 16  | CheckBox      |   v     |   v    |   v    |  v   |   ?      |   ?      |
+-----+---------------+---------+--------+--------+------+----------+----------+

Legend:

- ``v`` Available
- ``v*`` Available only when inside header/footer
- ``v**`` Available only when inside section
- ``-`` Not available
- ``?`` Should be available

Texts
-----

Text can be added by using ``addText`` and ``addTextRun`` method.
``addText`` is used for creating simple paragraphs that only contain
texts with the same style. ``addTextRun`` is used for creating
complex paragraphs that contain text with different style (some bold,
other italics, etc) or other elements, e.g. images or links. The
syntaxes are as follow:

.. code-block:: php

    $section->addText($text, [$fontStyle], [$paragraphStyle]);
    $textrun = $section->addTextRun([$paragraphStyle]);

Text styles
~~~~~~~~~~~

You can use the ``$fontStyle`` and ``$paragraphStyle`` variable to
define text formatting. There are 2 options to style the inserted text
elements, i.e. inline style by using array or defined style by adding
style definition.

Inline style examples:

.. code-block:: php

    $fontStyle = array('name' => 'Times New Roman', 'size' => 9);
    $paragraphStyle = array('align' => 'both');
    $section->addText('I am simple paragraph', $fontStyle, $paragraphStyle);

    $textrun = $section->addTextRun();
    $textrun->addText('I am bold', array('bold' => true));
    $textrun->addText('I am italic', array('italic' => true));
    $textrun->addText('I am colored, array('color' => 'AACC00'));

Defined style examples:

.. code-block:: php

    $fontStyle = array('color' => '006699', 'size' => 18, 'bold' => true);
    $phpWord->addFontStyle('fStyle', $fontStyle);
    $text = $section->addText('Hello world!', 'fStyle');

    $paragraphStyle = array('align' => 'center');
    $phpWord->addParagraphStyle('pStyle', $paragraphStyle);
    $text = $section->addText('Hello world!', 'pStyle');

Font style
^^^^^^^^^^

Available font styles:

-  ``name`` Font name, e.g. *Arial*
-  ``size`` Font size, e.g. *20*, *22*,
-  ``hint`` Font content type, *default*, *eastAsia*, or *cs*
-  ``bold`` Bold, *true* or *false*
-  ``italic`` Italic, *true* or *false*
-  ``superScript`` Superscript, *true* or *false*
-  ``subScript`` Subscript, *true* or *false*
-  ``underline`` Underline, *dash*, *dotted*, etc.
-  ``strikethrough`` Strikethrough, *true* or *false*
-  ``color`` Font color, e.g. *FF0000*
-  ``fgColor`` Font highlight color, e.g. *yellow*, *green*, *blue*
-  ``bgColor`` Font background color, e.g. *FF0000*

Paragraph style
^^^^^^^^^^^^^^^

Available paragraph styles:

-  ``align`` Paragraph alignment, *left*, *right* or *center*
-  ``spaceBefore`` Space before paragraph
-  ``spaceAfter`` Space after paragraph
-  ``indent`` Indent by how much
-  ``hanging`` Hanging by how much
-  ``basedOn`` Parent style
-  ``next`` Style for next paragraph
-  ``widowControl`` Allow first/last line to display on a separate page,
   *true* or *false*
-  ``keepNext`` Keep paragraph with next paragraph, *true* or *false*
-  ``keepLines`` Keep all lines on one page, *true* or *false*
-  ``pageBreakBefore`` Start paragraph on next page, *true* or *false*
-  ``lineHeight`` text line height, e.g. *1.0*, *1.5*, ect...
-  ``tabs`` Set of custom tab stops

Titles
~~~~~~

If you want to structure your document or build table of contents, you
need titles or headings. To add a title to the document, use the
``addTitleStyle`` and ``addTitle`` method.

.. code-block:: php

    $phpWord->addTitleStyle($depth, [$fontStyle], [$paragraphStyle]);
    $section->addTitle($text, [$depth]);

Its necessary to add a title style to your document because otherwise
the title won't be detected as a real title.

Links
~~~~~

You can add Hyperlinks to the document by using the function addLink:

.. code-block:: php

    $section->addLink($linkSrc, [$linkName], [$fontStyle], [$paragraphStyle]);

-  ``$linkSrc`` The URL of the link.
-  ``$linkName`` Placeholder of the URL that appears in the document.
-  ``$fontStyle`` See "Font style" section.
-  ``$paragraphStyle`` See "Paragraph style" section.

Preserve texts
~~~~~~~~~~~~~~

The ``addPreserveText`` method is used to add a page number or page
count to headers or footers.

.. code-block:: php

    $footer->addPreserveText('Page {PAGE} of {NUMPAGES}.');

Breaks
------

Text breaks
~~~~~~~~~~~

Text breaks are empty new lines. To add text breaks, use the following
syntax. All paramaters are optional.

.. code-block:: php

    $section->addTextBreak([$breakCount], [$fontStyle], [$paragraphStyle]);

-  ``$breakCount`` How many lines
-  ``$fontStyle`` See "Font style" section.
-  ``$paragraphStyle`` See "Paragraph style" section.

Page breaks
~~~~~~~~~~~

There are two ways to insert a page breaks, using the ``addPageBreak``
method or using the ``pageBreakBefore`` style of paragraph.

:: code-block:: php

    $section->addPageBreak();

Lists
-----

To add a list item use the function ``addListItem``.

Basic usage:

.. code-block:: php

    $section->addListItem($text, [$depth], [$fontStyle], [$listStyle], [$paragraphStyle]);

Parameters:

-  ``$text`` Text that appears in the document.
-  ``$depth`` Depth of list item.
-  ``$fontStyle`` See "Font style" section.
-  ``$listStyle`` List style of the current element TYPE\_NUMBER,
   TYPE\_ALPHANUM, TYPE\_BULLET\_FILLED, etc. See list of constants in
   PHPWord\_Style\_ListItem.
-  ``$paragraphStyle`` See "Paragraph style" section.

Advanced usage:

You can also create your own numbering style by changing the ``$listStyle`` parameter
with the name of your numbering style.

.. code-block:: php

    $phpWord->addNumberingStyle(
        'multilevel',
        array('type' => 'multilevel', 'levels' => array(
            array('format' => 'decimal', 'text' => '%1.', 'left' => 360, 'hanging' => 360, 'tabPos' => 360),
            array('format' => 'upperLetter', 'text' => '%2.', 'left' => 720, 'hanging' => 360, 'tabPos' => 720),
            )
         )
    );
    $section->addListItem('List Item I', 0, null, 'multilevel');
    $section->addListItem('List Item I.a', 1, null, 'multilevel');
    $section->addListItem('List Item I.b', 1, null, 'multilevel');
    $section->addListItem('List Item II', 0, null, 'multilevel');

Level styles:

-  ``start`` Starting value
-  ``format``  Numbering format bullet|decimal|upperRoman|lowerRoman|upperLetter|lowerLetter
-  ``restart`` Restart numbering level symbol
-  ``suffix`` Content between numbering symbol and paragraph text tab|space|nothing
-  ``text`` Numbering level text e.g. %1 for nonbullet or bullet character
-  ``align`` Numbering symbol align left|center|right|both
-  ``left`` See paragraph style
-  ``hanging`` See paragraph style
-  ``tabPos`` See paragraph style
-  ``font`` Font name
-  ``hint`` See font style

Tables
------

To add tables, rows, and cells, use the ``addTable``, ``addRow``, and
``addCell`` methods:

.. code-block:: php

    $table = $section->addTable([$tableStyle]);
    $table->addRow([$height], [$rowStyle]);
    $cell = $table->addCell($width, [$cellStyle]);

Table style can be defined with ``addTableStyle``:

.. code-block:: php

    $tableStyle = array(
        'borderColor' => '006699',
        'borderSize' => 6,
        'cellMargin' => 50
    );
    $firstRowStyle = array('bgColor' => '66BBFF');
    $phpWord->addTableStyle('myTable', $tableStyle, $firstRowStyle);
    $table = $section->addTable('myTable');

Table, row, and cell styles
~~~~~~~~~~~~~~~~~~~~~~~~~~~

Table styles:

-  ``width`` Table width in percent
-  ``bgColor`` Background color, e.g. '9966CC'
-  ``border(Top|Right|Bottom|Left)Size`` Border size in twips
-  ``border(Top|Right|Bottom|Left)Color`` Border color, e.g. '9966CC'
-  ``cellMargin(Top|Right|Bottom|Left)`` Cell margin in twips

Row styles:

-  ``tblHeader`` Repeat table row on every new page, *true* or *false*
-  ``cantSplit`` Table row cannot break across pages, *true* or *false*
-  ``exactHeight`` Row height is exact or at least

Cell styles:

-  ``width`` Cell width in twips
-  ``valign`` Vertical alignment, *top*, *center*, *both*, *bottom*
-  ``textDirection`` Direction of text
-  ``bgColor`` Background color, e.g. '9966CC'
-  ``border(Top|Right|Bottom|Left)Size`` Border size in twips
-  ``border(Top|Right|Bottom|Left)Color`` Border color, e.g. '9966CC'
-  ``gridSpan`` Number of columns spanned
-  ``vMerge`` *restart* or *continue*

Cell span
~~~~~~~~~

You can span a cell on multiple columns by using ``gridSpan`` or
multiple rows by using ``vMerge``.

.. code-block:: php

    $cell = $table->addCell(200);
    $cell->getStyle()->setGridSpan(5);

See ``Sample_09_Tables.php`` for more code sample.

Images
------

To add an image, use the ``addImage`` method to sections, headers, footers,
textruns, or table cells.

.. code-block:: php

    $section->addImage($src, [$style]);

- `source` String path to a local image or URL of a remote image
- `styles` Array fo styles for the image. See below.

Examples:

.. code-block:: php

    $section = $phpWord->addSection();
    $section->addImage(
        'mars.jpg',
        array(
            'width' => 100,
            'height' => 100,
            'marginTop' => -1,
            'marginLeft' => -1,
            'wrappingStyle' => 'behind'
        )
    );
    $footer = $section->addFooter();
    $footer->addImage('http://example.com/image.php');
    $textrun = $section->addTextRun();
    $textrun->addImage('http://php.net/logo.jpg');

Image styles
~~~~~~~~~~~~

Available image styles:

-  ``width`` Width in pixels
-  ``height`` Height in pixels
-  ``align`` Image alignment, *left*, *right*, or *center*
-  ``marginTop`` Top margin in inches, can be negative
-  ``marginLeft`` Left margin in inches, can be negative
-  ``wrappingStyle`` Wrapping style, *inline*, *square*, *tight*,
   *behind*, or *infront*

Watermarks
~~~~~~~~~~

To add a watermark (or page background image), your section needs a
header reference. After creating a header, you can use the
``addWatermark`` method to add a watermark.

.. code-block:: php

    $section = $phpWord->addSection();
    $header = $section->addHeader();
    $header->addWatermark('resources/_earth.jpg', array('marginTop' => 200, 'marginLeft' => 55));

Objects
-------

You can add OLE embeddings, such as Excel spreadsheets or PowerPoint
presentations to the document by using ``addObject`` method.

.. code-block:: php

    $section->addObject($src, [$style]);

Table of contents
-----------------

To add a table of contents (TOC), you can use the ``addTOC`` method.
Your TOC can only be generated if you have add at least one title (See
"Titles").

.. code-block:: php

    $section->addTOC([$fontStyle], [$tocStyle], [$minDepth], [$maxDepth]);

-  ``$fontStyle``: See font style section
-  ``$tocStyle``: See available options below
-  ``$minDepth``: Minimum depth of header to be shown. Default 1
-  ``$maxDepth``: Maximum depth of header to be shown. Default 9

Options for ``$tocStyle``:

-  ``tabLeader`` Fill type between the title text and the page number.
   Use the defined constants in PHPWord\_Style\_TOC.
-  ``tabPos`` The position of the tab where the page number appears in
   twips.
-  ``indent`` The indent factor of the titles in twips.

Footnotes & endnotes
--------------------

You can create footnotes with ``addFootnote`` and endnotes with ``addEndnote``
in texts or textruns, but it's recommended to use textrun to have better layout.
You can use ``addText``, ``addLink``, ``addTextBreak``, ``addImage``,
``addObject`` on footnotes and endnotes.

On textrun:

.. code-block:: php

    $textrun = $section->addTextRun();
    $textrun->addText('Lead text.');
    $footnote = $textrun->addFootnote();
    $footnote->addText('Footnote text can have ');
    $footnote->addLink('http://test.com', 'links');
    $footnote->addText('.');
    $footnote->addTextBreak();
    $footnote->addText('And text break.');
    $textrun->addText('Trailing text.');
    $endnote = $textrun->addEndnote();
    $endnote->addText('Endnote put at the end');

On text:

.. code-block:: php

    $section->addText('Lead text.');
    $footnote = $section->addFootnote();
    $footnote->addText('Footnote text.');

The footnote reference number will be displayed with decimal number starting
from 1. This number use ``FooterReference`` style which you can redefine by
``addFontStyle`` method. Default value for this style is
``array('superScript' => true)``;

Checkboxes
----------

Checkbox elements can be added to sections or table cells by using
``addCheckBox``.

.. code-block:: php

    $section->addCheckBox($name, $text, [$fontStyle], [$paragraphStyle])

-  ``$name`` Name of the check box.
-  ``$text`` Text following the check box
-  ``$fontStyle`` See "Font style" section.
-  ``$paragraphStyle`` See "Paragraph style" section.
