October/WinterCMS避坑指南
正式使用WinterCMS开始了第一个项目,这篇内容打算记录在开发中遇到的坑
1. Rules验证错误消息的捕捉问题
在数据验证Validation Rules这篇文章我在Model
下对应的php
文件中Rules[]
添加规则做表单验证,它可以在后台录入时生效,比如常见的标题、Slug等需要唯一的功能需要在这部分做处理。
如果在前端自建的表单或Component组件实现数据存储功能,往往需要独立使用Validator
和ValidationException
这两个系统对象来捕捉验证反馈信息,而在此处需要注意的是它可以受到Model
内置的Rules
规则限制,却不能捕捉到该错误信息,因此我们需要单独在前端处理请求的时候独立设置Rules[]
,而这里的Rules
应该是需要覆盖Model
中的,而不是互补规则。
说来说去有点绕,直接案例吧,在Model中的规则如下
public $rules = [ 'title' => 'required|unique:julian_library_books,award_title', 'slug' => 'required|unique:julian_library_books,slug', ];
表julian_library_books
中的title
和slug
字段唯一且必填,这套规则在后台录入时是没有毛病的。但是如果前端我们再来一段规则component中的规则
$validator = Validator::make( //Data [ 'title' => Input::get('title'), 'slug' => Input::get('slug') ], //Rules [ 'title' => 'required|min:5', 'slug' => 'required|min:5', ] );
在这个规则里配置了title
和slug
必填,并且长度不少于5个字符,如果这时候我们通过component来添加重复的title
或slug
,那么它依旧会被Model
中的unique
唯一规则限制,但是返回的错误是无法在component中被捕捉的。所以正确的写法是覆盖model
的规则
//Rules [ 'title' => 'required|min:5|unique:julian_library_books,award_title', 'slug' => 'required|min:5|unique:julian_library_books,slug', ]
2. 404错误页的问题
建立404错误页非常简单,只需要在CMS中添加一个名为404
的page
,但是要注意用于Model数据展现的page slug
参数不要放在根目录,否则无法捕捉404错误页。
最近补充,自己开发插件需要单独处理404页面,可参考此文《插件开发之404页面处理》
3. 自建插件component的问题
如果component中加入模板中的变量会导致重复无法正常调取数据
4.Blog插件分类的slug问题
默认情况在categoryFilter
这一项中如果写成了:slug
,那么无论如何都无法生效,这时候需要在模板文件中按照下面来修改
categoryFilter = "{{ :slug }}"
5.formWidget开发“the partial _widget.htm not found”的错误
在windows中本地开发时没有发现这个问题,但是上传到服务器(linux)中出现该问题,这是因为formwidgets
下面的文件名需要与类名大小写一致,如
class SolutionBox extends FormWidgetBase
而该文件的文件名也必须是SolutionBox
,大小写一致。
产生这个错误的原因是由于linux中区分文件名大小写,文件名SolutionBox
和类名不一致导致formwidget注册失败而导致系统会默认寻找_field_solutionbox.htm
这个partial
。
6.路有冲突的问题
和第五个问题一样,本地没发现问题,在linux服务器上出现的问题,原因是我在产品列表页使用的路由规则是:/products/:page?
,而在产品内容页使用了/products/:slug
,这使得前端产品内容页面路由失效,目前我把后者products
改成product
冲突消失,一切正常。
7.Apache的运行模式问题
如果你使用apache做服务端,如果运行模式是php-fpm/FastCGI
,而不是Apache 2.0 Handler
,那么程序也无法运行,如何判断这个模式?新建phpinfo();
的文件查看Server API即可。
8.多国语言的BUG
安装完Translate插件后在后台使用Scan for messages会报错octobercms rainlab_translate_messages no such column: found
,这时候需要到数据表中建立个名为found
的boolean
字段类型