Контекстно-зависимый вызов AJAX на модульном сайте

Редактирование: я думал о возможном решении, но я задал еще один вопрос, поскольку он очень специфичен: см. Прокси 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"); 

Что вы думаете об этом подходе?


Вторая проблема : но у меня есть функции PHP, которые возвращают мне также папку компонентов или папку других компонентов. Было бы неплохо сделать весь URL динамическим. Это также учитывало бы изменения в структуре компонента, если я захочу. Единственное решение, которое я нашел, – использовать динамический Javascript .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. Какие-нибудь умные решения об этом?

Related of "Контекстно-зависимый вызов AJAX на модульном сайте"

Честно говоря, ваши 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 контуром позже.

Поскольку никто не ответил соответствующим образом, я отвечаю себе, чтобы предоставить решение, которое я выяснил, что может быть полезно. Ключ к моему решению прост:

  1. Я создаю прокси-сервер AJAX в фиксированном местоположении в моей структуре сайта, поэтому я могу использовать codeBase для ссылки на прокси-сервер из JavaScript
  2. Я называю этот прокси с двумя параметрами: plugin и action , которые определяют: а) папку плагина, в которой находится «реальный» ajax, и b) файл ajax для использования вместе с другими параметрами:

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

  3. В ajax.php я дезинфицирую параметры и использую plugin и action для получения «реального» ajax-файла:

    {ServerRoot} / компоненты / {плагин} / Ajax / {действие} .php

Тогда я просто ajax.php этот файл в ajax.php