编辑:我想到了一个可能的解决方案,但我提出了另一个问题,因为它非常具体:请参阅AJAX proxy with PHP,这可能吗?
我遇到过几次这个问题...
我创建的网站具有一定程度的模块化。因此,有可能存在带有自己的 PHP 代码、CSS 和 JavaScript 的“组件”(想想粗略的 CMS),所有这些都是动态包含的。考虑如下结构:
{siteroot}/component/datagrid/datagrid.php
{siteroot}/component/datagrid/js/datagrid.js
{siteroot}/component/datagrid/css/datagrid.css
{siteroot}/component/datagrid/ajax/getsomedata.php
现在,问题是:对于 JavaScript 文件,特别是 AJAX 调用,我如何让它们通过 URL 进行上下文感知?
例如,如果datagrid.js
我想siteroot/component/datagrid/ajax/getsomedata.php
用 AJAX 调用,我应该写(用 JQuery):
$("#ajax").load("siteroot/component/datagrid/ajax/getsomedata.php");
第一个问题:
siteroot
不同安装的变化。我已经通过包括一名将军来做到这一点
var codeBase = <? echo json_encode(Config::$siteRoot); ?>
在每个页面上使用 PHP,来自一个可以为每次安装轻松编辑的配置文件,所以我可以使用任何 JavaScript 之类的东西:
$("#ajax").load(codeBase + "/component/Datagrid/ajax/getsomedata.php");
您如何看待这种方法?
第二个问题:但我有返回给我的 PHP 函数还有组件文件夹或其他组件的文件夹。使整个URL 动态化会很好。如果我愿意,这也可以解释组件结构的变化。我发现的唯一解决方案是使用
.js.php
动态 Javascript。这很不优雅,我必须在 JavaScript 文件中包含所有框架,例如:
<?php
include "../../libs/framework.php"; // get my functions...
$myUrl = Config::$siteRoot . Framework::getComponentAjaxDir("datagrid") . "/getsomedata.php";
?>
$("#ajax").load(<?=json_encode($myUrl)?>);
另一个副作用是我必须确切地知道...的include
路径framework.php
我不希望在我的“.js.php”文件中如此硬编码。有什么聪明的解决方案吗?