MODx第二个runProcessor返回第一个响应

时间:2014-11-21 00:18:36

标签: php modx-revolution

您好,并提前感谢您的帮助! 所以问题是: 我在插件中运行了2个不同的处理器 - 我创建了一个用户(安全/用户/创建)并创建了额外的信息对象(我的自定义类)。 问题是第二个处理器总是返回第一个处理器的响应。如果我删除第一个处理器电话 - 没关系。当我试图在第二个处理器本身做同样的事情时问题是一样的。所以代码:

$response = $modx->runProcessor('security/user/create',$_REQUEST);
$resp=$modx->runProcessor('mgr/userdata/create',$_REQUEST,array("processors_path"=>$custom_path));
$modx->log(MODx::LOG_LEVEL_ERROR,print_r($resp->response,true));

返回:

 [2014-11-21 01:01:44] (ERROR @ /index.php) Array
(
    [success] => 
    [message] => 
    [total] => 1
    [errors] => Array
        (
            [0] => Array
                (
                    [id] => username
                    [msg] => This username is already used!
                )

        )

    [object] => Array
        (
        )

)

它是什么样的巫术以及如何使它发挥作用?

2 个答案:

答案 0 :(得分:1)

MODX的处理器正在使用常见的$modx->error对象。在日志中,我们在用户创建时遇到错误。第二个处理器捕获它并且无法成功完成。

而这一切都是因为$ modx->错误在一个流程中对所有处理器都是通用的。最简单的方法是在第一次处理器调用后使用$modx->error->reset

但是如果我们更深入呢?

您想为他创建用户和相关数据吗?好。但是,如果用户创建成功并且您的自定义数据创建失败,该怎么办?最后我们有不一致的数据。这真是令人头疼。

对我而言,最好的方法是创建扩展security/user/create processor的自定义处理器。有一种特殊的beforeSave方法。因此,您可以了解用户创建何时成功,然后创建自定义数据。那太棒了。 示例(它是我的一个项目的处理器,而不是用户创建。但意思是相同的):

class modWebOrdersOrdersBulkComplectationCompleteProcessor extends modWebOrdersOrdersUpdateProcessor{


public function beforeSave(){

    $canSave = parent::beforeSave();
    if($canSave !== true){
        return $canSave;
    }    

    // if we are here user creating has no errors.

    // method for my additional logic. If i have errors there user won't be created
    $ok = $this->transactionCreate();
    if($ok !== true){
        return $ok;
    }


    return true;
}

protected function transactionCreate(){          

    // i'm usually works with related objects and use especially aggregates/composites relations. So if user has related data profile it will be saved when `save` method will be called for $this->object.

    $_Transaction = $this->modx->newObject('BillingProductTransaction', array(
        'createdby' => $this->modx->user->id,
        'cause'=>   2
    ));

    $this->object->Transaction = $_Transaction;

    // but anyway you can run your subprocessor there. But there are some cons
    // 1. $this->modx->error is common. if you make multiple runProcessor call there you can get some weird problems with logic. (error->reset() is hack not feature)
    // 2. when your project architecture grows logic based on relations becomes more maintainable.

    return true;
}

答案 1 :(得分:0)

你确定它要进入第二个处理器吗?尝试记录两者:

$response = $modx->runProcessor('security/user/create',$_REQUEST);
$modx->log(MODx::LOG_LEVEL_ERROR,print_r($response->response,true));

$resp=$modx->runProcessor('mgr/userdata/create',$_REQUEST,array("processors_path"=>$custom_path));
$modx->log(MODx::LOG_LEVEL_ERROR,print_r($resp->response,true));