2018-6-27 20:13:04 星期三
作用: 用PHP生成HTML文档, 支持标签嵌套缩进
起因: 这个东西确实也是心血来潮写的, 我很满意里边的实现缩进的机制, 大家有用到的可以看看
现在都是真正的前后端分离了(vue, nodejs, webpack...), 这个东西喜欢就用, 不喜欢就算了~
目前支持的标签有html, head, meta, title, body, input, select/option, form, table, div, 注释, 以及 自定义标签(成对出现的标签), 还有一大堆属性(在下边有介绍)
源码: 码云
看其中的test.php文件,是介绍他的用法
缩进原理介绍:
每个标签我都设计了一个类, 比如 input 标签, 就有一个叫input的类与之对应
每个类里边一般都有以下3个重要成员:
1: 本标签的缩进值
2: 输出本标签最终字符串的方法, out()
3: 给本标签添加子标签的方发, append()
其中append()接收的是子标签的对象, 在最终调用$html->out()的时候, 每个子标签对象里的out()方法会被依次调用, 缩进值也会从上层类传递到最下层类并累加;
另外, 每个类都包含了属性类(calss attribute ), 每个类的缩进值是从属性类里继承而来的, 所以如果修改了属性类里的缩进量, 所有类的缩进量就跟着改变了
你也可以给标签类添加一个自己的缩进值来覆盖统一的缩进值
1. 生成HTML头部的一些标签
1 //生成头部
2 $html = Html::ini()->setLang('en')->setTitle('自动生成HTML文件')->setMetaName('keyword', '自动生成HTML')3 ->css('http://aaa.css')4 ->css('http://bbb.css')5 ->js('http://jquery1.js')6 ->js('http://jquery2.js')7 ->setHead();
2. 生成 table 标签
1 //生成table
2 $data =[3 ['a', 'b', 'c', 'd'],
4 ['a', 'b', 'c', 'd'],
5 ['a', 'b', 'c', 'd'],
6 ['a', 'b', 'c', 'd'],
7 ['a', 'b', 'c', 'd'],
8 ];9
10 $body = newbody();11 $table = table::ini()->setClass('mytable');12
13 foreach ($data as $k1 => $tds) {14 $tr = tr::ini()->setId('tr_'.$k1);15 foreach ($tds as $k2 => $v2) {16 $td = td::ini()->setText($v2)->setId('td_'.$k1.'_'.$k2);17 $tr->append($td);18 }19 $table->append($tr);20 }21
22 $body->append($table);
3. 生成 select/option, 并默认选中其中一项
1 $select = select::ini()->setId('select_id');2 $options = ['a1' => 1, 'a2' => 2, 'a3' => 3];3 foreach ($options as $name => $value) {4 $option = option::ini()->setText($name)->setValue($value);5 $value == 2 && $option->setSelected(TRUE);6 $select->append($option);7 }
4. 将 select / input 加入到 form标签中
1 $form = form::ini()->setId('myform')->setClass('formclass')->setMethod('post')->setAction('http://www.test5.com/submit');2
3 $form->append(input::ini()->setId('a1')->setType('hidden')->setName('a1')->setValue(1));4 $form->append(input::ini()->setId('a2')->setType('text')->setName('a2')->setValue(2));5
7 ...
8
9
10 $form->append($select);
5. 自定义标签(以
为例)1 //自定义标签嵌套(li)
2 3 $ul = tag::ini('ul')->setClass('ul1');4 $li1 = tag::ini('li')->append(label::ini()->setText('li1')); //这里不能直接调用setText()去给li添加文字
5 $li2 = tag::ini('li')->append(label::ini()->setText('li2'));6 $ul->append($li1)->append($li2);7 $body->append($ul);
6. 将标签添加到 body 标签中
//将表单加入body
$body->append($form);
7. 将body标签加入到html标签中, 并返回最终的HTML文档
//将body加入html
$str = $html->setBody($body)->out();
8. 标签中的属性
我这里的方案是定义一个类, 里边有
1. 标签可能拥有的属性
2. 对应的setXxx方法
3. 组装非空的属性拼成字符串的方法
4. 为了不影响下次显示, 会有专门的清空方法, 把之前赋值的属性都清空
这样的话, 在定义标签属性的时候, 需要的就赋上值, 不需要的不赋值就不会在最终的HTML代码中显示出来
1 trait attribute2 {3 //公用
4 private $id = '';5 private $width = '';6 private $height = '';7 private $style = ''; //未用, 建议写成单独的style文件
8 private $disabled = '';9 private $text = ''; //文字内容10
11 //input
12 private $type = '';13 private $name = '';14 private $value = '';15 private $checked = '';16 private $selected = '';17 private $class = '';18 private $placeholer = '';19
20 //tr, td
21 private $colspan = '';22 private $rowspan = '';23 private $align = '';24 private $valign = '';25
26 //table
27 private $caption = '';28 private $thead = '';29 private $tbody = '';30
31 //form
32 private $action = '';33 private $method = '';34 private $enctype = '';35
36 //其他
37 public $indent = ' '; //缩进
38 public $eol = PHP_EOL; //换行
39 public $tag = '';40
41 public $arrOther = array(); //array('data-x' => '123', 'align' => 'left', ...)42 //组装非空属性
43 public function getAttrs(){...}44
45 //清空属性
46 public function init(){...}