PHP生成HTML文件, SummerHtml

2018/06/27 20:19
阅读数 10

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 = 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(){...}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部