将变量传递给我的default.ctp cakephp

时间:2013-06-19 16:48:48

标签: cakephp view cakephp-2.0 cakephp-2.1 undefined-index

我是cakephp的新手..实际上我有两个问题..第一个是  我在AppController中设置变量以便在其中使用它们 default.thtml中。

public function beforeRender(){

    $id = $this->Auth->user('idUser');

    $this->loadModel('Userinfo');
    $data= $this->Userinfo->find('all',array(
        'conditions' => array('Userinfo.User_id' => $id)
    ));

    foreach($data as $d){
        $product_purchase = $d['Userinfo']['product_purchase'];
    }

    $this->set('userinfo',$product_purchase);
}

所以当我将变量用于我的default.ctp布局时它工作正常..但问题是当我从应用程序注销然后它在我的登录页面上显示此错误

  

未定义的变量:product_purchase

我做错了什么?    我想在这里提到的方式是,在我的登录页面中,我没有使用default.ctp,我认为它与dat无关

第二个问题是我想为特定用户显示特定的菜单项...所以我在我的视图页面中这样做

<?php if ($userinfo == 1){ ?> 
  <li><a href="explorer.html" class="shortcut-medias" title="Media">Media</a> </li>
<?php }else{ //nothing }?>
userinfo中的

值为2 ..但如果其他方法无效..它仍然显示菜单

1 个答案:

答案 0 :(得分:1)

变量product_purchase未初始化

如果先前的查找调用没有结果,则不会定义变量$product_purchase来触发未定义的变量错误。如果没有登录用户,则会出现这种情况:

public function beforeRender(){

    // will be null if there is no user
    $id = $this->Auth->user('idUser');

    // unnecessary find call if there is no user, returning no rows
    $this->loadModel('Userinfo');
    $data= $this->Userinfo->find('all',array(
        'conditions' => array('Userinfo.User_id' => $id)
    ));

    // will not enter this foreach loop as data is empty
    foreach($data as $d){
        $product_purchase = $d['Userinfo']['product_purchase'];
    }

    // $product_purchase is undefined.
    $this->set('userinfo',$product_purchase);
}

对于问题中的代码,只需先修改变量:

public function beforeRender(){
    $product_purchase = null;

$ producut_purchase可能会被覆盖

请注意,如果为此查询返回了多行数据:

foreach($data as $d){
    $product_purchase = $d['Userinfo']['product_purchase'];
}

$product_purchase变量仅包含 last 行的值。

如果只有一个结果 - 使用适当的方法。不要使用find('all') - 使用find('first')。或者考虑到只检索一个字段的事实 - 直接使用field方法:

$product_purchase = $this->Userinfo->field(
    'product_purchase', 
    array('Userinfo.User_id' => $id))
);