Редактирование: я думал о возможном решении, но я задал еще один вопрос, поскольку он очень специфичен: см. Прокси AJAX с PHP, возможно ли это?
Я создаю сайты, которые имеют определенную степень модульности. Таким образом, возможно, что есть «компоненты» (подумайте о грубой 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
я хочу вызвать 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 на каждой странице, из файла Config, который может быть легко отредактирован для каждой установки, поэтому я могу сделать что-то вроде JavaScript:
$("#ajax").load(codeBase + "/component/Datagrid/ajax/getsomedata.php");
Что вы думаете об этом подходе?
.js.php
. Это очень нелегко, и я должен включить всю структуру в файл 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. Какие-нибудь умные решения об этом?
Честно говоря, ваши problems
– это реалистичные options
и не совсем такая плохая практика, в общем, откровенно.
Но давайте рассмотрим это немного дальше.
Какой был бы лучший подход, так это то, что у вас есть 1 главный файл config.php
который затем вы можете указать modules
, т. Е. Ваш datagrid и т. Д.
Вы можете хранить все модули в переменной массива следующим образом:
$_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
контуром позже.
Поскольку никто не ответил соответствующим образом, я отвечаю себе, чтобы предоставить решение, которое я выяснил, что может быть полезно. Ключ к моему решению прост:
codeBase
для ссылки на прокси-сервер из JavaScript Я называю этот прокси с двумя параметрами: plugin
и action
, которые определяют: а) папку плагина, в которой находится «реальный» ajax, и b) файл ajax для использования вместе с другими параметрами:
$ ("# …"). load (codeBase + "/main/ajax.php?plugin=Datagrid&action=gettable&otherparams" …)
В ajax.php
я дезинфицирую параметры и использую plugin
и action
для получения «реального» ajax-файла:
{ServerRoot} / компоненты / {плагин} / Ajax / {действие} .php
Тогда я просто ajax.php
этот файл в ajax.php