Php 从MODx CMP(自定义管理器页面)执行AJAX请求的正确方法

Php 从MODx CMP(自定义管理器页面)执行AJAX请求的正确方法,php,ajax,modx,modx-revolution,Php,Ajax,Modx,Modx Revolution,我根据本官方教程创建了一个CMP: 在这个CMP上,我有一个按钮,我想执行AJAX请求(单击) 创建处理此AJAX请求的php文件的正确方法是什么 通过在/assets/components中创建php文件// 并在顶部填充以下代码: require_once '/absolute/path/to/modx/config.core.php'; require_once MODX_CORE_PATH.'model/modx/modx.class.php'; $modx = new modX();

我根据本官方教程创建了一个CMP:

在这个CMP上,我有一个按钮,我想执行AJAX请求(单击)

创建处理此AJAX请求的php文件的正确方法是什么

通过在/assets/components中创建php文件// 并在顶部填充以下代码:

require_once '/absolute/path/to/modx/config.core.php';
require_once MODX_CORE_PATH.'model/modx/modx.class.php';
$modx = new modX();
$modx->initialize('web');
// My code is here
或者在管理器的“系统->操作”菜单中创建另一个操作,并在其中执行某些操作
或者以另一种方式(可能通过使用连接器、处理器、控制器…)

是的,您需要在尝试在CMP外部使用MODx之前加载MODx。我不建议将每个ajax文件绑定到一个系统->操作,这太过分了。你很了解上面的内容,以下是我经常使用的:

if (!defined('MODX_CORE_PATH')) {
    if(strpos($_SERVER['SERVER_NAME'],'localhost') !== false){
        define('MODX_CORE_PATH', 'C:/xampp/htdocs/yoursitename/core/');
    }else{
        define('MODX_CORE_PATH', '/home2/yoursitename/public_html/core/');
    }
}
if (!defined('MODX_CONFIG_KEY')) {
    define('MODX_CONFIG_KEY', 'config');
}
require_once( MODX_CORE_PATH . 'model/modx/modx.class.php');
$modx = new modx();
$modx->initialize('mgr');
请注意,嵌套的
if/else
语句是我添加的,用于处理在测试站点之间移动和轻松生活。如果需要,您只需删除它并保留实际的
/home2/yoursite..etc

在PHP文件中初始化/加载MODx后,只需使用
$。GET
或类似的方法来处理请求


注意:如果您使用的是自定义数据库表,请不要忘记添加您的包,以便可以与这些表通信!这里有一个链接,指向
addPackage
请求:

谢谢@ride\u 85027的回答。经过一些探索和谷歌搜索,我找到了另一个使用连接器和我的定制处理器的解决方案。不知道哪种变体“更好”。因此,我的解决方案如下:

我的所有AJAX请求都会(通过POST)发送到connector.php文件,该文件位于/assets/components/my_component_name/中,带有所需的“action”参数(定义处理此请求的处理器)和我需要的其他自定义参数。 以下是my connector.php的代码:

<?php
require_once dirname(dirname(dirname(dirname(__FILE__)))).'/config.core.php';
require_once MODX_CORE_PATH.'config/'.MODX_CONFIG_KEY.'.inc.php';
require_once MODX_CONNECTORS_PATH.'index.php';

$corePath = $modx->getOption('my_component_name.core_path',null,$modx->getOption('core_path').'components/my_component_name/');
require_once $corePath.'model/my_component_name.class.php'; // My custom class
$modx->my_component_className= new my_component_className($modx);

/* handle request */
$path = $modx->getOption('processorsPath',$modx->my_component_className->config,$corePath.'processors/'); // Path to directory with my custom processors
$modx->request->handleRequest(array(
    'processors_path' => $path,
    'location' => ''
));

我知道这是一篇老文章,但在寻找解决我在这里遇到的同一问题的方法时,我分享了我的答案

我发现下面的教程非常有用


谢谢您的回答。请检查我的并发表评论。无法决定谁的答案更好。是的,这是另一种方式…也是一种更面向对象的处理方式!至于哪种方式更好,没有线索,哈哈。我已经习惯了我的方式,因为我已经使用它很多年了,但是这种方法看起来很有希望,所以我可能会开始尝试使用它。很高兴你把它整理好了,我会给这个答案投赞成票,也谢谢你把它贴出来。干杯
<?php
class SortArticlesSaveOrderProcessor extends modProcessor {
    public function initialize() {
    return parent::initialize();
    }
    public function process() {
        $sortOrder = json_decode($this->getProperty('order'));

        foreach($sortOrder as $order => $id) {          
            $page = $this->modx->getObject('modResource', $id);
            if (!$page->setTVValue('sort_id', $order)) {
                $this->modx->log(xPDO::LOG_LEVEL_ERROR, 'There was a problem saving sort_id in saveorder.class.php');
                return 'Ошибка.';
            }            
        }

        return 'Изменения успешно сохранены.';
    }
}
return 'SortArticlesSaveOrderProcessor';