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, 注釋, 以及 自定義標簽(成對出現的標簽), 還有一大堆屬性(在下邊有介紹)

 

源碼: 碼雲 

看其中的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(){...}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM