用于创建HTML标签的工具类。

v3.0 2017-12-03 11:56 UTC

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>

或者通过setAttributesetContent方法设置

$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 &lt;strong&gt;content&lt;/strong&gt;</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对象时,可以使用findfilter方法定位嵌套标签。

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>