5

編集:私は可能な解決策について考えましたが、それは非常に具体的であるため、別の質問をしました:PHPを使用したAJAXプロキシを参照してください、それは可能ですか?


この問題に何度か遭遇しました...

ある程度のモジュール性を備えたサイトを作成します。したがって、独自の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を使用してそれらをコンテキスト認識にする方法を教えてください。 たとえば、 AJAXを使用datagrid.jsして呼び出したい場合は、 siteroot/component/datagrid/ajax/getsomedata.php(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");

このアプローチについてどう思いますか?


2番目の問題:しかし、コンポーネントフォルダーまたは他のコンポーネントのフォルダーも返す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)?>);

もう1つの副作用は、パスを正確に知る必要があることです...これを「.js.php」ファイルにハードコーディングしたくないのです。それについての賢い解決策はありますか?includeframework.php

4

2 に答える 2

2

誰も適切な方法で答えなかったので、私は自分自身に答えて、役に立つとわかった解決策を提供します。私の解決策の鍵は単純です:

  1. サイト構造の固定位置にAJAXプロキシを作成しているのでcodeBase、JavaScriptからプロキシを参照するために使用できます
  2. 私はこのプロキシを2つのパラメータで呼び出します:pluginaction、は、a)「実際の」ajaxが存在するプラグインフォルダとb)使用するajaxファイルを他のパラメータとともに識別します。

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

  3. 私はajax.phpパラメータをサニタイズし、「実際の」ajaxファイルを使用pluginして取得します。action

    {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 に答える