YII创建实例常见问题.docx_第1页
YII创建实例常见问题.docx_第2页
YII创建实例常见问题.docx_第3页
YII创建实例常见问题.docx_第4页
YII创建实例常见问题.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.执行yiic命令提示php.exe不是内部或外部命令的解决方法 这个问题困扰我好久,解决的方法是把php.exe这个目录加入系统环境变量,这样就不会提示这样的错误了!还有个问题就是每次执行yiic命令时要把yiic的全路径打出来才行,比如我的yii框架在e:/htdocs里面,我每次执行的时候都要e:/htdocs/yii/yiic webapp yiiblog我们可以把yiic也加入系统环境变量,加入以下代码:假如php.exe这个目录在C:phpC:php;E:htdocsyiiframework此时我们执行yiic再不用打全路径了,这样方便多了.yiic webapp yiiblog2.使用 framework/yiic shell 时报错:root framework#./yiic shellError: index.php does not exist or is not an entry script file.解决方法:frameworkyiic shell ././index.php 其中“././index.php ”yii根目录的文件夹下的index.php,之后就ko了。时区错误:就是要到yii的根目录下去执行。运行YII框架出错 可能是时区设置有问题。解决方法: 比如我们建了一个myblog 应用,那么 到myblog/protected/views/layouts/main.php 加入以下设置:一、从yii权威指中学到的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中显示日志),把日志记录到数据库array(class=CDbLogRoute,logTableName=applog,connectionID=db,),运行时表applog会自动生成,如果不能生成,参照api自已建立如何记录$_GET,$_SESSION等信息,在以上的routes中各个配置中加上filter=CLogFilter,如何记录更详细的信息,能记录stack,在入口文件中加上define(YII_TRACE_LEVEL,10);数字越大,记当的越详细,结果如下15:31:57.226tracesystem.db.CDbCommand Querying SQL: SHOW COLUMNS FROM Bangdan in E:APMSprotectedmodelsBangdan.php (21) in E:APMSprotectedcomponentsHotBangdan.php (21) in E:APMServ5.2.6如果在调试时,终止程序运行且看到日志,不能用die及exit;用application:end,即Yii:app()-end(),其会触发onEndRequest事件,日志就是在这个事件中记录的activeRecord几个占位方法重写的注意点必须带boolean返回值如何发布一个资源文件并引用$css=Yii:app()-getAssetManager()-publish(dirname(_FILE_)./aa.css);yii:app()-clientScript-registerCssFIle($css);如果改变activelable中默认的标题重写方法attributeLabels过滤不良代码$purifier=new CHtmlPurifier;$purifier-options=array(HTML.Allowed=div);$content=$purifier-purify($content);或者beginWidget(CHtmlPurifier); ?.display user-entered content here.endWidget(); ?如何防止重复提交?提交后Ccontroler-refresh();如何在成功后显示一个提示,用户刷新页时去掉提示Cwebuser-setFlash();getFlash();如何分页CPagination代表分页信息,有多少页,每页几条记录等CLinkPager生成分页的代码,自定义css可以给属性cssFile一个值$criteria=new CDbCriteria();$pages=new CPagination(数据库中的总记录数);$pages-pageSize=2;$pages-applyLimit($criteria);/给$criteria-limit offset等符值$posts=Post:model()-findAll($criteria);$this-widget(CLinkPager,array(pages=$pages);列表如何排序$criteria=new CDbCriteria();$sort = new CSort(Post);$sort-defaultOrder= status asc;$sort-applyOrder($criteria);$posts=Post:model()-findAll($criteria);应用时用$sort-link(字段名)实际是生成一个带参数的url,然后在在applyOrder时应用这些参数修改$criteria,得到相应的查寻结果如何生成并验证验证码:基本用法widget(CCaptcha); ? 具体参数查手册原理CCaptcha这个widget会在run时调用当前控制器的$captchaAction=captcha方法,这个方法指到一个类CCaptchaAction其会生成验证码图象,并记入到session中如何显示静态页重写actionshelp=array(class=CViewAction,basePath=help, /指定目录名defaultView=default,viewParam=help /get参数),假定当前控制器是post那么可以能过/post/help/help/content访问help目录下的content.php可以建立子目录比如help/reigterhelp/content.那可以通过/post/help/help/registerhelp.content来访问用CViewAction的好处时,可以与其它的view共享layout关于没有权限访问跳转的url相关当没有权限时调用CAccessControlFilter类中的accessDenied,其调用CwebUser中的loginRequired(),记录当前的returnurl后跳转到CWebUser配置中的loginurl,在此处登陆后,可以通过redirect跳转到returnurl(Yii:app()-request-redirect(Yii:app()-user-returnUrl);)当强制显示登陆表单,比如判断用户是guest就一直列出登陆表单,不会调用loginRequired, 就得不到returnurl,这时候想跳回去,参见cookbook上相关贴子registerCoreScript在framework/web/js/package.php中列出的才是多对多关联条件$criteria-addInCondition(categorys.id,$in);$criteria-addSearchCondition(S,$keyword);$shops=Shop:model()-with(array(categorys=array(together=true)-findAll($criteria);同时要在Shop模型中加入alias=categorys ,另外together=true放在模型的关联中也可YII中的RBAC权限,用数据库存item,在system/web/auth下找到相应的sql导放到数据库中配置authManager = array(class = CDbAuthManager,connectionID = db,),如果在sql中导入的三个表的表名不是默认的,需要在这上边的配置中配置,具体的看api$auth=Yii:app()-authManager;/$auth-createOperation(post,postpost);/$auth-createTask(post,posts);$auth-createRole(post,post);auth-assign(post,demo);if(Yii:app()-user-checkAccess(post)echo yes;elseecho no;这种情况下三者是一样的如何获得上一页的url以返回Yii:app()-request-urlReferrer;accessControl 是Ccontroller中内置的过滤方法,其它的还有ajaxOnly postOnlyCMaskedTextField此组件用于限制用户的输入,对应的jquery插件/projects/masked-input-plugin/在一对多,多对多查询时,the eager loading 联合所有的表生成一条语句,如果主表有limit的查询选项,那么他将单独执行,然后再执行与关联表有关的语句,返回相关表的数据对象,这就是为什么在做大优惠时,以中间表为查询条件出错的原因,解决办法with()返回 CActiveFinder对象,其方法together(),既使主表中有LIMIT/OFFSET 也是返回一条sql;多对多查询时,分页有时候页中显示的条数不正确,因为有重复的项,加上$criteria-group = true即可模型的rules中,验证某个字段不能重复,array(name, unique,message = 有重复的名子),CStatePersister是yii的核心组件,提供了基于文件的数据保存方式,可以不在同的请求中使用COutputCache 即是一个组件,又是一个filter,前者的时候用于在view中缓存内容,后者的时候用于在controller中缓存就是说片段缓存,是把COutputCache当一个widget来用,页面缓存把COutputCache当作一个filter来用动态缓存,用CController的一个方法 renderDynamic($callback);在布署模式的时候,有错误不会有stack样的提示,会显示一个errorxxx的错误如何在程序有错的时候跳到指定的action在components中设置errorHandler=array(errorAction=site/error,),在此action中可以能过Yii:app()-errorHandler-error获得错误信息把字符串分解成数组,并去掉空值preg_split(/s*,s*/,this , is , , a test,-1,PREG_SPLIT_NO_EMPTY )CActiveRecord:exits();判断有没有这样的记录,一般用于添加时,判断某字段有没有重复CActiveDataProvider 一个基于ActiveRecord的数据提供源常用的用法$dataProvider=new CActiveDataProvider(Post, array(criteria=array(),pagination=array(),sort=array(), );ClistView同上结合使用,其中的_view中可以用一个$data的变量,代表当前的model数据如果dataProvider中的pagination,sort设为false,则CliveView中对应的部分也无法使用$this-widget(zii.widgets.ClistView,array(dataProvider = $dataprovider,itemView = _view,template = itemssorterpager,sortableAttributes = array(),);CGridView的使用也结合$dataprovider,用的时候主要是对columns的配置,主要有CDataColumn, CLinkColumn, CButtonColumn and CCheckBoxColumn.具体用法看api总的说来CgridView没有ClistView灵活插入meta信息Yii:app()-clientScript-registerMetaTag(keywords,关键字);Yii:app()-clientScript-registerMetaTag(description,一些描述);CMap:mergeArray() 比array_merge更智能的合并数组,yii中配置的合并用这个CClipWidget 通过ob_start ob_getconent生成一段不显示的内容,可以能过CController:clips访问,如$this-beginWidget(CClipWidget,array(id=name,renderClip=true);可以通过$this-clipsname来显示,其中的renderClip如果为false,则在当前位置不显示内容如果在Model一次验证多个属于,显示不同的内容?如下 后来发现这个不起作有return array(array(title, content, required,message=Please enter a value for attribute.),/ . other rules);获得服务器时间$_SERVERREQUEST_TIME维护程序时,这样子所有的请求转发到一个地方catchAllRequest=array(site/all),根据二级域名缓存array(COutputCache + search,duration = 120,varyByParam = array(q,page),varyByExpression = app()-request-hostInfo,),有多个分站时,同步登陆,基本于cookieuser=array(identityCookie=array(domain=.),allowAutoLogin = true,)如果是基本于sessionsession = array( cookieParams = array(domain = .dayouhui, lifetime = 0),timeout = 3600,),如何使用theme在main.php中配置theme=classic,如何得到前前使用的主题Yii:app()-theme得到名子Yii:app()-theme-name;/*如果防止post跨站攻击*/request=array(enableCsrfValidation=true,),这时候生成的表单要用CHtml:form(),其会写一段代码在cookie中如何让表单验证不驼过的提示为中文在main.php的配置中加上language = zh_CN,如何实现仿google的自动完成功能widget(CAutoComplete, array(name=xxx,url=array(suggestTags),multiple=false,htmlOptions=array(size=50),); ?然后在url指定的地址中的方法中如下输出,即可echo anbnc/CGridView详解这东西在后台比较有用,能加速开发的速度,值得一看CGridView用表格的方式显示数据项每一行代表一个数据项,一列通常代表数据项的一个属性CGridView支持排序和分页,可以用ajax或普通的方式CgridView必序和data provider一起使用最简单的用法$dataprovider = new CActiveDataProvider(Post);$this-widget(zii.widgets.grid.CGridView,array(dataProvider=$dataprovider,);这会用表格的方式显示每一条数据项,每一列是Post的一个属性在显示中带了分页和排序我们可以自定义CgridView:columns属性,以自定义表格列的显示方式这个cloumns如何配置呢?其是一个数组,每一个数组元素对应着一列的配置,可以是字符串或数组1、如果是字符串,格式是name:type:header 后两者是可选的,根据这三个值,创建一个CdatColumn实例其中type参见CFormatter2、如果是数组,其可以实例化CDdataColumn、ClinkColumn,CButtonColumn,CCheckBoxColumn实例,具体实例化哪个由数组中的class指定,默认是CDataColumn2.1,如果class=CDataCloumn则可以指定name或者value,如果指定以value优先用CDataColumn时如何以关联表的数据序列?代码如下:表示可以post关联的author中的username排序列$dataprovider = new CActiveDataProvider(Post,array(criteria=array(with=author,),sort=array(attributes=array(title,create_time,author_id=array(asc=author.username asc,desc=author.username desc,label=作者),);$this-widget(zii.widgets.grid.CGridView,array(dataProvider=$dataprovider,columns=array(title,create_time,array(name=author_id,value=$data-author-username),),);另外CDataColumn还有一个filter属性,如果是空,那么生成一个textfield,如果是数组(键值),则生成一个dropDownlist在当前列的上部,供搜索2.2:如果class=CLinkColumnarray(class=CLinkColumn,label=查看用户,url=Yii:app()-createURL(user/edit)则生成一个连接2.3:如果class=CCheckBoxColumnarray(class=CCheckBoxColumn,name=title,id=select),可以生成一个checkbox供选择,且只能选一个可以配置CGridView:selectableRows 如果是0,则不能选,如果 1,只选一个如果是2或其它值,则可以选多个代码如下:$this-widget(zii.widgets.grid.CGridView,array(dataProvider=$dataprovider,selectableRows=2,columns=array(array(class=CCheckBoxColumn,name=title,id=select), ),2.3:如果class=CButtonColumnarray(class=CButtonColumn,updateButtonUrl=Yii:app()-createUrl(post/edit,array(id=$data-id);,),修改updateButtonUrl为编辑贴子如何用gridview生成一个代搜索的管理列表1、在Model的rules 设定可以搜索的属性array(title, status, create_time, safe, on=search),2、在Model中,添加搜索时的方法public function search()$criteria=new CDbCriteria;$criteria-compare(title,$this-title,true);$criteria-compare(status,$this-status);$criteria-compare(create_time,$this-create_time);return new CActiveDataProvider(Post, array(criteria=$criteria,sort=array(defaultOrder=status, update_time DESC,),);3、 在Controler中,写接受搜索用到的表单的值的方法public function actionAdmin()$model=new Post(search);if(isset($_GETPost)$model-attributes=$_GETPost;$this-render(admin,array(model=$model,);4、在view中用CGridView显示设置好widget(zii.widgets.grid.CGridView, array(dataProvider=$model-search(),filter=$model,columns=array(),); ?以上代码大部分是yii自动生成的,只要做少量修改即可有时候会出现,搜索后页面为空的清况,原因可能是layout/main.php中echo $content外层无div,就是说main.php中必须有一个div包含$content/CListView详解其用列表的形式显示数据,不象CGridView一样,用表格显示数据,CListView用一个 view模板来显示每一条数据其支持排序与分页常用的代码如下array(pageSize=2),);$this-widget(zii.widgets.CListView,array(dataProvider=$dataProvider,itemView=_view,template= summary items pagersorter,sortableAttributes=array(title,create_time=Post Time,),);/CActiveForm详解快速生成表单,支持ajax验证,对于比较复杂的验下最好是自己生成表单,写验证方法常用代码,在Controller中public function actionForm()$post = new Post();if(isset($_POSTajax) & $_POSTajax=post)echo CActiveForm:validate($post);Yii:app()-end();if(isset($_POSTPost)$post-attributes = $_POSTPost;if($post-save()echo 存成功了;$this-render(form,array(post=$post);在view中beginWidget(CActiveForm,array(id=post,/这里与Controller中的ajax对应enableAjaxValidation=true,);?labelEx($post,title);?textField($post,title)?error($post,title); ? error一定要写上,要不不会触发ajax验证labelEx($post,content);?textField($po

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论