2010-07-28 57 views
5

我在cakePHP應用程序中使用ajax和jQuery。
和我的JavaScript功能放在一個JavaScript文件中。在CakePHP中調用Ajax時使用動作url的最佳實踐

現在在我的本地系統中的文件被保存在「/樣本」目錄中,這樣的路徑,而我調用該函數將

在ajax.js

$.post({url : "/sample/controller/action"}) 

但託管後的網址將成爲

$.post({url : "/mydomain.com/controller/action"}) 
在CakePHP

我們$html->url生成URL
但由於這個代碼是在js文件我CA不使用該功能

我不想託管之前手動更改所有的Ajax操作URL

回答

23

做的是在你的蛋糕應用你的主人模板創建全球 JavaScript變量可以在整個應用程序中使用。確保它存在,只要你做任何JS包括。

<head> 
    ... 
    <script type="text/javascript">var myBaseUrl = '<?php echo $html->url; ?>';</script> 
    ... 
    <script type="text/javascript" src="mycustomJSfile.js"> 
    ... 
</head> 

現在你可以在你的MVC框架應用程序中的任何視圖文件中做這樣的事情。

$.post({url: myBaseUrl + 'controller/action'}); 
+0

我爲使用任何框架編寫的每個Web應用程序都這樣做。如果你使用Smarty,並且需要JavaScript中的baseUrl,它會更方便。你必須做{/ literal} {$ baseUrl} {/ literal},這是一個皇家PITA。上述解決方案很好地解決了這個問題。 – 2010-07-29 14:59:32

+5

這是正確的答案,但它不適合我。這可能是因爲我使用了Cake 2,但該解決方案適用於早期版本。儘管如此,我不得不使用它來在Cake2中工作的代碼是'' – Joseph 2012-06-26 08:29:07

+0

對於CakePHP 3,我使用'var appBaseUrl ='<?php echo $ this-> Url-> build('/',true); ?>';' – XerXes 2015-09-24 14:01:51

1

回覆Paul Dragoonis如果您使用子文件夾,您可以使用$this->webroot

6

我正在更新Paul Dragoonis的答案以反映最新的CakePHP版本(2.2)。

在您的佈局文件中,使用CakePHP的JSHelper設置JavaScript變量:<?php echo $this->Js->set('url', $this->request->base); ?>,其中$this->request是CakeRequest的一個實例,並提供有關當前請求的信息。

在上面的代碼行之後,用<?php echo $this->Js->writeBuffer(); ?>寫入緩衝區。

然後,您可以通過app.url在JavaScript中訪問此變量。

1

使用

echo Router::url(array('controller' => 'Users', 'action' => 'all')); 

將輸出;

/Users/all 

在JS

$.post({url : "<?php echo Router::url(array('controller' => 'Users', 'action' => 'all')); ?>"}) 
3

@irtiza你的答案被讚賞但CakePHP的最新3.x版本,這將工作,否則你會得到路由錯誤。

ulr:'<?php echo \Cake\Routing\Router::url(array('controller' => 
'controllername', 'action' => 'actionname')); ?>'