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

时间:2014-11-19 21:16:09

标签: php ajax modx modx-revolution

我在这个官方教程之后创建了一个CMP: http://rtfm.modx.com/revolution/2.x/developing-in-modx/advanced-development/custom-manager-pages

在这个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

或在管理器中的System-> Actions菜单中创建另一个操作并在那里做一些事情 或以其他方式(通过,也许,使用连接器,处理器,控制器......)?

3 个答案:

答案 0 :(得分:1)

好的,感谢@ ride_85027的回答。经过一些发现和谷歌搜索,我使用连接器和我的自定义处理器来找到另一个解决方案。不知道哪个变体更好"。所以这是我的解决方案:

我的所有AJAX请求都是(通过POST)发送到connector.php文件,该文件放在/ assets / components / my_component_name /中,带有必要的' action'参数(定义将处理此请求的处理器)和我需要的其他自定义参数。 这是我的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' => ''
));

action参数是处理器相对于路径的路径在&#39; processors_path&#39;中设置。在$ modx-&gt; request-&gt; handleRequest中。 我设定了行动&#39;参数为&#39; mgr / saveorder&#39;因为我的自定义处理器文件位于/core/components/my_component_name/processors/mgr/saveorder.class.php中 (请注意,您需要从&#39; action&#39;参数中省略class.php文件扩展名。

顺便说一下,我发现自定义处理器的名称必须是小写的。

以下是我的自定义处理器的代码 - saveorder.class.php:

<?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';

如您所见,我创建了扩展modProcessor类并重写&#39; process&#39;方法。在我的情况下,它会对电视进行一些更改。成功时的AJAX请求将获得进程方法返回的字符串。

有关详细信息,请google&#39; modProcessor&#39;。您会发现还有许多其他处理器类可供您节省时间。

答案 1 :(得分:0)

是的,在尝试在CMP之外使用MODx之前,需要加载MODx。我不建议将每个ajax文件绑定到system-&gt;动作,这样做太过分了。您接近上述内容,以下是我经常使用的内容:

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请求的链接:http://rtfm.modx.com/xpdo/2.x/class-reference/xpdo/xpdo.addpackage

答案 2 :(得分:0)

我知道这是老帖子,但在寻找同样问题的解决方案时,我降落在这里,所以我分享了我的答案。

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

http://ridcully.dunnock.modxcloud.com/records/2014/07/08/using-custom-processors-in-modx-revolution-over-ajax-request/?quip_approved=0#quip-success-qcom