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

Cra*_*nio 5 javascript php ajax content-management-system

编辑:我考虑过一个可能的解决方案,但我提出了另一个问题,因为它非常具体:用PHP查看AJAX代理,是否可能?


有几次我遇到过这个问题......

我创建了具有一定程度模块化的网站.因此,有可能存在"组件"(想到粗略的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
Run Code Online (Sandbox Code Playgroud)

现在,问题是:对于JavaScript文件,特别是AJAX调用,如何使用URL进行上下文感知? 例如,如果datagrid.js我想siteroot/component/datagrid/ajax/getsomedata.php用AJAX 调用我应该写(使用JQuery):

$("#ajax").load("siteroot/component/datagrid/ajax/getsomedata.php");
Run Code Online (Sandbox Code Playgroud)


第一个问题:siteroot不同安装的变化.我通过包括将军来管理那个

var codeBase = <? echo json_encode(Config::$siteRoot); ?>
Run Code Online (Sandbox Code Playgroud)

在每个页面上使用PHP,从每个安装都可以轻松编辑的Config文件,所以我可以使用任何类似的JavaScript:

$("#ajax").load(codeBase + "/component/Datagrid/ajax/getsomedata.php");
Run Code Online (Sandbox Code Playgroud)

您如何看待这种方法?


第二个问题:但我有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)?>);
Run Code Online (Sandbox Code Playgroud)

另一个副作用是,我必须知道确切include的路径framework.php......我不想这样这么辛苦,我codedin".js.php"文件.有关这方面的任何智能解

Cra*_*nio 2

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

  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}/components/{插件}/ajax/{action}.php

然后我只是include将该文件放入ajax.php