#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. Я понятия не имел, что runSnippet может возвращать только строки! зная, что я преобразовал массив $output в json в americansurcharge.class прежде чем вернуть его, и теперь я могу заставить это работать ~ как есть ~. Однако ваше предложение было бы лучшим способом сделать это. Спасибо!