2013-02-12 51 views
1

我想構建一個窗口小部件,它可以作爲一個小框包含在不同的視圖中。CakePHP針對窗口小部件的最佳實踐

小部件是一個顯示錶格(Model)「Xyz」中某些行的表格;某些行(根據用戶權限)是可編輯的(用戶可以更改它們的值)。

實現這樣一個(簡單)事情(我是CakePHP的新手)的最佳方式是什麼?
特別是:

在哪個文件
  1. 我應該把演示代碼(通常是.ctp),以允許它被包含在其他的意見?

  2. 在哪個文件中應該放置用於檢索數據和準備演示代碼變量的代碼?通常它應該去一個控制器,但是我可以從另一個控制器包含/調用一個控制器方法。

  3. 在哪個文件中應該放置處理POST請求的代碼?

+0

如果你想在每個頁面中包含一些東西,請將它包含在default.ctp文件夾中(在'views/layout'文件夾) 您可以調用其他控件oller函數使用requestAction方法或簡單地鏈接該控制器和動作 – Deadlock 2013-02-12 10:49:26

回答

0

簡言之

  1. 應用/瀏覽次數/元件/ fancy_element.ctp然後將其包含在應用程序/查看/佈局/ default.thtml中
  2. 應用/控制器/ AppController.php

    class AppController extends Controller {

    function beforeFilter() { 
        parent::beforeFilter(); 
        $this->set(
         'cool_variable', 
         $this->YourMethodOrComponent->action($params) 
        ); 
    } 
    

    }

  3. 隨着您的業務邏輯的需要。通常它會是YourFancyController/your_cool_action。在ajax請求的情況下,請注意重定向或刷新。


編輯:RichardAtHome提議爲我的假設是基於非常過時的原則取得了較好的解決方案。

3

使用元素存儲部件標記和使用requestAction獲取數據:如果你做這種方式

/app/View/Elements/widget.ctp

$data = $this->requestAction('/controller/action/param1/etc'); 

debug($data); 

(如並列把它放在AppController :: beforeFilter()中,數據只會在它顯示的小部件被抓取時纔會被抓取

+0

好的,但我可以在哪裏處理POST數據? (特別是在某些發佈的字段錯誤的情況下,我需要重新顯示帶有修改後的字段和錯誤的同一個表) – Vor 2013-02-12 17:01:50

+1

您可以執行總是進入相同控制器操作的Ajax請求。控制器操作可以在json/xml中響應,並且可以顯示結果。 – jimiyash 2013-02-12 20:47:58

+1

正如@jimiyash所建議的,Ajax是前進之路 – RichardAtHome 2013-02-13 09:28:17