本篇文章介绍的是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() ?>
欢迎小伙伴们前来讨论!

PHP yii框架FormWidget组件的更多相关文章

  1. yii框架的理解

    Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一. yii框架里 ...

  2. Yii 框架学习--01 框架入门

    Yii 是一个高性能的,适用于开发 WEB2.0 应用的 PHP 框架. Yii目前有两个主要的版本: 2.0 和 1.1.本文以YII 2.0.7为例. 环境需求 Yii2.0 框架有一些系统上的需 ...

  3. yii框架详解 之 CWebApplication 运行流程分析

    在 程序入口处,index.php 用一句 Yii::createWebApplication($config)->run();  开始了app的运行. 那么,首先查看 CWebApplicat ...

  4. yii框架

    Yii Framework是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一.Yii是创始人 ...

  5. YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

           YII 框架源码分析    百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...

  6. Yii框架中集成phprpc、hprose

    在项目开发的过程中有时候会涉及到对外提供接口供第三方程序调用或者是不同程序间需要相互通信,那么最通用的做法是用传统的SOAP方式来实现,用XML的文档格式来作为传输载体.但是这种方式不灵活,支持的数据 ...

  7. Yii框架tips(转)

    yii的一些小的技巧 http://www.yiichina.com/topic/151 db组件 'schemaCachingDuration'=>3600, 为什么不起做用?需要开缓存 如何 ...

  8. Yii框架tips

    db组件 'schemaCachingDuration'=>3600, 为什么不起做用?需要开缓存 如何在页面下边显示sql的查询时间在log组件的routes中加入 array('class' ...

  9. YII框架开发一个项目的通用目录结构

    YII框架开发一个项目的通用目录结构: 3 testdrive/ 4 index.php Web 应用入口脚本文件 5 assets/ 包含公开的资源文件 6 css/ 包含 CSS 文件 7 ima ...

随机推荐

  1. php操作数据库获取到的结果集mysql_result

    判断取出的结果集是否为空集: $sql="select adminPwd from adminaccount"; //判断查询是否有数据 if(mysqli_num_rows($r ...

  2. AWS S3 递归上传文件和递归下载文件, 以及S3之间拷贝文件夹

    1. 递归上传文件: aws s3 cp 本地文件夹 s3://bucket-name -- recursive --region us-east-1 2. 递归下载S3上的文件夹: cd  本地下载 ...

  3. 设计模式之架构型MVC,MVP,MVVM模式

    一.MVCMVC,Model View Controller,是软件架构中最常见的一种设计模式,简单来说就是通过Controller的控制去操作Model层的数据,并且返回给view层展示.View跟 ...

  4. python 函数split()

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...

  5. django——文本编辑器

    在博客项目中,为了支持用户的在线编辑博客,我们选用了kindeditor这个强大的编辑器. 以下是对kindeditor的简介,以及在Django中引入这个编辑器的方法:) 1.KindEditor是 ...

  6. Tarjan求割点(割顶) 割边(桥)

    割点的定义: 感性理解,所谓割点就是在无向连通图中去掉这个点和所有和这个点有关的边之后,原先连通的块就会相互分离变成至少两个分离的连通块的点. 举个例子: 图中的4号点就是割点,因为去掉4号点和有关边 ...

  7. 转 MYSQL InnoDB Record, Gap, and Next-Key Locks

    http://dev.mysql.com/doc/refman/5.0/en/innodb-record-level-locks.html InnoDB has several types of re ...

  8. vector, map, queue,set常用总结

    #include<bits/stdc++.h> using namespace std; vector<,); 定义一个大小为9,初始化全是1的vector数组 set<int ...

  9. 关于finally代码块是否一定被执行的问题

    一般来说,只要执行了try语句,finally就会执行 但是,有以下几种情况需要特殊考虑 具体例子看链接  点击这里 第一点 try代码块没有被执行,意思就是错误在try代码块之前就发生了. 第二点 ...

  10. bootstrap-treeview分级展示列表树的实现

    html页面: 要引用 "/webapp/common/css/bootstrap-treeview.css" "/webapp/common/js/bootstrap- ...