cakephp controller中设置viewVars时的陷阱

要从controller传递变量到view,需要使用set method。基本的用法是


$this->set('categories',$categories);

 

更顺手的写法是


$this->set(compact('categories'));

 

多个变量时可以这样写


$this->set('categories',$categories);
$this->set('category',$category);

 

也可以这样写


$this->set(array('category','categories'),array($category,$categories));

 

更顺手的写法是


$this->set(compact('category','categories'));

 

因为set会检查输入的参数来做不同的应对:


function set($one, $two = null) {
   $data = array();

   if (is_array($one)) {
      if (is_array($two)) {
         $data = array_combine($one, $two);
      } else {
         $data = $one;
      }
   } else {
      $data = array($one => $two);
   }

   foreach ($data as $name => $value) {
      if ($name === 'title') {
         $this->pageTitle = $value;
      } else {
         if ($two === null && is_array($one)) {
            $this->viewVars[Inflector::variable($name)] = $value;
         } else {
            $this->viewVars[$name] = $value;
         }
      }
   }
}

 

我不用framework时也会在写一个类似的method来实现这种灵活的变量传递。但需要注意的是cakephp中有这个步骤


if ($two === null && is_array($one)) {
   $this->viewVars[Inflector::variable($name)] = $value;


 

陷阱就在这里。当我们使用compact来给set传递一个array参数时,将被设置的变量名会被作一些额外的处理。

set(compact(‘category’))是完全没问题的,在view中可以得到$category。但如果set(compact(‘category_id’)),在view中得到的变量叫做$categoryId,而非$category_id。

如果我们要在view中得到的变量名为$category_id,就只能老老实实的写


$this->set('category_id',$category_id);

 

Related posts:

  1. CakePHP 实例教程: Categories Acts as Tree Tree是CakePHP 1.2的核心Behaviors之一,可以用来轻易的实现无限极分类,并呈现树状列表。 图片来源:Tree traversa,WIKIPEDIA 基础实例 建立数据表 CREATE TABLE `categories` (...
  2. Alpha’s Categories Widget for wordpress 近来用Wordpress做一个小站,需要象Joomla一样能按Section展示多组分类。下了一个Breukie’s Categories Widget插件达成了这一功能。但当我随后升级到Wordpress 2.8的时候,这个插件却不能完好的支持。看了一下源码,原来Wordpress 2.8变更了Widgets的实现方法。于是只好自己动手,写了这个增强的Categories Widget插件:Alpha’s Categories Widget。 利用Alpha’s Categories...
  3. Joomla JPromoter and JReviews Hack “JPromoter”:joomlaequipment.com/content/view/4/19/ 是一个Joomla的SEF entention,用于把形如 @/index.php?option=com_content&task=view&id=9&Itemid=75@ 这样的地址转换成 @/the-news/latest-news/curabitur-convallis-laoreet.html@ 。 就像wordpress旧时的一些版本一样,这种转换不支持中文。需要自己做一些修改。 h3. 安装JPromoter...
  4. cakephp 1.2 theme var $view = 'Theme';//themes directory var $theme = 'teline';//theme...
  5. cakephp 1.2 bake Ruby on rails的用户多数会在第一时间爱上它的命令行操作。cakephp也内建了一个简单的baker,可以用来执行新项目创建、配置数据库文件以及MVC的分别生成。 下载cakephp解压之后,可以在cake/console目录下找到cake.bat。建议把这个目录添加到系统PATH。 p(clipnote). windows下添加目录到系统path的操作:桌面,我的电脑,右键,属性,高级,环境变量,系统变量,PATH,编辑。 h3. 创建一个新的项目 cmd进入到你希望放置新项目的目录 cake...
Twitter Digg Delicious Stumbleupon Technorati Facebook

No comments yet... Be the first to leave a reply!