Allows to render tree structures as tables.
Click the image for more examples.
There are 3 main elements of every tree:
They are indivisible.
It simply holds some text which will be rendered inside some cell.
use lukaszmakuch\TableRenderer\TextValue;
$flowers = new TextValue("roses");
They hold other elements.
Its elements are on top of each other.
use lukaszmakuch\TableRenderer\HorizontalContainer;
use lukaszmakuch\TableRenderer\TextValue;
$column = (new HorizontalContainer())
->add(new TextValue("top"))
->add(new TextValue("bottom"));
Its elements are next to each other.
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
$row = (new VerticalContainer())
->add(new TextValue("left"))
->add(new TextValue("right"));
It's possible to build a composite of any complexity.
use lukaszmakuch\TableRenderer\HorizontalContainer;
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
$table = (new HorizontalContainer())
->add((new VerticalContainer())
->add(new TextValue("top left"))
->add(new TextValue("top middle"))
->add(new TextValue("top right"))
)
->add((new VerticalContainer())
->add(new TextValue("bottom left"))
->add(new TextValue("bottom right"))
);
Allows to render tables based on tree structures.
Renders HTML code.
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRendererBuilder;
$builder = new HTMLRendererBuilder();
$htmlRenderer = $builder->buildRenderer();
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRenderer;
$tree = (new VerticalContainer())
->add(new TextValue("left"))
->add(new TextValue("right"));
/* @var $renderer HTMLRenderer */
echo $renderer->renderHTMLBasedOn($tree);
It's possible to assign HTML attributes to atomic values as well as to a whole table. ObjectAttributeContainer is used to achieve that.
First, you need to build the renderer with some attribute container.
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRendererBuilder;
use lukaszmakuch\ObjectAttributeContainer\Impl\ObjectAttributeContainerImpl;
//source of attributes
$attrs = new ObjectAttributeContainerImpl();
//building with the attribute container
$builder = new HTMLRendererBuilder();
$builder->setAttributeContainer($attrs);
$htmlRenderer = $builder->buildRenderer();
use lukaszmakuch\ObjectAttributeContainer\ObjectAttributeContainer;
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRenderer;
/* @var $attrs ObjectAttributeContainer */
//table with border 1
$tree = $attrs->addObjAttrs(
(new VerticalContainer())
//cell with no extra style
->add(new TextValue("left"))
//cell with red text
->add($attrs->addObjAttrs(
new TextValue("right"),
["attrs" => ["style" => "color: #f00"]]
)),
["attrs" => ["border" => 1]]
);
/* @var $renderer HTMLRenderer */
echo $renderer->renderHTMLBasedOn($tree);
This renderer supports custom atomic values. A custom value should extend AtomicCellValue and be supported by an instance of AtomicValueRenderer. Then you can register a new atomic value renderer like that:
use lukaszmakuch\TableRenderer\HTMLRenderer\HTMLRendererBuilder;
/* @var @builder HTMLRendererBuilder */
$builder->addAtomicValueRenderer(
NewAtomicType::class,
new NewAtomicTypeRenderer()
);
It renders models of tables as scalar values or arrays of scalar values (or other arrays).
use lukaszmakuch\TableRenderer\ScalarRenderer\ScalarRendererBuilder;
$renderer = (new ScalarRendererBuilder())->build();
use lukaszmakuch\TableRenderer\VerticalContainer;
use lukaszmakuch\TableRenderer\TextValue;
use lukaszmakuch\TableRenderer\ScalarRenderer\ScalarRenderer;
$tree = (new VerticalContainer())
->add(new TextValue("first"))
->add(new TextValue("second"));
/* @var $renderer ScalarRenderer */
var_dump($renderer->getScalarRepresentationOf($tree));
//[
// 'type' => 'vertical-container',
// 'value' => [
// ['type' => 'text', 'value' => 'first'],
// ['type' => 'text', 'value' => 'second']
// ]
//]
This renderer supports custom elements. A custom element should extend AtomicCellValue and be supported by an instance of ScalarRenderer. Then you can register a new element renderer like that:
use lukaszmakuch\TableRenderer\ScalarRenderer\ScalarRendererBuilder;
/* @var @builder ScalarRendererBuilder */
$builder->addRenderer(
NewAtomicType::class,
new NewAtomicTypeRenderer()
);
Check examples in the examples directory
Use composer to get the latest version:
$ composer require lukaszmakuch/table-renderer