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