2011-08-10 54 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作为 你要。