2011-08-10 116 views
1

我正在動態地將內容加載到我的模態中,並且通常它將成爲我的網站上已經是可正常訪問的頁面的頁面。CakePHP - 如何建立模式佈局

所以我想能夠重用該控制器/操作並將其加載到我的模式中,但顯然控制器已經使用佈局。所以當我將頁面加載到我的模式中時,我網站的頁眉和頁腳全部都是模式,我不想要。


一個解決方案,我認爲可能的工作,但似乎像一個骯髒的解決辦法,是在我AppController中有該說,這是一個模態呼籲頁面(不正常通話的URL參數進行檢查)。然後用一個特殊的模態覆蓋佈局。

//app_controller.php 

public function beforeRender() { 
    if (isset($this->params['passed']['_modal'])) { 
     $this->layout = 'modal'; 
    } 
} 

// In my jQuery call to open the modal: 

myModal.load('users/view/5/_modal').dialog('open'); 

然後在modal.ctp佈局我將包括一個樣式,看起來像:

// modal_layout.css 

@import url("normal_layout.css"); 

.header, .footer {display:none;} 

所以我不必重新定義所有我的正常佈局的CSS,但我可以隱藏部分我不想展示。

這看起來像是一個愚蠢的做法,我不知道它是否可行,但肯定有人必須使用CakePHP做這件事,那麼你們會建議什麼?

回答

0

原來我並不需要任何如此複雜的東西。

<div id="modal"></div> 

然後在我的佈局現有的CSS我添加一定的規則來隱藏我不希望看到當一個頁面在一個模式被加載元素:

我只是在我的佈局中創建一個隱藏的div
#header, #footer {display:none;} 

這樣我就可以將頁面加載到模式中,但它仍然具有佈局CSS中已定義的所有常規樣式。頁面將使用其正常CakePHP的URL裝入模式:

$('#modal').load('controller/action/param:whatever').dialog('open'); 
0

您可以創建一個元素。

$('#myModal').load("<?=url('users/view/5/_modal')?>", {type:'post'}, function(){ 
      $('#myModal').dialog({title:'open',autoOpen:false, modal:false, height:600, width:700}); 
      $('#myModal').dialog('open'); 
     }); 

function view($my_customer_id, action) { 
//do stuff here 
$this->render(DS.'elements'.DS.'users'.DS.'modal'); 
} 
0

使用RequestHandler檢測ajax請求。把這一行放在你行動的最後:

if ($this->RequestHandler->isAjax())$this->render('view_name','ajax'); 
+0

但是那麼它不會請求佈局,視圖,CSS,JS等,即使它只是一個沒有視圖的Ajax請求? – BadHorsie

0

如果你希望你的模態對話框的內容是一個行動的觀點簡單的內容,您只需要添加下面的一對控制器的行動之上:

$this->layout = null; 

這將禁用視圖佈局和所有的輸出內容{} HTML

+0

是的,但是我的佈局包含樣式表,這將使我的視圖中的內容看起來很好,並且與通常訪問該頁面時一樣。 – BadHorsie

+0

夠公平的。設置一個不同的佈局可以做到這一點。你也可以簡單地從視圖內引用你的CSS。 –

2
if ($this->request->is('ajax')) { 
    $this->layout = 'ajax';    
} 

現在你可以配置你的佈局/ ajax.ctp作爲 你要。