Html & Dom Builder
This is a convenience class to create XML and HTML element in an OO way.
DomElement
DomElement and DomElements is use to create XML elements.
use Windwalker\Dom\DomElement;
$attrs = array('id' => 'foo', 'class' => 'bar');
echo $dom = (string) new DomElement('field', 'Content', $attrs);
Output:
<field id="foo" class="bar">Content</field>
Add Children
use Windwalker\Dom\DomElement;
$attrs = array('id' => 'foo', 'class' => 'bar');
$content = array(
new DomElement('option', 'Yes', array('value' => 1)),
new DomElement('option', 'No', array('value' => 0))
);
echo $dom = (string) new DomElement('field', $content, $attrs);
The output will be:
<field id="foo" class="bar">
<option value="1">Yes</option>
<option value="0">No</option>
</field>
HtmlElement
HtmlElement is use to create HTML elements, some specific tags will force to unpaired.
use Windwalker\Dom\HtmlElement;
$attrs = array(
'class' => 'btn btn-mini',
'onclick' => 'return false;'
);
$html = (string) new HtmlElement('button', 'Click', $attrs);
Then we will get this HTML:
<button class="btn btn-mini" onclick="return false;">Click</button>
Get Attributes by Array Access
$class = $html['class'];
DomElements & HtmlElements
It is a collection of HtmlElement set.
$html = new HtmlElements(
array(
new HtmlElement('p', $content, $attrs),
new HtmlElement('div', $content, $attrs),
new HtmlElement('a', $content, $attrs)
)
);
echo $html;
OR we can iterate it:
foreach ($html as $element)
{
echo $element;
}
Attributes
$html = new HtmlElement('input', array(
'data-string' => 'string',
'data-empty' => '',
'data-true' => true,
'data-false' => false,
'data-null' => null,
// Special attributes
'checked' => 'checked',
'disabled' => true,
'readonly' => false
));
echo $html;
Result
<input data-string="string" data-empty="" data-true checked="checked" disabled="disabled">
Formatter
DomFormatter and HtmlFormatter will help us format XML / HTML string.
$xml = '<field id="foo" class="bar"><option value="1">Yes</option><option value="0">No</option></field>';
DomFormatter::format($xml);
Result
<field id="foo" class="bar">
<option value="1">Yes</option>
<option value="0">No</option>
</field>
HtmlFormatter will convert some tags to unpaired element, e.g. <img>.
Select List
use Windwalker\Html\Select\SelectList;
use Windwalker\Html\Option;
$select = new SelectList(
'form[timezone]',
array(
new Option('Asia - Tokyo', 'Asia/Tokyo', array('class' => 'opt')),
new Option('Asia - Taipei', 'Asia/Taipei'),
new Option('Europe - Paris', 'Asia/Paris'),
new Option('UTC', 'UTC'),
),
array('class' => 'input-select'),
'UTC',
false
);
echo $select;
The result:
<select class="input-select" name="form[timezone]">
<option class="opt" value="Asia/Tokyo">Asia - Tokyo</option>
<option value="Asia/Taipei">Asia - Taipei</option>
<option value="Asia/Paris">Europe - Paris</option>
<option value="UTC" selected="selected">UTC</option>
</select>
Group Select
Use two level array to make options grouped.
use Windwalker\Html\Select\CheckboxList;
$select = new SelectList(
'form[timezone]',
array(
'Asia' => array(
new Option('Tokyo', 'Asia/Tokyo', array('class' => 'opt')),
new Option('Taipei', 'Asia/Taipei')
),
'Europe' => array(
new Option('Europe - Paris', 'Asia/Paris')
)
,
new Option('UTC', 'UTC'),
),
array('class' => 'input-select'),
'UTC',
false
);
echo $select;
The result
<select class="input-select" name="form[timezone]">
<optgroup label="Asia">
<option class="opt" value="Asia/Tokyo">Tokyo</option>
<option value="Asia/Taipei">Taipei</option>
</optgroup>
<optgroup label="Europe">
<option value="Asia/Paris">Europe - Paris</option>
</optgroup>
<option value="UTC" selected="selected">UTC</option>
</select>
Input List
CheckboxList
$select = new CheckboxList(
'form[timezone]',
array(
new Option('Asia - Tokyo', 'Asia/Tokyo', array('class' => 'opt')),
new Option('Asia - Taipei', 'Asia/Taipei'),
new Option('Europe - Paris', 'Asia/Paris'),
new Option('UTC', 'UTC'),
),
array('class' => 'input-select'),
'UTC',
false
);
echo $select;
The result
<span class="checkbox-inputs input-select">
<input class="opt" value="Asia/Tokyo" type="checkbox" name="form[timezone][]" id="form-timezone-asia-tokyo" />
<label class="opt" id="form-timezone-asia-tokyo-label" for="form-timezone-asia-tokyo">Asia - Tokyo</label>
<input value="Asia/Taipei" type="checkbox" name="form[timezone][]" id="form-timezone-asia-taipei" />
<label id="form-timezone-asia-taipei-label" for="form-timezone-asia-taipei">Asia - Taipei</label>
<input value="Asia/Paris" type="checkbox" name="form[timezone][]" id="form-timezone-asia-paris" />
<label id="form-timezone-asia-paris-label" for="form-timezone-asia-paris">Europe - Paris</label>
<input value="UTC" checked="checked" type="checkbox" name="form[timezone][]" id="form-timezone-utc" />
<label id="form-timezone-utc-label" for="form-timezone-utc">UTC</label>
</span>
If you want to use div to wrap all inputs instead span, set tag name to object.
$select->setName('div');
RadioList
Same as Checkboxes, but the input type will be type="radio"
Enumeration List
UL List
use Windwalker\Html\Enum\ListItem;
use Windwalker\Html\Enum\UList;
echo new UList([
new ListItem('Foo'),
new ListItem('Bar', ['class' => 'baz']),
]);
// OR
echo (new UList)
->item('new ListItem('Foo'))
->item('Bar', ['class' => 'baz']);
Output
<ul>
<li>Foo</li>
<li class="baz">Bar</li>
</ul>
OL List
echo (new OList)
->item('new ListItem('Foo'))
->item('Bar', ['class' => 'baz']);
Output
<ol>
<li>Foo</li>
<li class="baz">Bar</li>
</ol>
Description List
use Windwalker\Html\Enum\DList;
use Windwalker\Html\Enum\DListDescription;
use Windwalker\Html\Enum\DListTitle;
echo (new DList)
->addDescription('Foo', 'foo desc')
->addDescription('Bar', 'bar desc');
// OR
echo (new DList)
->title('Foo')->desc('foo desc')
->title('Bar')->desc('bar desc');
// OR
echo (new DList)
->item(new DListTitle('Foo'))->item(new DListDescription('foo desc'))
->item(new DListTitle('Bar'))->item(new DListDescription('bar desc'));
Output
<dl>
<dt>Foo</dt>
<dd>foo desc</dd>
<dt>Bar</dt>
<dd>bar desc</dd>
</dl>
Form Wrapper
use Windwalker\Html\Form\FormWrapper;
use Windwalker\Html\Form\InputElement;
echo FormWrapper::create([
new InputElement('hidden', 'id'),
new InputElement('text', 'title'),
], ['action' => 'http://foo.com']);
Output:
<form action="http://foo.com">
<input type="hidden" name="id" value="" />
<input type="text" name="title" value="" />
</form>
Use start() and end()
echo FormWrapper::start('my-form', 'post', 'http://foo.com', FormWrapper::ENCTYPE_FORM_DATA, ['id' => 'admin-form']);
// Echo inputs
echo FormWrapper::end();
Output:
<form name="my-form" id="admin-form" method="post" action="http://foo.com" enctype="multipart/form-data">
<!-- inputs -->
</form>
Add CSRF token automatically:
$token = MySession::getFormToken();
FormWrapper::setTokenHandler(function () use ($token)
{
return new InputElement('hidden', $token, 1);
});
echo FormWrapper::start('my-form', 'post', 'http://foo.com', FormWrapper::ENCTYPE_FORM_DATA, ['id' => 'admin-form']);
echo FormWrapper::end();
Output:
<form name="my-form" id="admin-form" method="post" action="http://foo.com" enctype="multipart/form-data">
<!-- inputs -->
<input type="hidden" name="e6900955e2cb8d2503f663e85eb2e7e9" value="1" />
</form>
Table Generator
Grid
Grid is a HTML table generator, see this example:
use Windwalker\Html\Grid\Grid;
$grid = new Grid(['class' => 'table table-bordered']);
// Pre-set table columns and give them a name.
$grid->setColumns(['a', 'b', 'c']);
// Create first TR row, set it as <thead>
$grid->addRow(['class' => 'head'], Grid::ROW_HEAD);
// Set <th> value
$grid->setRowCell('a', 'A');
$grid->setRowCell('b', 'B');
$grid->setRowCell('c', 'C');
// Loop 3 rows
foreach (range(1, 3) as $i)
{
// Add a TR with class row-x
$grid->addRow(['class' => 'row-' . $i]);
// Set every <td> value
$grid->setRowCell('a', 'a1');
$grid->setRowCell('b', 'b1');
$grid->setRowCell('c', 'c1');
}
// Add <tfoot>
$grid->addRow(['class' => 'foot'], Grid::ROW_FOOT);
$grid->setRowCell('a', 'Table footer', ['colspan' => 3]);
echo $grid;
Output:
<table class="table table-bordered">
<thead>
<tr class="head">
<th>A</th>
<th>B</th>
<th>C</th>
</tr>
</thead>
<tbody>
<tr class="row-1">
<td>a1</td>
<td>b1</td>
<td>c1</td>
</tr>
<tr class="row-2">
<td>a1</td>
<td>b1</td>
<td>c1</td>
</tr>
<tr class="row-3">
<td>a1</td>
<td>b1</td>
<td>c1</td>
</tr>
</tbody>
<tfoot>
<tr class="foot">
<td colspan="3">Table footer</td>
</tr>
</tfoot>
</table>
| A | B | C |
|---|---|---|
| a1 | b1 | c1 |
| a1 | b1 | c1 |
| a1 | b1 | c1 |
| Table footer | ||
KeyValue Grid
KeyValueGrid provides simple key-value table to show data similar to description list.
use Windwalker\Html\Grid\KeyValueGrid;
$items = [
'Foo' => 'foo value',
'Bar' => 'bar value',
'Yoo' => 'yoo value',
];
$grid = new KeyValueGrid;
$grid->addHeader('Key', 'Value');
foreach ($items as $key => $value)
{
$grid->addItem($key, $value);
}
echo $grid;
| Key | Value |
|---|---|
| Foo | foo value |
| Bar | bar value |
| Yoo | yoo value |
Add row title:
$items = [
'Foo' => 'foo value',
'Bar' => 'bar value',
'Yoo' => 'yoo value',
];
$grid = new KeyValueGrid;
$grid->addHeader('Key', 'Value');
// Add a row title
$grid->addTitle('This is a subtitle');
foreach ($items as $key => $value)
{
$grid->addItem($key, $value);
}
// Add a row title
$grid->addTitle('This is another subtitle');
foreach ($items as $key => $value)
{
$grid->addItem($key, $value);
}
echo $grid;
| Key | Value |
|---|---|
| This is a subtitle | |
| Foo | foo value |
| Bar | bar value |
| Yoo | yoo value |
| This is another subtitle | |
| Foo | foo value |
| Bar | bar value |
| Yoo | yoo value |
Use addItems() or configure() to batch add items.
$grid->addItems($items);
// Or run a callback for every item
$grid->configure($items, function (KeyValueGrid $grid, $key, $value)
{
if ($value)
{
$grid->addItem($key, $value);
}
});
Media Elements
Audio
use Windwalker\Html\Media\Audio;
echo (new Audio)
->controls(true)
->autoplay(true)
->loop(true)
->setNoSupportHint('Your browser do not support this format')
->addMp3Source('http://foo.com/bar.mp3')
->addOggSource('http://foo.com/bar.ogg')
->addWavSource('http://foo.com/bar.wav');
Output:
<audio controls autoplay loop>
<source src="http://foo.com/bar.mp3" type="audio/mpeg" />
<source src="http://foo.com/bar.ogg" type="audio/ogg" />
<source src="http://foo.com/bar.wav" type="audio/wav" />
Your browser do not support this format
</audio>
See HTML5 Audio Tag and Tag Source
Video
use Windwalker\Html\Media\Video;
echo (new Video)
->controls(true)
->autoplay(true)
->loop(true)
->preload(true)
->poster('http://foo.com/cover.jpg')
->setNoSupportHint('Your browser do not support this format')
->setMainSource('http://foo.com/bar.mp4')
->addMp4Source('http://foo.com/bar.mp4')
->addOggSource('http://foo.com/bar.ogg')
->addWebMSource('http://foo.com/bar.webm');
Output:
<video controls autoplay loop preload poster="http://foo.com/cover.jpg" src="http://foo.com/bar.mp4">
<source src="http://foo.com/bar.mp4" type="video/mp4" />
<source src="http://foo.com/bar.ogg" type="video/ogg" />
<source src="http://foo.com/bar.webm" type="video/webm" />
Your browser do not support this format
</video>
See HTML5 Video Tag and Tag Source
HtmlHelper
Repair Tags
We can using repair() method to repair unpaired tags by php tidy, if tidy extension not exists, will using simple tag close function to fix it.
$html = '<p>foo</i>';
$html = \Windwalker\Html\Helper\HtmlHelper::repair($html);
echo $html; // <p>foo</p>
Get JS Object
This method convert a nested array or object to JSON format that you can inject it to JS code.
use Windwalker\Html\Helper\HtmlHelper;
$option = array(
'url' => 'http://foo.com',
'foo' => array('bar', 'yoo')
);
echo 'var options = ' . HtmlHelper::getJSOBject($option);
Result
var options = {
url: "http://foo.com",
foo: ["bar", "yoo"]
}
Add \\ before a value that this method will not quote it as string.
$option = array(
'callback' => '\\function () { }'
);
echo 'var options = ' . HtmlHelper::getJSOBject($option);
Result
var options = {
callback: function () { }
}
XmlHelper
XmlHelper using on get attributes of SimpleXmlElement.
Get Attributes
use Windwalker\Dom\SimpleXml\XmlHelper;
$xml = <<<XML
<root>
<field name="foo" type="bar" readonly="true">
<option></option>
</field>
</root>
XML;
$xml = simple_xml_load_string($xml);
$element = $xml->xpath('field');
$name = XmlHelper::getAttribute($element, 'name'); // result: foo
// Same as get()
$name = XmlHelper::get($element, 'name'); // result: foo
Get Boolean
getBool() can help us convert some string link true, 1, yes to boolean TRUE and no, false, disabled, null, none, 0 string to booleand FALSE.
$bool = XmlHelper::getBool($element, 'readonly'); // result: (boolean) TRUE
Get False
Just an alias of getBool() but FALSE will return TRUE.
Set Default
If this attribute not exists, use this value as default, or we use original value from xml.
XmlHelper::def($element, 'class', 'input');
If you found a typo or error, please help us improve this document.