PHP的Yii框架使用中的一些错误解决方法与建议
《PHP的Yii框架使用中的一些错误解决方法与建议》要点: PHP应用?此文意在记录 Yii 开发过程中的小问题办理方案,不全面,不权威,不是教程.自己写过,觉得可以办理问题,以后也可能用上,就记记吧. ??? 1. Yii 中 Js 和 Css 文件的引入. //注册 js 文件 Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/project1.js',CClientScript::POS_HEAD); //注册 css 文件 Yii::app()->clientScript->registerCssFile(Yii::app()->baseUrl.'/css/project1.css'); //注册 Jquery 文件 Yii::app()->clientScript->registerCoreScript('jquery'); ??? 2. Yii isNewRecord 修复 if(!$model->isNewRecord) { $db_exist = Post::model()->findByPk($model->id); if($db_exist == NULL) $model->isNewRecord = true; } ??? 3.Yii 生成 隐藏输入域 <?php echo $form->hiddenField($model,'name'); ?> <?php if($model->isNewRecord) echo $form->hiddenField($model,'path',array('size'=>60,'maxlength'=>128,'id'=>'path1')); ?> ??? 4. Yii 生成下拉菜单 echo $form->dropDownList($model,'is_marry',array('0'=>'否','1'=>'是')); ??? 这时候,你看到的就是 是 和 否 的下拉菜单,选择 '是' 提交的时候这个字段填的就是 1,'否' 就是 0 .当然,经常不只这么简单,我们可以在 Model 里面添加一个函数用于生成下拉菜单的数组,然后在 view 里去调用就行了.这个函数的数据可以本身写的,或者在数据库查找得来的.下面用了 listdata,具体意思是以 model 中 id 为 键,name 为值. /* 写在 model 里 */ public function getUserOptions() { $models = User::model()->findAll(); $models = User::model()->findAllByAttributes(array('is_regeister'=>'1')); return CHtml::listdata($models,'id','name'); } /* 写在 view 的界面里 */ echo $form->dropDownList($model,'user_id',User::model()->getUserOptions()); 5.Yii? 开启事务机制 /*开启事务机制*/ $transaction = Yii::app()->db->beginTransaction(); try { /* 成功则 commit */ $transaction->commit(); } catch(Exception $e) { $transaction->rollBack(); } ??? 比拟完整的像这样: if($_POST['ModelA']) { /*开启事务机制*/ $transaction = Yii::app()->db->beginTransaction(); try { /*此处省略一堆逻辑*/ $modelA->save(); $modelB->save(); /* 成功则 commit */ $transaction->commit(); $this->redirect(array('view','id'=>$model->id)); } catch(Exception $e) { $transaction->rollBack(); } } ??? 不外我一般会像下面这样,有什么好处请自行体会... if($_POST['ModelA']) { /*开启事务机制*/ $transaction = Yii::app()->db->beginTransaction(); try { $validated = true; /*此处省略一堆逻辑*/ $valid = $modelA->save(); $validated = $valid & $validated; /*此处继续省略一堆逻辑*/ $valid = $modelB->save(); $validated = $valid & $validated; /* 成功则 commit */ if($validated) { $transaction->commit(); $this->redirect(array('view','id'=>$model->id)); } else { /*不成功即回滚 */ $transaction->rollBack(); } } catch(Exception $e) { $transaction->rollBack(); } } 6.关联表查询相同字段出错. $criteria=new CDbCriteria; $criteria->alias = "post"; $criteria->with = array('user'); $criteria->compare('post.id',$Post->id,true); $model = Post::model()->find($criteria); 7.文件上传 <form action="your url" method='post' enctype="multipart/form-data" id='fileform'> <p style='display:inline-block'>文件上传 </p><input id='file1' name='file1' type='file' ></input> <br /> <input type='submit' value='上传'> </form> ??? 这是服务器端接收并保留文件的代码,文件最后保留到了 attached 文件夹的 file 文件夹里: if(isset($_FILES['file1'])) { $xlsfile = $_FILES['file1']; $tmp_name = $xlsfile['tmp_name']; /*获取文件名*/ $file_name = basename($xlsfile_name); if($xlsfile['error'] > 0) { echo "文件上传出错!请重试.<br />"; exit; } else { if(file_exists("attached/tmp/".$file_name)) echo "文件已存在!本次不予保留!"; else { if(!is_dir("attached/tmp/")) { /*新建文件夹,默认权限 777,true 意味着可以递归从创建*/ if(!mkdir("attached/tmp/",0777,true)) { echo "找不到 attached/tmp 文件夹,且创建失败!<br />"; exit; } } /*这个函数仅用于上传文件的移动*/ move_uploaded_file($tmp_name,"attached/tmp/".$file_name); } } } ??? 下面是把已存在的文件从 old_file 路径移到 attached/file 里面的当前日期文件夹.这里的移动用 rename /*创建文件夹*/ $date = date('Y-m-d',time()); $date = str_replace('-',"",$date); $dir = "attached/file/".$date.'/'; if(!is_dir($dir)) { if(!mkdir($dir,true)) { exit('无法创建文件夹!'); } } /*移动文件*/ $file_name = basename($old_file); $finish = rename($old_file,$dir.$file_name); if(!$finish) { exit('无法移动文件!'); } 8.YIi 场景与平安字段 var_dump($model->scenario); ???? 查看场景的平安字段.平安字段的意思是说这些数据由用户提交的时候不会被 Yii 过滤掉.有次发现网页提交上来的东西有些有有些没,调了很久才知道在那个场景下部分被过滤了. $arr = $model->getSafeAttributeNames($model->scenario); var_dump($arr); ??? 强制赋值避免 rule 规则过滤字段.用 setAttributes 可以强制取消 Yii 的平安过滤,只要第二个参数赋值为 false 就好.但是这也只能对这个 Model 生成时就拥有的字段生效,如果要对包括自己定义的所有字段不过滤,还是要定义场景然后在 rule 里指定平安字段比较好. if(isset($_GET['Po'])) $model->setAttributes($_GET['Post'],false); 检查日期格式合法性 function checkDatetime($dateStr,$format = "Y-m-d H:i:s") { $time = strtotime($dateStr); $checkDate = date($format,$time); return $checkDate == $dateStr; } Yii 渲染多个 model PHP利用
//在 controller 里面
$model=new Person;
/* $addrs 存储 Addr model 的数组,放几个你就看着办吧*/
$addrs = array();
if(isset($_POST['Person']))
{
$model->attributes = $_POST['Person'];
/*此处省略一堆逻辑*/
foreach($_POST['Addr'] as $one_addr)
{
$addr = new Addr();
$addr->attributes = $one_addr;
/*此处省略另一堆逻辑*/
}
}
$this->render('create',array(
'model'=>$model,'addrs' => $addrs,));
//在 view 里面
/*可以循环输出你的多个 model */
$num = count($addrs);
for($i = 0;$i < $num;++$i)
{
echo $form->labelEx($addrs[$i],"[{$i}]postcode");
echo $form->textField($addrs[$i],"[{$i}]postcode",array('size'=>10,'maxlength'=>10));
...;
}
/*也可以通过数字指定输出某个 model */
echo $form->labelEx($addrs[0],"[0]postcode");
echo $form->textField($addrs[0],"[0]postcode",'maxlength'=>10));
《PHP的Yii框架使用中的一些错误解决方法与建议》是否对您有启发,欢迎查看更多与《PHP的Yii框架使用中的一些错误解决方法与建议》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |