5

编辑:我想到了一个可能的解决方案,但我提出了另一个问题,因为它非常具体:请参阅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”文件中如此硬编码。有什么聪明的解决方案吗?

4

2 回答 2

2

由于没有人以合适的方式回答,我回答自己是为了提供一个我发现可能有用的解决方案。我的解决方案的关键很简单:

  1. 我在站点结构的固定位置创建了一个 AJAX 代理,因此我可以使用codeBaseJavaScript 引用代理
  2. 我用两个参数调用这个代理:pluginaction,它标识a)“真正的”ajax所在的插件文件夹和b)要使用的ajax文件,以及其他参数:

    $("#...").load(codeBase + "/main/ajax.php?plugin=Datagrid&action=gettable&otherparams"...)

  3. ajax.php我清理参数,并使用pluginaction获取“真正的”ajax 文件:

    {serverRoot}/components/{plugin}/ajax/{action}.php

然后我只是include那个文件ajax.php

于 2012-08-09T13:50:52.903 回答
1

老实说,你problems是现实options的,坦率地说,一般来说并不是那么糟糕的做法。

但是,让我们进一步探讨一下。

最好的方法是让您拥有 1 个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以后不会出现任何路径问题。

于 2012-08-06T13:49:05.387 回答