欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

来一个Bootstrap的表单标签库,附上附件

程序员文章站 2022-04-06 08:55:27
...
经常用Bootstrap开发后台,搞了一个标签库
namespace Think\Template\TagLib;

use Think\Template\TagLib;

class Bootstrap extends TagLib
{

protected $tags = array(
/**
* id 自定义ID,不定义默认(input+表单name)
* class 自定义class
* help 表单的输入说明 显示再表单下方
* status 当前表单的初始化状态,可选值 :success,error,warning 三个值选其一
* inline 内联表单
* horizontal 水平排列的表单【说明:两个数字,逗号分割,实用这个排列方式需要在表单上面添加 form-horizontal】【示例:horizontal="3,9"】
*/
'text' => array('attr' => array('id', 'class', 'name', 'value', 'label', 'placeholder', 'help', 'status', 'inline', 'horizontal'), 'close' => 0),
'password' => array('attr' => array('id', 'class', 'name', 'label', 'placeholder', 'help', 'status', 'inline', 'horizontal'), 'close' => 0),
'number' => array('attr' => array('id', 'class', 'name', 'value', 'label', 'placeholder', 'help', 'status', 'inline', 'horizontal'), 'close' => 0),
'email' => array('attr' => array('id', 'class', 'name', 'value', 'label', 'placeholder', 'help', 'status', 'inline', 'horizontal'), 'close' => 0),
'url' => array('attr' => array('id', 'class', 'name', 'value', 'label', 'placeholder', 'help', 'status', 'inline', 'horizontal'), 'close' => 0),
'file' => array('attr' => array('id', 'class', 'name', 'label', 'help', 'inline', 'horizontal'), 'close' => 0),
'checkbox' => array('attr' => array('id', 'class', 'name', 'label', 'inline', 'disabled', 'checked', 'default'), 'close' => 0),
'radio' => array('attr' => array('id', 'class', 'name', 'label', 'inline', 'disabled', 'checked', 'default'), 'close' => 0),
/**
* key : value值字段名称,默认id
* text : 显示值字段名称,默认name
*/
'textarea' => array('attr' => array('id', 'class', 'name', 'label', 'value', 'label', 'rows', 'key', 'text', 'horizontal'), 'close' => 0),
'select' => array('attr' => array('id', 'class', 'name', 'label', 'data', 'value', 'key', 'horizontal'), 'close' => 0)
);
private $ids = array();//自动生产ID保存,防止重复

/**
* @param $id string input的ID
* @param $name string input的name值
* @return string
*/
protected function setId($id, $name)
{
return empty($id) ? 'input' . ucfirst($name) . mt_rand(1, 9999) : $id;
}

/**
* 根据表单的状态返回图标和状态
* @param $status 表单当前的状态
* @return array()
*/
protected function inputStatus($attr)
{
switch ($attr['status']) {
case 'success':
$icon = '';
$class = 'has-success';
break;
case 'error':
$icon = '';
$class = 'has-error';
break;
case 'warning':
$icon = '';
$class = 'has-warning';
break;
default:
$icon = '';
$class = '';
break;
}
$icon = empty($icon) ? $icon : $icon . '(' . $attr['status'] . ')';
return array('statusClass' => $class, 'icon' => $icon);
}

protected function wrapDiv($attr)
{
$class = array();
if (!empty($attr['inline'])) array_push($class, 'form-inline');
if (!empty($attr['statusClass'])) array_push($class, $attr['statusClass']);
if (!empty($attr['has_feedback'])) array_push($class, $attr['has_feedback']);
if (!empty($attr['class'])) array_push($class, $attr['class']);
if (empty($attr['typeClass'])) {
//输入类型
array_push($class, 'form-group');
} else {
//选择类型 checkbox radio
array_push($class, $attr['typeClass']);
}
return '
';
}

protected function wrapLabel($attr)
{
$id = $attr['id'];
$width = '';
if (array_key_exists('horizontal', $attr) && !empty($attr['horizontal'])) {
$width = 'col-xs-' . $attr['horizontal'][0];
}
$typeClass = empty($attr['typeClass']) ? 'control-label' : $attr['typeClass'];
return '
';
}

//输出输入类型表单
protected function inputClass($attr)
{
$input = $this->input($attr);
return $this->_return($attr, $input);
}

//去除左右花括号
private function _trim($field)
{
$field = ltrim($field, '{');
return rtrim($field, '}');
}

public function _select($attr)
{
$data = $this->_trim($attr['data']);
$key = empty($attr['key']) ? 'id' : $attr['key'];
$text = empty($attr['text']) ? 'name' : $attr['text'];
$value = $attr['value'];
$id = $this->setId($attr['id'], $attr['name']);
if (strpos($value, '{') !== false) {
$value = $this->_trim($value);
}
$select = '';
return $this->_return($attr, $select);

}

public function _return($attr, $form)
{
//判断是不是水平排列的表单
$horizontal = false;
if (array_key_exists('horizontal', $attr) && !empty($attr['horizontal'])) {
$horizontal = true;;
}
$attr = $this->set_input_attr($attr);
$div = $this->wrapDiv($attr);
$label = $this->wrapLabel($attr);

if ($horizontal) {
return $div . $label . $attr['label'] . '
' . $form . '