Wednesday, November 19, 2008

Cake PHP 学习备忘录

 

2

Posted in Cakephp, VC & PHP by DYH1919(Freshow) at 04月 23, 2008
Tags: Cakephp   欢迎引用、转载、修改,在转载时附上本文URL即可。

你的数据库中的表也应该遵循下面的命名规则:

● cake使用的表名(Table name)应该有英文的复数形式组成,比如users, authors, articles. 注意,对应的model是单数形式

● 所有的表 都必须有一个主键叫做 id

● 如果你需要关联tables,使用外键比如 article_id 。表的名字是单数,必须是小写,比如id

● 另外,最好遵从下面的命名规则以便更方便的使用某些功能

Include a ‘created’ 列

Include a ‘modified’列

UltraEdit 32 中高亮显示 CakePHP 的 视图(View),.ctp ,同理可扩展其它自定义后缀:

找到 UltraEdit 32 的 安装目录,打开 wordfile.txt 找到 253 行,在后面添加上 CTP 就行了。

例如:/L3″HTML” HTML_LANG Nocase Noquote Block Comment On = <!– Block Comment Off = –> File Extensions = HTM HTML SHTML HTT HTA HTX CFM JSP PHP PHTML ASP CTP

在CakePHP 中使用自定义全局变量,常量,全局函数等全局性东西:(/app/config/bootstrap.php),另一个办法是在 app 目录重载 app_controller.php,这样可以让全局函数。

Bootstrapping CakePHP

If you have any additional configuration needs, use CakePHP’s bootstrap file, found in /app/config/bootstrap.php. This file is executed just after CakePHP’s core bootstrapping.

This file is ideal for a number of common bootstrapping tasks:

  1. •Defining convenience functions
  2. •Registering global constants
  3. •Defining additional model, view, and controller paths

数据库乱码

app\config\database.php中设置 ‘encoding’ => ‘utf8′;

更新单个表项或多个表项时要指明 id ,如果不指明则是插入新行

$this -> Controller -> id = $this -> Session -> read('id');

$this -> :Controller -> id = $this -> Session -> read(’id’);

$this -> :Controller -> saveField(’actived’,'Y’)

saveField() 和 save()

上面也是说在 CakePHP 中如何使用 Update 这样的效果

显示乱码:

可以修改 view 文件夹下的 模版文件,添加:

$html -> charset(”UTF-8″);

Session使用:

Controller :$this->Session->write($key,$value); $this->Session->read()…..

使用数组:$dataArray1 = array (’g'=>$generalfile,’b'=>$bigfile,’s’=>$smallfile,’m'=>$minifile);  $this -> Session -> write($dataArray1);

View:$session->read($key);…..

function afterSave()
{
// mail me when a new bookmark is added
mail('example@example.com', 'Bookmark saved to database');
return true;

}


不使用 layout: $this-> layout = false;


Model 名和数据库名不对应:var $useTable = 'Table Name';


==============


setFlash

string $flashMessage


string $layout = ‘default’


array $params


string $key = ‘flash’


将变量$flashMessage中的信息写入Session(提供给之后的flash()方法来获取)。


如果$layout设置为“default”,该消息被存储为’<div class=”message”> ‘.$flashMessage.’</div> ‘.如果$default设置为”,该消息就按原样保存。如果参数为其他任何值,该消息以 $layout 所指定的格式保存在Cake view里.



新增 我收集、整理的一些 CakePHP 学习资料:这里下载 [2008.5.6]


原文地址:http://www.oblank.com/?p=475 转载时请不要删除本地址





CakePHP V1.2 中 Session 丢失修正方法。



0



Posted in Cakephp, VC & PHP by DYH1919(Freshow) at 04月 15, 2008


Tags: Cakephp, session   欢迎引用、转载、修改,在转载时附上本文URL即可。



CakePHP V1.2 中,即使在 ./cake/app/config/core.php 设置 Session.start 值为 true




Configure::write(’Session.start’,true);




Session 也会在刷新,离开本页,甚至于在 Controller 中使用了 redirect() 时丢失,翻遍了互联网也没找到答案,询问 Cake Google Group 也没有很好的 fix 方案。今天再通过 Subversion 从 V1.2.0.6331 升级到了 V1.2.0.6661 ,可问题仍没有解决。 后来想到看一下 CakePHP 的 libs 库文件或许可以解决问题,于是找到了 ./cake/cake/libs/controller/components/ 目录下的 session.php 文件,发现里面有一个变量 var $__started = false; 将它改为 true 后再测试,Session 一切正常,不会再丢失。 比较理想的修正方法: 1,将 ./cake/app/config/core.php 的 session.start 设为 true:




Configure::write(’Session.start’,true);




2,拷贝 ./cake/cake/libs/controller/components/ 目录下的 session.php 到 ./cake/app/controller/components 下,然后将 session.php 中的 var $__started = false; 设值为 true即可:




var $__started = true;




为什么要复制文件到 ./cake/app… 目录下呢?这是因为 app 是用户目录,而 ./cake/cake…. 是 CakePHP 的核心文件,一般不能修改,以方便以后升级使用。复制到 app 目录,可以通过重载的方法实现 fix bug 。 顺便提一下,session components 是每个 Controller 的默认组件,使用时不需要再次包含进去。



下面这部分是写给外国佬看的,英语好的绕道:



How to fix session gone/lost in CakePHP V1.2.x



I have got the bug(maybe!) ,fix steps :



first:confige session autostart in ./cake/app/config/core.php



Configure::write(’Session.start’,true);



then,copy the ’session.php’ file in ./cake/cake/libs/controller/components/ To ./cake/app/controller/components And set the var __started value to true, as below:



var $__started = true;



it work fine for me, help hope it useful



GooglGroup 关于这个问题的修正的完整讨论看这里



原文地址:http://www.oblank.com/?p=450 转载时请不要删除本地址





Subversion 安装记录



0



Posted in Subversion, VC & PHP by DYH1919(Freshow) at 04月 15, 2008


Tags: Apache, Cakephp, Subversion   欢迎引用、转载、修改,在转载时附上本文URL即可。



CakePHP Session 一直不能持久化,几天来用蹩脚的英语在Cakephp Google Group 上求助得来的方法都不起作用,后来看到似乎是将 Cake 从 V1.2.0.6113 升级到了一个新版本才算解决了问题,在 CakePHP 的 Svn 看到已经有了 1.2.0.6661,希望也可以通过升级来解决,于是就得用到了 Subversion 这个版本控制软件。



说起 Subversion ,以前在 Eclipse 中使用过插件,但也就是这个插件让我的 Eclipse 崩溃,所以这次不准备使用插件了而改用客户端。



SVN 的最新版是 1.4.6 ,但不能与 Apache 2.2.x 搭配,我先是在官方提供的“built against Apache 2.2.x ”下载“svn-1.4.6-setup.exe”,安装发现根本不能在 Apache 2.2.4 上使用,又下载“svn-win32-1.4.6.zip”,按照网上一些教程进行手动设置,费掉了九牛二虎之力也没能解决。



最后又下载“Subversion modules svn-1.4.6 available”,但安装到最后才发现它的教程很模糊,其间又有提到集成方案“EasyCM_0.8.0_Server_Win32”,(包括Apache-2.0.59、subvertion-1.4.4、TortoiesSVN-1.4.4),安装时发现 Apache 和 subversion 版本都很低,没道理我在返回去使用低版本的软件(宁愿做只小白鼠!),所以都跳过只安装了 TortoiesSVN 和 Python 2.4。



后来又在官方的“built against Apache 2.2.x ”下载了一个 Python 2.4 ,最后发现已经可以使用了,不过网上提到教程那些 浏览器中访问什么什么的我这里同样不能,只是右键菜单多了很多 SVN 方面的操作,也是前面的 TortoiesSVN 图形化软件。



经实验,能够成功能过 Subversion 从 CakePHP 获取最新版。



总结一下:回顾这个安装过程,安装 EasyCM 的 TortoiesSVN 、Python2.4 和最后安装 “svn-python-1.4.6.win32-py2.4.exe” 是关键。

Sunday, November 16, 2008

如何在cakephp的布局文件中包含多个模板?

2008/10/23

cake中的布局(layout)确实不错,可惜不能包含多个模板文件(view)进来。
前几天在网上看到一个实现方法,http://www.xuzhousoft.cn/content/view/48/1/ ,看了一下代码,是用helper来实现的,感觉有点费劲。从代码看,其view文件中应该不支持$session,$html之类的了。
下面介绍一款简单实用的方法。先来看看cake的layout是如何实现下面这个的:

1 <?php echo $content_for_layout; ?>

在cake/libs/view/view.php中有个方法叫做: function renderLayout()其中有$data_for_layout如下:

01 <?php
02 $data_for_layout = array_merge($this->viewVars,
03 array(
04 'title_for_layout' => $pageTitle,
05 'content_for_layout' => $content_for_layout,
06 'scripts_for_layout' => join("\n\t", $this->__scripts),
07 'cakeDebug' => $debug
08 )
09 );
10 ?>

也就是说实现的数据都是准备好的,从这一点上来讲就很难扩展了,因为变量就那么几个啊。
下面介绍一个方法,看代码:

01 <?php
02 /**
03 * 引入其他view文件,在layout中支持多个view
04 *
05 * @param string $name 在view目录下的文件
06 * @return string
07 *
08 */
09 function template($name) {
10 $s = addslashes( ROOT.DS.APP_DIR.DS.'views'.DS.$name.'.ctp' );
11 return "require(\"$s\");";
12 }
13 ?>

将这个函数添加到你的项目中去,然后在你的layout中添加如下代码即可包含多个view:
view/layout/default.ctp

1 ...
2 <?php
3 //包含模板 include you template
4 eval(template('elements'.DS.'hello'));
5 ?>
6 ...

view/elements/hello.ctp

1 <?php
2 echo 'yes!';
3 //可以支持controller中声明的所有变量和helper
4 echo $session->read('Login.name');
5 ?>

呵呵,很简单吧!

Friday, November 14, 2008

Trouble shooting

Warning (2): Cannot modify header information - headers already sent by (output started at 


F:\Prj_PHP\1.2.x.x\app\config\routes.php:61) [CORE\cake\libs\controller\controller.php, line 587]


Code | Context



$status	=	"Location: http://localhost/posts/view/1"


header - [internal], line ??
Controller::header() - CORE\cake\libs\controller\controller.php, line 587
Controller::redirect() - CORE\cake\libs\controller\controller.php, line 568
BidsController::add() - APP\controllers\bids_controller.php, line 25
Object::dispatchMethod() - CORE\cake\libs\object.php, line 114
Dispatcher::_invoke() - CORE\cake\dispatcher.php, line 259
Dispatcher::dispatch() - CORE\cake\dispatcher.php, line 213
[main] - APP\webroot\index.php, line 90


(default) 4 queries took 53 ms



Nr

Query


Error


Affected


Num. rows


Took (ms)



 



I found some tips from internet:



> Well I'm not surely what exactly is going on but I did have a similar

> problem the other day.


> First of all I would recommend keeping DEBUG set to 2 until you've got


> rid of the issue - at least then if there's an error message you'll see


> it.


> My problem was simply some extra whitespace before the <?php tag in my


> controller. The redirect function uses the PHP header function which


> must be called before ANYTHING is sent to the browser. Extra whitespace


> outwith PHP tags in your controller, or in any other file being


> included will prevent the redirect. This a common reason for redirects


> not working.



 



And I finally found it hide in router.php, which have many blank spaces after  ?>

Thursday, November 13, 2008

什么是ActiveRecord

ActiveRecord是什么:

1. 每一个数据库表对应创建一个类.类的每一个对象实例对应于数据库中表的一行记录; 通常表的每个字段在类中都有相应的Field;

2. ActiveRecord同时负责把自己持久化. 在ActiveRecord中封装了对数据库的访问, 即CRUD;

3. ActiveRecord是一种领域模型

说实话,从去年开始用SubSonic, 我就一直有点困惑, 什么是ActiveRecord, 什么不是ActiveRecord, 以及应该怎么样使用它才对. 把我的一些想法写下来, 希望能和大家交流.

ActiveRecord是什么:
1. 每一个数据库表对应创建一个类.类的每一个对象实例对应于数据库中表的一行记录; 通常表的每个字段在类中都有相应的Field;
2. ActiveRecord同时负责把自己持久化. 在ActiveRecord中封装了对数据库的访问, 即CRUD;
3. ActiveRecord是一种领域模型(Domain Model), 封装了部分业务逻辑;
ActiveRecord不是什么:
1. Row Data Gateway
Row Data Gateway模式中每个对象也封装了数据库记录的状态和持久化到数据库的访问方法; 这两个有时候很难区分. 细微的区别在于Row Data Gateway不封装任何业务逻辑;
2. TableGateway
TableGateway是一种数据访问模式, 对每个表有一个类, 类的方法封装了对单个表的数据操作, 如CRUD; 方法的接受表字段的值作为参数;
比如说对表Person有DAOPerson, 有以下方法:
int Create(string name, bool isMale)
DataSet Find(int personId)
void Delete(int personId)
void Update(int personId, string name, bool isMale)
微软的很多代码示例中使用了此模式;
ActiveRecord的区别在于ActiveRecord的对象中保持了记录的值, 是有状态的, 而TableGateway是没有状态的, 只是一系列数据库访问方法的集合;
3. Table Module
Table Module是一种领域逻辑模式, 一个类对应于数据库中的一个表; Table Module通常和Table Gateway合作, 前者负责基本的业务逻辑, 后者负责数据库访问, 以达到逻辑层和持久化层的隔离; 微软的实例代码经常使用这两者, 如对表Person, 通常会定义两个类, PersonBL和PersonDB, 在PersonBL中处理验证等逻辑, 并调用PersonDB访问数据库, 层间调用使用DataSet或自定义数据传输对象传输数据
在业务逻辑比较简单并且有和表的一一对应时, ActiveRecord相对来说更简单, 因为它在一个类中包括了业务逻辑对象和数据访问, 而且不需要数据传输对象, 减少了维护的工作量;
和Table Module比较起来, ActiveRecord与数据库耦合更紧;
ActiveRecord适用于:
1. 业务逻辑比较简单;当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的, 即你的业务逻辑大多数是对单表操作;
2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script), 把跨表事务提升到事务脚本中;
3. ActiveRecord最大优点是简单, 直观; 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了;
4. 这些优点使ActiveRecord特别适合web快速开发, 而正是快速开发框架ROR采用了ActiveRecord, 并且很多类ROR框架如Castle的纷纷效仿才使ActiveRecord重新进入大家视线;
我想这也是为什么Martin Fowler在PoEAA中早就提出了这个模式, 但是直到最近两三年ActiveRecord才热起来可能就是这个原因;
ActiveRecord不适合于
1. ActiveRecord虽然有业务逻辑, 但基本上都是基于单表的. 跨表逻辑一般会放到当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script)中. 如果对象间的关联越来越多, 你的事务脚本越来越庞大, 重复的代码越来越多, 你就要考虑Domain Model + O/R Mapper了;
2. ActiveRecord保存了数据, 使它有时候看上去像数据传输对象(DTO). 但是ActiveRecord有数据库访问能力, 不要把它当DTO用. 尤其在跨越进程边界调用的时候, 不能传递ActiveRecord对象;

Feedback

2008-05-09 11:04 by 怪怪

不错, 很准确, 赞一个。
另外, 这个模式只是在POEAA中介绍过, 并非Fowler提出的(其实Fowler这辈子, 基本没提出过什么自己的东西); 这种用法也早就普遍存在了, 只是最近一热炒, 就被人为放大了。
不过我个人认为,ActiveRecord虽然提供了便利性, 同时也会带来思维方式和实践方法上的禁锢和负面影响, 所以并不总是提高, 有时也会降低生产效率。这是因为从根本上讲, 有时候我们并不真的需要一个有着固定接口的对象或者类。
回头说到SubSonic, 说实话其作者可能比园子里一些做框架的同志水平还菜很多, 但是SubSonic在很多场景下确实轻量、好用, 这反而是我们的同志应该好好思考的了。

2008-05-09 11:56 by wanghualiang

@怪怪
为什么说作者水平菜?
是代码写的有问题还是架构不是很合理?
没看过源码,但用在项目上了,很简单很好用。

2008-05-09 12:26 by jackyw [未注册用户]

SubSonic提供了很好用的代码生成工具,框架也比较轻量级
是比较好的实现了ActiveRecord模式的框架2008-05-09 12:56 by lovecherry      

在SubSonic之前也看到过buildprovider做orm的demo,但是SubSonic对作者把它做成了产品

#7楼 [楼主]   回复  引用  查看    

2008-05-09 13:37 by kuber      

@怪怪
任何方法都有其要解决的问题域, 我想是因为最近两年Web 2.0热导致的快速的web应用开发大行其道使ActiveRecord被重新注意了.
另: 好久没有看见怪怪有新的文章了. 我很喜欢"闲言碎语"这篇文章. 不过里面好像还有很多未竟之言, 我还等着下文呢.

2008-05-09 13:44 by designbeauty

第一次听见有人说Rob菜的。。。,那正常的人应该是什么水平。
btw. subsonic真的很好用很强大。 楼主可以分享一下经验

2008-05-09 15:10 by 怪怪      

@金色海洋(jyk)
没时间啊..., 而且感觉江郎才尽, 白活不出什么有价值的内容了。 倒是今天早上无缘无故的感觉到一阵喜悦, 似乎有些事更明白了, 但暂时又说不清楚明白了什么。 反正接触的东西越多, 感觉需要学的东西和需要做的工作就更多了。
@kuber
嗯, 可以这么说。 不过其前提是在面向对象或者基于对象的设计和实现方式下。 我对AcitveRecord、 Row Data Gateway、 DTO等等一些方法的质疑, 实际上更多的是针对面向对象的一些痼疾了。
比如就这种CRUD较多的场景, 不采用这些方式, 很显然光写代码时的类型转换, 和数据字典存取的安全性和便捷性, 就够我们一呛。而采用这些方式呢, 通过对象我们就得到了一组固定的接口, 要么接口太多, 要么接口太大, 且不说什么性能和维护的问题,损失掉的灵活性和直接性也非常可惜; 如果再通过新增接口去适配不同的场景, 除了显配一下自己的面向对象功力, 很多时候只是徒增麻烦。
只是我也仅仅在探索阶段, 说些怪话的目的只是抛砖引玉, 呼吁大家一起来看看有啥新的路子没有,而不是局限于过去那些旧的观点和争论。那篇文章之所以写不下去了, 关键是在现有的语言框架下, 我还没找到能完全满足我的想法的设计和表达方式,感觉还需要琢磨一阵子。 如果仅仅是一些小的改进, 感觉说起来也没啥意思~
@designbeauty
呵呵, 菜不菜的也要看那些方面。 我是指对概念的理解和掌握的技巧这两方面。 我看过他的一些Video, 说实话此人对很多概念是相当的模糊; 也用过和改过一阵子SubSonic,这个东西涉及的技巧也绝对比不上园子里一些高手的东西。
不过就像@lovecherry说的, 人家在做产品这一块, 可一点也不菜, 我还是相当的佩服的。另外, 去你网站看了, 很漂亮啊, 至少我很喜欢这种风格, 唉感觉设计还是比技术需要更多的天赋。

2008-05-09 16:34 by good man      

其实在这里我们应该对别人多鼓励,不能说菜不菜,你应该
把别人的错误找出来,达到共同学习,一起进步啊

2008-05-09 16:37 by RicCC      

ActiveRecord的主要优点是一个过渡模式,当你没法从失血一步走到充血模型,或者不大确定是否该这样做时,是一种比较好的选择
另外就算使用充血模式的复杂项目,还是会存在很多适合ActiveRecord的对象
我想当你ActiveRecord使用熟练之后思路应该会不大一样,选择范围会比较开阔

2008-05-09 17:07 by 怪怪      

@good man
哈哈, 这不是个老外吗, 他又不会跑博客园来, 跑来也不认识中文~ 另外, 我一向对名人比对咱一般的兄弟要求严格的多, 可以说刻薄了~
@RicCC
写的比较乱, 重新编辑一下, 两点:
1. 在面向对象这个大前提下, AcitveRecord、 Row Data Gateway、 DTO等形式是否是必要的。
是不是一定要将数据包裹以任何一种形式的对象的方式来处理, 我觉得也是可以有多种判断方式的;比如对于最简单的CRUD系统,或许可以根据在于我们在展示与持久之间,需要(比如各种逻辑包括业务逻辑产生的)手工编码操作数据的次数(和工作)来进行选择?如果在其它地方下功夫(如操作和流程的自动化),可以使得没有对象化而导致的问题小于一个限度, 我们也许就没有必要对象化。
这个问题的根本在于首先要确认我们手头的这个活儿,是否在大模型(不是我们常说的模型)上真的需要将数据对象化, 还是可以用其它模型更好的解决。
2. 如果其实现的核心不是面向对象特性, 比如说利用FP的特性, 或者在支持TMP的语言里。
如果我能得到使用某一方式方法的一切好处, 避免它基于面向对象实现时的缺陷, 根据其特征, 也许各种方式方法还可以分别叫做 AcitveRecord、 Row Data Gateway、 DTO, 但由于不再带有面向对象令人不爽的阴暗方面,那么也许进行选择和判断就容易的多。
如果能够做到, 而且成本很低, 那么也许我们可以忽略这个问题, 长期的按一定规则使用某些方式方法, 这样就可以更加集中注意力解决其它问题。

Monday, November 3, 2008

加拿大老人的幸福生活从房屋开始

www.comefromchina.com
和中国老人们的消费观念不同,加拿大的老年人有钱有闲,穿的最漂亮的,最受尊敬和爱护的就是老人。老年人也自然一直是商家很看重的一片市场。房屋开发商当然 也不会放过这个市场,近年来更是投其所好,开发不少针对老年人的楼盘。公寓的居住生活正在悄然改变老年人退休后的生活方式。
八成人希望提前退休
加拿大老年人协会市场高级副主席David Cravit表示,50岁以上的人群正成为增长迅速、开销额度大的消费群体,他们正在改变着加拿大的经济前景,对各行各业都产生了不可或缺的影响。
很多公司都对这个市场制定了特殊战略,例如Home Depot就针对性的开发了“独立生活项目”,为房主提供灵活性的服务和产品,它可以提供和安装特殊的产品,例如斜坡、可调整的橱柜、活动吧台等,生活因此变的更加简单。和以前相比,现在50岁以上的老人可以更加弹性和舒适地生活。
不知道是代沟还是现实,最近有一项调查,“您希望在多少岁退休?”年龄段在30岁左右的被调查者中,只有20%的人希望在56岁至60岁退休;年龄段在50岁的被调查者中,只有12%的人希望在56岁至60岁退休。看来,现在的退休年龄已经不太接近现实了。
这已经成为一种生活趋势,在30至49岁的人群中,21%的人希望退休后可以过更有意义自由的生活,在50岁以上的人群中,有这种想法的占到36%。
根据对50岁以上人群的调查,34%的人表示,退休后最重要的就是多和家人相处;其次是投身于自己的兴趣爱好,这占到32%;16%的人希望去旅游。
地区和性别的差异也有不同的影响,居住在大西洋省的人,最愿意退休后把时间花在陪伴家人上,占到43%的比例;有趣的是,40%的女性表示,退休后的首要安排就是多和家人相处,而只有26%的男性有这样的想法,他们更多的关注自我,36%的男性希望可以从事自己的兴趣爱好,只有28%的女性这么打算。
大多数50岁以上的加拿大人都对现状表示满意。当被问及,“如果不用考虑钱的问题,退休后您想居住在什么地方?”59%的人希望仍居住在现有的环境里;17%的人希望可以两地迁徙居住;11%的人希望环游世界,不需要固定居所;只有3%的人希望能和全家迁移他国豪宅。
老人换房:省心获利
Royal LePage对50岁以上人群的调查显示,50岁以上的加拿大人超过一千万,这个人口统计的结果,对全国的房屋市场会有一定的影响。
针对这个人口变化的情况,Royal LePage地产投入一个新项目,组建了老年地产专门设计服务组(SRES),这个设计组是经过北美地产认证的。Royal LePage将成为加拿大第一个通过认证的机构,进而成为合格的供应者。这也使得它的经纪们能更好的面对市场的变化,满足50岁以上人群的需求。
Royal LePage地产主席及CEO Phil Soper称,以往的几代人,退休会带来的情况都可以预想到,而现在50岁以上的人群更有自己多样的想法,他们讨厌一成不变的模式,寻找更好的更适合自己的生活方式。而这个SRES项目就是第一时间接触市场,对50岁以上人群进行整体分析和服务,帮助他们计划、讨论销售房屋。
目前,有28%五十岁以上的加拿大人计划出售他们的房屋,以此作为他们老年生活重新安排的一个部分,在这部分人群中,卖房的主要原因如下:
房屋太难打理:67%;
享受房屋增值带来的利益:46%;
计划旅游,无力照顾房子:38%;
没有能力生活自理:30%;
无力支付目前的房屋:23%;
这些五十岁以上的潜在售房者对售房后的计划也不同:37%的人想搬进一个更小的房子,更容易管理,并可以坐享房屋的增值。86%的人想用增值的部分支持退休生活,48%的人想用于旅游,42%的人想留给孩子,7%的人打算用于购买休闲娱乐设施。
原来,50岁以上的人搬家,一般都是选择较小的房子,搬去与孩子同住,或者搬进有人照顾的老人院。而现在50岁以上的老人彻底改变这一状况,他们重新定义了这部分人群想要的生活。由于生命的不断延长,现在的老人有了更多的财富和更好的身体,50岁以上的人群有更多样的选择,而不会只选择一种最好的。
银行:倒按揭以房养老
面对这个大趋势,一些金融机构也有所动作,例如TD银行,针对这些成熟可靠的顾客,他们提供了更多新的服务和产品。现在比较流行的做法是倒按揭,即“住房反向抵押贷款”,说简单点就是“以房养老”。其放贷对象是有住房的老年人,以其自有住房作抵押,银行定期向借款人放贷,到期以出售住房的收入或其他资产还贷。其特点是分期放贷,一次偿还,贷款本金随着分期放贷而上升,负债增加,自有资产减少。由于这种方式与传统的按揭贷款相反,故被称为“倒按揭”。
据了解,这种模式是上世纪80年代中期美国新泽西州一家银行创立的。如今,美国模式的“倒按揭”在加拿大也很受欢迎。美国的倒按揭贷款放贷对象是62 岁以上的老年人,分三种形式发放,联邦住房局有保险的住房倒按揭贷款、联邦住房局无保险的倒按揭贷款、放贷者有保险的倒按揭贷款。
“倒按揭”可以使老人们每个月有充裕的养老金支配,外出旅游、聘请护理等,基本生活得到保障的同时,还能享受生活的乐趣。通过正确的理财,退休一点都不会影响收入和生活质量。
在婴儿潮中,55%的人坦言,房屋是他们退休后的重要收入来源。
低收入:老有所居
加拿大“老有所居”的问题是不是就不成问题了呢?答案应当是:基本上不成问题,但并非全部解决。这是因为:富裕国家也有贫困人口,有些老人(包括早年移民来加的华人)老来没有住房的情况也还是有的;即便是那些已经拥有自有住房的老人,因其年老,在身体健康状况和心理上出现新情况,新需求,因而在“住”的问题上也还需要政府和社会重新加以解决。
在多伦多,低收入人士可以申请房屋补助,获得廉租屋或住房津贴;老年人则主要由公款资助的大多市房屋管理局、大多市房屋公司和多伦多房屋机构等单位根据老人护理需求的程度,提供多种多样的居所:
Senior’s Apartment (高龄人士公寓单位)。入住这里的老人基本上能照顾自己。这些老人公寓多半混杂于其它公寓之间,以便获得照料。
Retirement Home (退休人士房屋)。入住老人大体上能照料自己,但每天需要约一个小时左右的医护照顾。这里有医护人员值班,或有医生定期到访。
Home for the Aged (老人屋)。入住者差不多都是没有独立生活能力的老人,饮食起居和健康状况都需要由他人来照顾。
Nursing Home (护理安老院)。这是提供给那些饮食起居和健康状况都需要长期照顾的老人居住的。主办者主要是私营公司或教会、慈善机构和社区团体,诸如为华人耆老和残障人士提供服务的非牟利机构——多伦多耆晖会等。
上述的老人居所无论是政府主办还是私营和社团主办的,全都不是免费的。当然,交不起房租的低收入老人可以申请住房补助。
对于移民赴加的“团聚父母”来说,住满十年之后,不但可以获得每人每月大约900加元左右的老人保障金,还可以根据身体健康状况、个人意愿和需求,申请入住这些老人公寓或老人屋等老人居所。
一直以来,加拿大都享受“老人天堂”的美誉。而这美好的生活,就从房屋开始。