PHP yii框架FormWidget组件

本篇文章介绍的是PHP yii框架Form组件,方便在view层更好调用此功能,话不多说上代码:
1、先继承yii本身Widget类
<?php
/**
* User: lsh
*/

namespace system\widgets;

use system\helpers\SysHelper;
use yii\base\InvalidCallException;
use yii\helpers\ArrayHelper;

class Widget extends \yii\base\Widget
{
/**
* 标题
*/
public $title;

/**
* 名称
*/
public $name;

/**
* 提示
*/
public $placeholder;

/**
*
*/
public $readonly;

/**
* css class
*/
public $cssClass;

/**
* css style
*/
public $cssStyle;

/**
* 控件属性数组
*/
public $attr = [];


public function init()
{
// $this->initAttr();
}

protected function initAttr()
{
//初始化属性
$this->attr = ArrayHelper::merge($this->attr, [
'id' => $this->name,
'name' => $this->name,
'placeholder' => $this->placeholder,
'class' => $this->cssClass,
'style' => $this->cssStyle,
'readonly' => $this->readonly
]);
}

/**
* 把属性数组转为html
* @param $attr array 属性数组
* @return string
*/
public function attrToHtml($attr = [])
{
$html = '';
if (is_array($attr)) {
foreach ($attr as $k => $v) {
if ($v !== null && $v !== '') {
//处理布尔型
if (is_bool($v)) {
$v = $v ? 'true' : 'false';
}
$html .= $k . '=\'' . $v . '\' ';
}
}
}
return $html;
}
}
2、重写及继承Widget类
<?php

namespace system\widgets;

use system\helpers\StringHelper;
use yii\base\ErrorHandler;
use system\helpers\SysHelper;

class FormWidget extends Widget
{
/**
* 父form
*/
public $form;

/**
* 布局方式
* inline-内联
* horizontal-水平
*/
public $inline;
public $horizontal;

/**
* 纵向布局元素栅格参数
*/
public $colClass = 6;

/**
* css class
* 默认添加 form-control
*/
public $cssClass = 'form-control';

/**
* 提示
*/
public $tips;

/**
* 标题加粗
*/
public $titleBorder = true;

/**
* suffix 后缀
*/
public $suffix;

/*
* 字段 Label 列宽度
*/
public $colWidth;



public function init()
{
if ($this->form) {
$this->inline = $this->form->inline;
$this->horizontal = $this->form->horizontal;
}

parent::init();
}

/**
* form列布局
* @param $widgetHtml string
* @return string
*/
public function html($widgetHtml)
{
$html = '';
if ($this->title) {
if (property_exists($this, 'validate') && strrpos($this->validate, 'required')) {
$this->title = '<span class="text-red">*</span>' . $this->title;
}
$labelClass = 'control-label';
if ($this->horizontal) {
if(is_numeric($this->horizontal)){
if($this->colWidth){
$labelClass .= ' col-md-'.$this->colWidth;
}else{
$labelClass .= ' col-md-'.$this->horizontal;
}

}
else{
$labelClass .= ' col-md-2';
}
}
$html = StringHelper::strFormat('<label class="{1}">{0}:</label>', $this->title, $labelClass);
}

if ($this->inline) {
$html .= $widgetHtml;
} elseif ($this->horizontal) {
if($this->suffix){
$html .= StringHelper::strFormat('<div class="{1}">{0}</div><div class="col-md-1">{2}</div>', $widgetHtml, 'col-md-' . $this->colClass, $this->suffix);
}
else{
$html .= StringHelper::strFormat('<div class="{1}">{0}</div>', $widgetHtml, 'col-md-' . $this->colClass);
}
}
else {
$html .= StringHelper::strFormat('<div class="row"><div class="{1}">{0}</div></div>', $widgetHtml, 'col-md-' . $this->colClass);
}

if ($this->tips)
$html .= StringHelper::strFormat('<span class="help-block">{0}</span>', $this->tips);

if ($this->form)
$html = StringHelper::strFormat('<div class="form-group">{0}</div>', $html);

return $html;
}

/**
* 子类重构方法,设置控件html
*/
public function getWidget()
{
}

/**
* 渲染控件
*/
public function renderItem()
{
$this->initAttr();
$widgetHtml = $this->getWidget();
$html = $this->html($widgetHtml);

return $html;
}

/**
* 魔术方法, 以string形式返回控件
*/
public function __toString()
{
return $this->run();
}

/**
* widget()方法自动调用
*/
public function run()
{
try {
return $this->renderItem();
} catch (\Exception $e) {
ErrorHandler::convertExceptionToError($e);
return '';
}
}

public function width($width)
{
if (!empty($this->cssStyle)) {
$this->cssStyle .= ';';
}
$this->cssStyle .= 'width:' . $width . 'px';

return $this;
}

public function tips($tips)
{
$this->tips = $tips;
return $this;
}

public function inline()
{
$this->inline = true;
return $this;
}

public function horizontal()
{
$this->horizontal = true;
return $this;
}

public function suffix($suffix){
$this->suffix = $suffix;
return $this;
}

public function colWidth($colWidth){
$this->colWidth = $colWidth;
}

}
3、以Radio为例,先创建Radio类,继承FormWidget
<?php
namespace system\widgets;

use system\helpers\StringHelper;
use system\helpers\SysHelper;
use yii\helpers\ArrayHelper;

class Radios extends FormWidget
{
/**
* @var 值
*/
public $value;
/**
* @var 描述
*/
public $desc;
/**
* @var 是否选中
*/
public $isChecked;

public function getWidget()
{
$this->attr = ArrayHelper::merge($this->attr, [
'type' => 'radio',
'class' => '',
'value' => $this->value,
'desc' => $this->desc
]);
$attr = $this->attrToHtml($this->attr);
return StringHelper::strFormat('<input {0} {1}/> {2}', $attr, ($this->isChecked ? 'checked' : ''), $this->desc);
}

}
在Form类里引入就可以了,如下所示
<?php
namespace system\widgets;

use system\helpers\StringHelper;
use Yii;
use yii\helpers\ArrayHelper;

class Form extends Widget
{

  
    /**
* Radios类
*/
private $radioClass = 'system\widgets\Radios';


/**
* @param $title string 标题
* @param $name string 控件名称
* @param $desc string 描述
* @param $value string 值
* @param $options array widget radios属性
* @param $isChecked bool 是否选中
* @return Radios|string
*/
public function radios($title, $desc, $name, $value = '0', $isChecked = false, $options = [])
{
return Yii::createObject(ArrayHelper::merge($options, [
'class' => $this->radioClass,
'title' => $title,
'desc' => $desc,
'name' => $name,
'value' => $value,
'isChecked' => $isChecked,
'form' => $this,
]));
}

}
估计有的童鞋看到了一个
StringHelper::strFormat方法,代码如下
/**
* 格式输出字符串
* */
public static function strFormat()
{
$args = func_get_args();
$format = array_shift($args);

preg_match_all('/(?=\{)\{(\d+)\}(?!\})/', $format, $matches, PREG_OFFSET_CAPTURE);
$offset = 0;
foreach ($matches[1] as $data) {
$i = $data[0];
$format = substr_replace($format, @$args[$i], $offset + $data[1] - 1, 2 + strlen($i));
$offset += strlen(@$args[$i]) - 2 - strlen($i);
}

return $format;
}
4、在view里直接实例化Form类,调用此方法就可以了
<?= $form->radios() ?>
欢迎小伙伴们前来讨论!

猜你喜欢

转载自www.cnblogs.com/lees410/p/10276130.html