本篇文章介绍的是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. 在js中网页面写入数据时需要注意的几点

    网页代码 <tbody id="t_gun"> <s:iterator value="gunList" status="st&quo ...

  2. The Triangle(DP-数塔问题)

    题目链接:http://poj.org/problem?id=1163 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number ...

  3. 利用NSE脚本检测域传送和证书透明度滥用

    nslookup -type=NS <domain> <server> nmap -p 53 --script dns-zone-transfer --script-args ...

  4. java之微信支付通知

    微信支付,是现在大多数平台都需要接入的一个支付方式,没办法,谁让现在的用户都习惯了这种消费方式呢 我今天只说说微信支付通知,我们后台怎么接收通知,并把我们的订单的状态改为已支付, 至于为什么不说支付的 ...

  5. Leetcode 记录(201~300)

    实习面试前再完成100题,争取能匀速解释清楚题 204. Count Primes 素数筛 class Solution { public: int countPrimes(int n) { ) ; ...

  6. SpringMVC用到的jar包

    SpringMVC用到的jar包 自己搭建一个SpringMVC框架时需要用到相应的jar包,参考下载网址: http://repo.spring.io/release/org/springframe ...

  7. IOS开发中获取当前WIFI的名字

            ifs = [self fetchSSIDInfo]; ssid = [ifs objectForKey:@"SSID"]; self.sSIDTxt.textFi ...

  8. 关于MDN,HTML入门来自MDN文档

    由开发者和作者组成的开源社区:推动web发展, MDN(Mozilla Developer Network) 维基,共同维护做贡献: 需要使用到github账号进行验证,以此再创建MDN账号: HTM ...

  9. springmvc 学习资料

    https://github.com/brianway/springmvc-mybatis-learninghttps://www.bilibili.com/video/av18288362?from ...

  10. sql基本

    SELECT: select * from table select 列名 from table select DISTINCT 列名 from table INSERT: insert into t ...