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字段类型