我在这个官方教程之后创建了一个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菜单中创建另一个操作并在那里做一些事情 或以其他方式(通过,也许,使用连接器,处理器,控制器......)?
答案 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)
我知道这是老帖子,但在寻找同样问题的解决方案时,我降落在这里,所以我分享了我的答案。
我发现下面的教程非常有用