2015-04-27 84 views
1

我試圖改變CGridView小部件的CSS文件上獲得的財產,在我config/main.php嘗試將非對象的Yii 1.1.15

'components' => array(
    'widgetFactory' => array(
     'widgets' => array(
      'CGridView' => array(
       'cssFile' => Yii::app()->request->baseUrl . '/css/gridview.css', 
      ), 
     ), 
    ), 
    ... 

我也得到警告:

Trying to get property on a non object /path_to_project/protected/config/main.php on line 79 

我如何可以抑制這個警告,爲什麼我得到它,當我在視圖文件中使用它時,它一切正常。

P.S.是的,我可以設置display_errors ini設置爲false,消息將消失,但我想清楚地知道它。謝謝!

回答

4

警告的原因是CHttpRequest對象Yii::app()->request尚未實例化。

the API page for CApplication:處理 用戶請求時

CApplication將經歷如下生命週期:

  1. 負載應用程序配置;
  2. 設置錯誤處理;
  3. 加載靜態應用程序組件;
  4. onBeginRequest:預處理用戶請求;
  5. processRequest:處理用戶請求;
  6. onEndRequest:後處理用戶請求;

從生命週期3開始,如果發生PHP錯誤或未捕獲的異常,應用程序將切換到其錯誤處理邏輯並跳到步驟6。

您的錯誤發生在第一步。因此,Yii的錯誤處理尚未完成。唯一的選擇是使用@ operator來禁止這種警告:

'cssFile' => @Yii::app()->request->baseUrl . '/css/gridview.css', 

無論其

這是一個可怕的想法,因爲你基本上是隱藏了錯誤,而不是修復它的。

如果被正確地(無CSS錯誤)顯示你的意見,你可以省略Yii::app()->request->baseUrl,只需使用:

'cssFile' => '/css/gridview.css' 

如果遇到錯誤,可以在擴展您的components文件夾中創建一個類CWidgetFactory並設置依賴於其他部件如這裏

class MyWidgetFactory extends CWidgetFactory { 
    public function init() { 
     parent::init(); 
     $this->widgets['CGridView']['cssFile'] = Yii::app()->request->baseUrl.'css/gridview.css'; 
    } 
} 

你需要的任何變量調整components使用此文件:

'components' => array(
    'widgetFactory' => array(
     'class' => 'MyWidgetFactory' 
    ... 
相關問題