PHP生成HTML文件, SummerHtml
2018-6-27 20:13:04 星期三
作用: 用PHP生成HTML文档, 支持标签嵌套缩进
起因: 这个东西确实也是心血来潮写的, 觉得里边的实现缩进的机制还不错, 大家有用到的可以看看
现在都是真正的前后端分离了(vue, nodejs, webpack...), 这个东西喜欢就用, 不喜欢就算了~
目前支持的标签有html, head, meta, title, body, input, select/option, form, table, div, 注释, 以及 自定义标签(成对出现的标签), 还有一大堆属性(在下边有介绍)
缩进原理介绍:
每个标签我都设计了一个类, 比如 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 = new body(); 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. 自定义标签(以<li>为例)
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 attribute 2 { 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(){...}