让Yii表单生成器不依赖Model

我也不知道标题该怎么写才能描述我要说明的问题,意思就是可以放 Yii 的表单生成器功能更加灵活。 默认的 Yii 的表单生成器只需要这样就可以了: $form = new CForm('application.views.site.loginForm', $model); 这里的 application.views.site.loginForm 也可以是配置数组。但是如果$model 参数不传的话是会报错的:Fatal error: Call to a member function isAttributeSafe() 比如我要生成一个组表单,但是我不想依赖于 model,根据配置就可以生成一组表单该怎么办,google 一下,http://www.yiiframework.com/forum/index.php/topic/6839-cform-model/ 这个帖子受到启发! 默认生成的表单的 label 是根据$model->attributes 来显示的,所以我做了 2 件事: 继承 CFormInputElement 覆盖 renderLabel 方法,将 label 显示成自己配置的 element 的 label 继承 CForm 覆盖 renderElement 方法,$element instanceof UCFormInputElement,并覆盖 render 方法,将 Elements 和 getButtons 循环输出 直接上代码: app/protected/extensions/UCForm.php <?php /** * @author Ryan <yuansir@live.cn/yuanxuxu.com> */ class UCForm extends CForm { public function render() { $output = $this->renderBegin(); foreach ($this->getElements() as $element) { $output .

阅读全文

Yii中实现插件机制

其实在 Yii 中,一个插件的模块可以通过 Widget 或者 Module 来实现。后来考虑到希望做成 Wordpress 那样,可以安装,卸载,配置,甚至灵活实现权限和菜单的控制,所以抽空研究了下 Wordrpress 的插件实现机制,并集成到 Yii 中。不过最终和同事讨论以后还是决定改造 Module 来实现的插件机制,这里记录一下 Wordrpress 的插件思想集成到 Yii 中的过程。 类似 Wordrpress 的钩子机制插件原理主要就是:注册钩子,放置钩子,运行钩子,不多说,直接上代码。 1.新建 app/protected/components/UPlugin.php <?php /** * 插件机制 Component */ class UPlugin extends CApplicationComponent { public $pluginDir = ''; private $_listeners = array(); /** * 初始化 */ public function init() { parent::init(); $plugins = $this->getActivePlugs(); if ($plugins && is_array($plugins)) { foreach ($plugins as $plugin) { $path = $this->pluginDir . $plugin['directory'] .

阅读全文

公司的客服系统是用 Yii 开发的,权限系统是基于 Yii CDbAuthManager 开发的,随着权限项目的增加和权限组以及人员的增多,导致加入页面的时候打开很慢,因为没进入一个页面会去检查一下该用户对于该操作的权限。下面是用XHProf查看的结果部分截图,会发现CDbAuthManager::checkAccess 和CDbAuthManager::checkAccessRecursive 等CDbAuthManager 方法会调用很多次,而 CDbAuthManage 是基于数据库,所以每次调用还要去进行数据库的查询,这样难免会给性能带来瓶颈。(该图只要关注第一和第二列就可以了,其他列是优化过的结果且本机的测试数据库)。 利用 Redis 加速 Yii CDbAuthManager 再来看下CDbAuthManager::checkAccessRecursive这个方法的实现,这个方法会去递归的查询数据库来验证用户的授权项目。 protected function checkAccessRecursive($itemName, $userId, $params, $assignments) { if (($item = $this->getAuthItem($itemName)) === null) return false; Yii::trace('Checking permission "' . $item->getName() . '"', 'system.web.auth.CDbAuthManager'); if ($this->executeBizRule($item->getBizRule(), $params, $item->getData())) { if (in_array($itemName, $this->defaultRoles)) return true; if (isset($assignments[$itemName])) { $assignment = $assignments[$itemName]; if ($this->executeBizRule($assignment->getBizRule(), $params, $assignment->getData())) return true; } $parents = $this->db->createCommand() ->select('parent') ->from($this->itemChildTable) ->where('child=:name', array(':name' => $itemName)) ->queryColumn(); foreach ($parents as $parent) { if ($this->checkAccessRecursive($parent, $userId, $params, $assignments)) return true; } } return false; } CDbAuthManager的其他对授权项目的操作都是基于数据库的读写,具体源码实现:http://code.

阅读全文

PHPexcel 官方下载以后,放入Yii 的 protected\extensions\phpexcel下面 try { spl_autoload_unregister(array('YiiBase', 'autoload')); $phpExcelPath = Yii::getPathOfAlias('application.extensions.phpexcel.PHPExcel'); include($phpExcelPath . DIRECTORY_SEPARATOR . 'IOFactory.php'); spl_autoload_register(array('YiiBase', 'autoload')); $objPHPExcel = PHPExcel_IOFactory::load($File['path']); $sheetData = $objPHPExcel->getActiveSheet()->toArray(null, true, true, true); } catch (Exception $e) { echo $e->getMessage(); Yii::app()->end(); } 上面的代码就是载入 PHPExcel,同时引入 IOFactory.php,这里需要注意的是需要重新设置 outoload,spl_autoload_register(array(‘YiiBase’, ‘autoload’)); $objPHPExcel 获取这个句柄以后就可以对 excel 进行操作了,具体读取的一些方法可以参照官方的示例和文档 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: Yii 集成 PHPExcel 读取 Excel 文件 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

CGridView 是 Yii Framework Zii 的组件, 以表格的形式显示数据,CGridView 也支持分页和排序,CGridView 最基本的用法和 ListView 类似,通过设置 data provider。 GridView 缺省显示了所有的字段,并使用缺省的格式显示字段,如果需要控制字段显示和格式,可以通过配置 CGridView::columns属性来实现。GridView 的每列为一个 CGridColumn 对象: CGridColumn 为所有 Grid 列表项的基类,表格的每例可以有一个表头,多个数据单元,和一个可选的表尾单元格。 CButtonColumn 表示该单元格为一个或多个按钮,缺省显示三个按钮, “view”, “update” 和”delete”,可以通过设置 buttons 和 template来更改。 CCheckBoxColumn 表示该单元格为 Checkbox,支持只读,单选或多选,通过配置selectableRows来修改 CDataColumn 表示该单元为数据或是表达式,通过配置name或value,前者表示数据模型的属性名称,后者代码一个 PHP 表达式。 CLinkColumn 表示一个超链接,通过配置 label , url或 imageUrl来设置链接。 示例代码: model public function allBranchs() { $criteria = new CDbCriteria; $criteria->with = 'parent'; return new CActiveDataProvider($this, array( 'criteria' => $criteria, )); } view

阅读全文

YII 开发小技巧(Tips)(转)

感觉蛮有用的,转过来看看。 db 组件 ‘schemaCachingDuration’=>3600, 为什么不起做用? 需要开缓存 如何在页面下边显示 sql 的查询时间 在 log 组件的 routes 中加入 array( ‘class’=>’CProfileLogRoute’, ‘levels’=>’error, warning’, ) 同时在 db 组件中加入 ‘enableProfiling’=>true, 同时在这种情况下,可以用 CDbConnection::getStats() 查看执行了多少个语句,用了多少时间 如何知道某一个程序段运行需要的时间 配置好 CProfileLogRoute 后,在需要测试的地方加上 Yii::beginProfile(‘blockID’); //程序段 Yii::endProfile(‘blockID’); ‘enableParamLogging’=>true,的作用是? 在日志的 bind 的参数后边跟数的值 如何在页面底部显示所有的 db 相关的日志 同上,配置 log 组件的 routes 中加入 array( ‘class’=>’CWebLogRoute’, ‘levels’=>’trace, info, error, warning’, ‘categories’ => ‘system.db.*’, //’showInFireBug’ => true, 将在firebug中显示日志 ), 把日志记录到数据库

阅读全文

使用 Yii 的 Active Record 来获取查询结果的时候,返回的结果集是一个对象类型的,有时候为了数据处理的方便希望能够转成数组返回。比如下面的方法: // 查找满足指定条件的结果中的第一行 $post=Post::model()->find($condition,$params); // 查找具有指定主键值的那一行 $post=Post::model()->findByPk($postID,$condition,$params); // 查找具有指定属性值的行 $post=Post::model()->findByAttributes($attributes,$condition,$params); 返回一条结果的时候直接用 $post->attributes; 就可以了。 Post::model()->find()->attributes 如果返回的是多条结果,返回的是一个对象数组的时候有下面 2 种方法: //第一种直接将结果循环输出 foreach ($myReceivedCode as $model) { $result[] = $model->attributes; } //第二种用array_map $result= array_map(function($record) { return $record->attributes; }, Post::model()->->findAllByAttributes($attributes)); 转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记 如果觉得本篇文章对您十分有益,何不 打赏一下 本文链接地址: Yii Active Record 查询结果转化成数组 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

阅读全文

作者的图片

Ryan是菜鸟 | LNMP技术栈笔记

一步一个脚印,一直在路上!记录LNMP技术栈,Web架构,区块链等笔记

菜鸟码农

南京