修改:我想到了一个可能的解决方案,但我提出了另一个问题,因为它非常具体:请参阅AJAX proxy with PHP, is it possible?
<小时/> 有几次我遇到过这个问题...
我创建具有一定程度模块性的网站。因此,有可能存在“组件”(想到粗略的CMS),它们都带有自己的PHP代码,CSS和JavaScript,都是动态包含的。考虑一下这样的结构:
{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
我想用AJAX调用siteroot/component/datagrid/ajax/getsomedata.php
我应该写(使用JQuery):
$("#ajax").load("siteroot/component/datagrid/ajax/getsomedata.php");
<小时/> 第一个问题:
siteroot
更改了不同的安装。我通过包含一般的来实现这一点
var codeBase = <? echo json_encode(Config::$siteRoot); ?>
在每个页面上使用PHP,从每个安装都可以轻松编辑的Config文件,所以我可以使用任何类似的JavaScript:
$("#ajax").load(codeBase + "/component/Datagrid/ajax/getsomedata.php");
您如何看待这种方法?
<小时/> 第二个问题:但我有PHP函数,它还返回给我的components文件夹或其他组件的文件夹。将整个 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
{{1}}的路径...我不希望这个硬编码在我的身上。“ js.php“文件。
关于这个的任何聪明的解决方案?
答案 0 :(得分:1)
说实话,你的problems
是现实的options
,并且坦率地说,这并不是一般的坏习惯。
但让我们进一步探讨这一点。
最好的方法是,您有一个主config.php
文件,然后您可以指定modules
,即您的数据网格等。
您可以将所有模块存储在数组变量中,如下所示:
$_SITE_PATH = "/var/www/html/";
$_HTTP_PATH = "http://example.com/";
$_MODULES_PATH = $_SITE_PATH."modules/"
$_MODULES = array(
"datagrid"=>$_MODULES_PATH."datagrid/init.php",
"something_else"=>$_MODULES_PATH."something_else/init.php"
);
每个module
都有自己的实例化init.php
目录,因此它会加载所需的全部内容。
通过这种方式,您可以根据需要进行编码,并在需要时(最好是在标题状态下)执行此类操作。
global $_MODULES;
require_once($_MODULES["datagrid"]);
所有内容都可以在需要时随时轻松获取,而不会在以后发生任何variable
路径问题。
答案 1 :(得分:1)
由于没有人以合适的方式回答,我回答自己提供了一个我发现可能有用的解决方案。 我解决方案的关键很简单:
codeBase
从JavaScript引用代理我用两个参数调用此代理:plugin
和action
,它们标识a)“真实”ajax所在的插件文件夹和b)要使用的ajax文件,以及其他参数:
$(“#...”)。load(codeBase +“/ main/ajax.php?plugin=Datagrid&action=gettable&otherparams”...)
在ajax.php
我清理参数,并使用plugin
和action
获取“真正的”ajax文件:
{ServerRoot的} /组件/ {插件} / AJAX / {动作} .PHP
然后我只是在include
ajax.php
该文件