dgifford / tag
v3.0
2017-12-03 11:56 UTC
Requires
- php: >=5.5
- dgifford/hooks-trait: 0.*
README
简介
此类提供了一个生成和操作HTML元素的框架。它可以在需要生成单个HTML标签或生成多个嵌套元素的地方使用。
基本用法
$div = new Tag('div');
$div->render(); // outputs <div></div>
可以在构造函数中定义属性和内容
$div = new Tag('div', ['class' => 'my_class', 'id' => 'my_id'], 'Here is some content');
$div->render(); // outputs <div class="my_class" id="my_id">Here is some content</div>
或者通过set
方法在对象实例化后设置/更改
$div = new Tag;
$div->set('div', ['class' => 'my_class', 'id' => 'my_id'], 'Here is some content');
$div->render(); // outputs <div class="my_class" id="my_id">Here is some content</div>
或者通过setAttribute
和setContent
方法设置
$div = new Tag;
$div->setAttribute( ['class' => 'my_class', 'id' => 'my_id'] );
$div->setContent( 'Here is some content' );
$div->render(); // outputs <div class="my_class" id="my_id">Here is some content</div>
标签的内容可以是简单文本、HTML字符串、另一个Tag对象或创建嵌套Tag的多个参数。
文本内容将被转义,除非在设置内容时传递额外的布尔值false参数
$div = new Tag;
$div->setAttribute( ['class' => 'my_class', 'id' => 'my_id'] );
$div->setContent( 'some <strong>content</strong>' );
$div->render(); // outputs <div>some <strong>content</strong></div>
$div->setContent( 'some <strong>content</strong>', false );
$div->render(); // outputs <div>some <strong>content</strong></div>
$div = new Tag( 'div' );
$div->setContent( 'div', ['class' => 'inner'], 'some content' );
$div->render(); // outputs <div><div class="inner">some content</div></div>
$div = new Tag( 'div' );
$inner = new Tag( 'div', ['class' => 'inner'], 'some content' );
$div->setContent( $inner );
$div->render(); // outputs <div><div class="inner">some content</div></div>
可以使用多维数组添加多个内容项
$div = new Tag( 'div' );
$inner = new Tag( 'div', ['class' => 'inner'], 'some content' );
$div->setContent([
[$inner],
['<div>More content</div>', false],
[ 'div', 'even more content' ],
]);
$div->render(); // outputs <div><div class="inner">some content</div><div>More content</div><div>even more content</div></div>
修改内容
内容可以追加、前置和插入到现有的Tag中
$tag = new Tag( 'div', 'my content' );
$tag->append( 'div', 'appended content' );
$tag->render(); // outputs <div>my content<div>appended content</div></div>
$tag->prepend( 'div', 'prepended content' );
$div->render(); // outputs <div><div>prepended content</div>my content<div>appended content</div></div>
insert
方法需要现有内容项的索引号(从零开始计数)以插入之前
$tag = new Tag( 'div', 'my content' );
$tag->append( 'div', 'appended content' );
$tag->insert( 1, ['div', 'inserted content'] );
$tag->render(); // outputs <div>my content<div>inserted content</div><div>appended content</div></div>
使用索引0等同于prepend
方法。
嵌套结构
在实例化时可以生成嵌套HTML
$tag = new Tag('div', [], [
['Level 1'],
new Tag('div', [], [
['Level 2'],
new Tag('div', 'Level 3'),
['Level 2'],
]),
['Level 1'],
]);
$tag->render();
/*
Outputs:
<div>
Level 1
<div>
Level 2
<div>Level 3</div>
Level 2
</div>
Level 1
</div>
*/
注意,当使用数组添加多个内容项时,必须在构造函数中包含属性数组(即使为空)。
当Tag对象的内容为Tag对象时,可以使用find
和filter
方法定位嵌套标签。
find
方法接受一个标签名和属性数组。它是递归的,并返回匹配提供参数的所有Tag对象数组。
filter
方法接受类似的参数,并将它们应用到后续操作中,直到清除。
$tag = new Tag('section', [], [
new Tag('div', ['class' => 'wrapper' ], [
new Tag('span', 'Some content'),
new Tag('span', 'Some more content'),
]),
]);
$tag->render(); // Outputs <section><div class="wrapper"><span>Some content</span><span>Some more content</span></div></section>
foreach( $tag->find( '', ['class' => 'wrapper'] ) as $obj )
{
$obj->setAttribute( 'id', 'my_id' );
}
$tag->render(); // Outputs <section><div class="wrapper" id="my_id"><span>Some content</span><span>Some more content</span></div></section>
$tag->filter( 'span' );
$tag->setContent( 'Foo bar' );
$tag->render(); // Outputs <section><div class="wrapper" id="my_id"><span>Foo bar</span><span>Foo bar</span></div></section>
$tag->clear();
$tag->render(); // Filter still applied, so outputs <section><div class="wrapper" id="my_id"><span></span><span></span></div></section>
$tag->clearFilters();
$tag->clear();
$tag->render(); // Outputs <section></section>