• 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(){...}
  • 相关阅读:
    day06 数据类型的内置方法(数字类型和字符串)
    day 05 流程控制(if、while、for)
    day04 交互、格式化输出、运算符
    day03 python运行、变量、注释、内存管理、数据类型
    day02 编程语言
    动手实现hashmap
    顺时针打印矩阵
    反转链表-用二重指针解决
    面试经验--携程测试开发工程师--一面
    linus提到过的单链表删除节点算法
  • 原文地址:https://www.cnblogs.com/iLoveMyD/p/9235828.html
Copyright © 2020-2023  润新知