Возвращенный массив дает неожиданный результат

#php #arrays #modx #modx-revolution

#php #массивы #modx #modx-революция

Вопрос:

У меня есть фрагмент modx revolution [на самом деле ajax-процессор], который передает некоторые данные в другой фрагмент, вызывающий функцию…

 <?php
// processor.formdata

$status = 'success';

$msg = '';

$output = $modx->runSnippet($_POST['snippet'],array(
   'function' => $_POST['function'],
   'formdata' => $_POST
));

$modx->log(modX::LOG_LEVEL_ERROR,'got updateSurchargeData status. '.$output['status']);
$modx->log(modX::LOG_LEVEL_ERROR,'got updateSurchargeData message. '.$output['msg']);

$response_array = array(
    'status' => $output['status'],
    'msg' => $output['msg'],
    );

header('Content-type: application/json');

$output = json_encode($response_array);

return $output;
  

$modx-runSnippet запускает это:

 <?php
//AmericanSurcharge

//echo $scriptProperties('form');
//$modx->log(modX::LOG_LEVEL_ERROR,'Running snippet. '.$function);
//$modx->log(modX::LOG_LEVEL_ERROR,'Running snippet. '.implode(',',$formdata));

$output = '';

$core = $modx->getOption('core_path').'components/americansurcharge/model/';

$surcharge = $modx->getService('americansurcharge', 'AmericanSurcharge', $core, $scriptProperties);

if (!$surcharge instanceof AmericanSurcharge){

    return 'Insantiation failed';

}else{

  $scriptProperties['formdata'] = $formdata;

  $output = $surcharge->$scriptProperties['function']($scriptProperties);

}

return $output;
  

который, в свою очередь, запускает это:

 /**
*
* update one surcharge data
* AmericaSurcharge.class.php
*
*/
public function updateSurchargeData($scriptProperties){

    $this->modx->log(modX::LOG_LEVEL_ERROR,'Running updateSurchargeData. '.implode(',',$scriptProperties['formdata']));

    $output = array(
        'status' => 'success',
        'msg' => 'this is the message to return.',
        );

    $this->modx->log(modX::LOG_LEVEL_ERROR,'Finished running updateSurchargeData. '.$output['status']);
    $this->modx->log(modX::LOG_LEVEL_ERROR,'Finished running updateSurchargeData. '.$output['msg']);

    return $output;

}
  

Все работает и выполняется успешно, но возвращаемые значения из $output = $modx-runSnippet возвращают оба «A» в каждом ключе массива!

просматривая журналы из AmericaSurcharge.class.php Я получаю это:

 (ERROR @ /index.php) Finished running updateSurchargeData. success
(ERROR @ /index.php) Finished running updateSurchargeData. this is the message to return.
  

и сразу после этого из processor.formdata:

 [2014-07-05 23:10:29] (ERROR @ /index.php) got updateSurchargeData status. A
[2014-07-05 23:10:29] (ERROR @ /index.php) got updateSurchargeData message. A
  

Итак, где-то между возвратом массива $ouput из AmericaSurcharge.class.php и, возвращая его обратно в processor.formdata, что-то происходит со значениями.

что я делаю не так?

Комментарии:

1. Попробуйте добавить операторы log в большем количестве мест вдоль строки, чтобы увидеть, где это происходит.

Ответ №1:

что я делаю не так?

Вы используете фрагменты 🙂

При $modx->runSnippet($snippetName) вызове он возвращает только строку. Не массив или что-то еще.

Просто посмотрите на метод обработки ModScript:

 public function process($properties= null, $content= null) {
    parent :: process($properties, $content);
    if (!$this->_processed) {
        $scriptName= $this->getScriptName();
        $this->_result= function_exists($scriptName);
        if (!$this->_result) {
            $this->_result= $this->loadScript();
        }
        if ($this->_result) {
            if (empty($this->xpdo->event)) $this->xpdo->event = new stdClass();
            $this->xpdo->event->params= $this->_properties; /* store params inside event object */
            ob_start();
            $this->_output= $scriptName($this->_properties);
            $this->_output= ob_get_contents() . $this->_output;
            ob_end_clean();
            if ($this->_output amp;amp; is_string($this->_output)) {
                /* collect element tags in the evaluated content and process them */
                $maxIterations= intval($this->xpdo->getOption('parser_max_iterations',null,10));
                $this->xpdo->parser->processElementTags(
                    $this->_tag,
                    $this->_output,
                    $this->xpdo->parser->isProcessingUncacheable(),
                    $this->xpdo->parser->isRemovingUnprocessed(),
                    '[[',
                    ']]',
                    array(),
                    $maxIterations
                );
            }
            $this->filterOutput();
            unset ($this->xpdo->event->params);
            $this->cache();
        }
    }
    $this->_processed= true;
    $this->xpdo->parser->setProcessingElement(false);
    /* finally, return the processed element content */
    return $this->_output;
}
  

Но вы все равно можете вызвать свой фрагмент как функцию. Что-то вроде этого:

 if($modx->getParser()){
   $snippet= $modx->parser->getElement('modSnippet', $snippetName);
   if ($snippet instanceof modSnippet) {

    $s = $snippet->getScriptName();
    if(!function_exists($s)){
        $snippet->loadScript();
    }
    print_r($s());
   }
}
  

P.S.:
Лучший способ решить вашу проблему — использовать процессор на основе реального класса вместо вашего процессора, подобного процессору.
Преимущества:

  1. Возвращает все, что вы хотите,
  2. Один процессор может расширять другой,
  3. Стандартизировать формат ответа;

Комментарии:

1. Я понятия не имел, что runSnippet может возвращать только строки! зная, что я преобразовал массив $output в json в americansurcharge.class прежде чем вернуть его, и теперь я могу заставить это работать ~ как есть ~. Однако ваше предложение было бы лучшим способом сделать это. Спасибо!