模块化站点中的上下文感知AJAX调用

时间:2012-08-03 06:51:53

标签: php javascript ajax content-management-system

修改:我想到了一个可能的解决方案,但我提出了另一个问题,因为它非常具体:请参阅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“文件。 关于这个的任何聪明的解决方案?

2 个答案:

答案 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)

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

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

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

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

    {ServerRoot的} /组件/ {插件} / AJAX / {动作} .PHP

  4. 然后我只是在include

    ajax.php该文件