Kohana 3.3.1 自定义错误页面

以自定义404页面为例

一、在APP/classes/HTTP/Exception/ 目录下加入404.php,继承Kohana_HTTP_Exception_404类

<?php defined(‘SYSPATH’) or die(‘No direct script access.’);

class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {

/**
 * Generate a Response for the 404 Exception.
 *
 * The user should be shown a nice 404 page.
 * 
 * @return Response
 */
public function get_response()
{
    $view = View::factory('errors/404');

    // Remembering that `$this` is an instance of HTTP_Exception_404
    $view-&gt;message = $this-&gt;getMessage();

    $response = Response::factory()
        -&gt;status(404)
        -&gt;body($view-&gt;render());

    return $response;
}

}
二、在 APP/views/ 目录下新建404.php(这个文件名随便,只要和刚才Exception目录下404.php中载入的view名对应即可)

<?php defined(‘SYSPATH’) or die(‘No direct script access.’); ?>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Page not found</title>
</head>
<body>
<p>404 Page not found</p>
<p><?=$message ?></p>
</body>
</html>

三、在Controller(控制器)适当位置抛出异常

比如我的 APP/classes/Controller/info.php,在action_detail()中,发现request中请求的id参数在数据库中并不存在时(Model查询返回FALSE),抛出异常。

if(!$info) {
throw HTTP_Exception::factory(404, ‘info number is invalid’, array(
‘:uri’ => $this->request->uri(),
));
}

 

这就妥妥了,其他错误码或转向之类的也差不多,查文档可知。

jquery在iframe加载完成后执行函数的正确方法

之前看网上资料说是这样:

$(‘#iframe’).load(function(){
$(‘#iframe’)[0].contentWindow.XXX();
})

实际测试后发现load并没有被触发,说明这个实际是在iframe已经加载完成后才绑定的,所以并未触发。又继续一顿搜索,有个老外给出了解决方法:

$(document).ready(function() {
var iFrame = $(‘#iframe’);
iFrame.bind(‘load’, function(){
$(‘#iframe’)[0].contentWindow.XXX();
})
})

原因暂时未明,回头继续查查资料为什么这样。

Kohana3.3自定义Validation验证错误信息

Kohana官方的文档中没有给出Validation自定义错误信息的方法,网上搜索了一下,老外给出了一些例子,不过都是基于ORM的,对ORM不喜,觉得有点过度包装,因此项目中没有使用。

那么没有使用ORM应该如何自定义验证错误信息呢?读了下system下Validation类的源代码终于搞明白了,下面给出代码片段供参考:

$validation = Validation::factory($this->request->post())
->rule(‘mobile’, ‘not_empty’)
->rule(‘mobile’, ‘regex’, array(‘:value’, ‘/^1d{10}$/‘))
->rule(‘password’, ‘not_empty’)
->rule(‘password’, ‘regex’, array(‘:value’, ‘/^[a-zA-Z0-9]{6,16}$/‘));
//验证不通过
if(!$validation->check()) {
$errors = $validation->errors(‘member’);
$this->response->body(View::factory(‘login’)
->bind(‘post’, $post)
->bind(‘errors’, $errors));
}

注意,其中“$errors = $validation->errors(‘member’);”就是获取验证错误提示信息的地方,而errors函数中接收的参数’member’则是说明错误信息从“application/messages”目录下的member.php文件中读取并匹配。需要说明的是这个文件并不是类,所以文件名不需要首字母大写,参数与文件名一致即可。

application/messages/member.php的内容比较简单,返回对应的数组即可。

<?php defined(‘SYSPATH’) OR die(‘No direct script access.’);

return array(
‘mobile’ => array(
‘not_empty’ => ‘手机号码不能为空’,
‘regex’ => ‘手机号码不正确’,
),
‘password’ => array(
‘not_empty’ => ‘密码不能为空’,
‘regex’ => ‘密码长度在6位~16位’,
),
);
 

Kohana 3.3.1中Controller和Controller_Template的区别

官方文档实在是语焉不详,因为Kohana起源于CI,而CI中并没有Controller_Template这个东西,顿时有些摸不着头脑。

然后查看了Kohana-v3.3.1/system/classes/Kohana/Controller/Template.php之后总算明白了,Controller_Template继承自Controller,然后只是多了将$template指向的view自动render()的功能(在成员函数::after()中)。

<?php defined(‘SYSPATH’) OR die(‘No direct script access.’);
/**

  • Abstract controller class for automatic templating.
    *
  • @package Kohana
  • @category Controller
  • @author Kohana Team
  • @copyright (c) 2008-2012 Kohana Team
  • @license http://kohanaframework.org/license
    */
    abstract class Kohana_Controller_Template extends Controller {

    /**

    • @var View page template
      */
      public $template = ‘template’;

      /**

    • @var boolean auto render template
      **/
      public $auto_render = TRUE;

      /**

    • Loads the template [View] object.
      */
      public function before()
      {
      parent::before();

      if ($this->auto_render === TRUE)
      {

       // Load the template
       $this-&gt;template = View::factory($this-&gt;template);
      

      }
      }

      /**

    • Assigns the template [View] as the request response.
      */
      public function after()
      {
      if ($this->auto_render === TRUE)
      {

       $this-&gt;response-&gt;body($this-&gt;template-&gt;render());
      

      }

      parent::after();
      }

}
 

工作环境转VIM

实在忍不了那个连中文输入都成问题的sublimetext2了!不开源自己又写不好,也不当作bug来解决,这么傲慢好像全世界就剩一种编辑器了。

全面换VIM,反正一开始总要不习惯的,用几天就会好的,vimtutor来了好几遍现在已经逐渐上手了。vim

GVim菜单显示不正确、乱码的解决方法(Fedora 19)

装完gvim之后发现菜单全是乱码和空白,一开始以为是用的那个超强vimrc的缘故。后来查了资料发现竟然是语言文件的问题,文件名中的utf8和utf-8的区别造成了无法识别。

进入gvim目录下的lang目录(我的是 /usr/share/vim/vim74/lang),将语言文件做一个软链接,命令如下:

ln -s menu_zh_cn.utf-8.vim menu_zh_cn.utf8.vim

重新打开gvim后一切恢复正常。

[caption id=”attachment_223” align=”aligncenter” width=”726”]gvim gvim[/caption]

smarty提示“syntax error: unrecognized tag”错误的解决方法

smarty中使用{}作为定界符,如果模板中包含了其他的{}就会造成解析错误,实际上这种情况很常见,比如模板中有内联js,写了点小函数之类的。

解决的方法有3种,只推荐最方便的那种:在包含错误标记的代码外加上{literal}{/literal}标签,因为smarty报错的时候会提示行号,所以很容易找到出错位置。下面是例子,在smarty中使用打了bsie补丁的bootstrap报错的解决方法:

{literal}
<script type=”text/javascript”>
(function($){
$(document).ready(function() {
if ($.isFunction($.bootstrapIE6)) $.bootstrapIE6($(document));
});
})(jQuery);
</script>
{/literal}

其他的解决方法如果有兴趣请自行参考文档:

传送门1 传送门2

PHP调试时获取函数定义所在文件

PHP函数名是大小写不敏感的,有些写的不规范的程序在查找函数出处时就会有麻烦。

如果用grep来找,一定要加-i参数以便忽略大小写。

另外还有一种方法,将这条语句加入执行的php中:

Reflection::export(new ReflectionFunction(‘函数名称’));

这样页面就会输出函数定义所在的文件了。

Function [ function 函数名称 ] { @@ /home/wwwroot/test/include/global.fun.php 285 - 294 }

Fedora19中开启NetBeans 7.4的字体反锯齿

NetBeans的安装路径是 /usr/local/netbeans-7.4/

用vim打开安装路径下的配置文件 etc/netbeans.conf,注意要sudo。

找到下面这行:

netbeans_default_options=”-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true”

在括号最后添加上反锯齿选项,最后变为:

netbeans_default_options=”-J-client -J-Xss2m -J-Xms32m -J-XX:PermSize=32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true&nbsp;-J-Dswing.aatext=true -J-Dawt.useSystemAAFontSettings=lcd”

因为是只读文件,所以用“:wq!”保存,然后重启NetBeans后就能看到效果了~