Skip to content
This repository has been archived by the owner on Mar 8, 2021. It is now read-only.

OnLoadDocumentObject event dont work #1271

Closed
webber12 opened this issue Mar 8, 2017 · 17 comments
Closed

OnLoadDocumentObject event dont work #1271

webber12 opened this issue Mar 8, 2017 · 17 comments
Assignees

Comments

@webber12
Copy link
Contributor

webber12 commented Mar 8, 2017

$out = $documentObject;
print_r($out); //that`s right array
$e->output($out); // and then that`s an empty array
@Pathologic
Copy link
Contributor

Change the event call to:

$out = $this->invokeEvent('OnLoadDocumentObject', compact('method', 'identifier', 'documentObject'));
if(is_array($out) && is_array($out[0])){
    $documentObject = $out[0];
}

@webber12
Copy link
Contributor Author

webber12 commented Mar 8, 2017

Так я пробовал с самого начала - error, it`s not an array - т.е. сам плагин возвращает непонятно в каком виде результат. Причем, при включении плагина на это событие падает любая страница (просто белая, без всяких ошибок), независимо от того, возвращал ли плагин на этом событии что-то или нет. Т.е.

if ($modx->documentIdentifier == '10') {
    $e->output($out);
}

убивает не только страницу с id=10, но и вообще любую. Т.е. проблема связана с самим некорректным срабатыванием этого события.

@webber12
Copy link
Contributor Author

webber12 commented Mar 8, 2017

$out = $this->invokeEvent('OnLoadDocumentObject', compact('method', 'identifier', 'documentObject'));
print_r($out);

Выдает в итоге Array([0] => Array) , вот в чем проблема у меня. Хотя $e->output($out); и непустой $out в виде массива туда из плагина отдаются.

@Pathologic
Copy link
Contributor

$modx->event->_output = $documentObject;

@webber12
Copy link
Contributor Author

webber12 commented Mar 8, 2017

Непонятно, почему стандартный возврат $out[0] не работает в случае с этим событием

@webber12
Copy link
Contributor Author

webber12 commented Mar 8, 2017

Все равно белая страница, причем любая.

Для теста делаю так - пытаюсь подменить для id=10 шаблон на шаблон главной (id=3). В итоге все три события пишутся нормально в лог, а на выходе белая страница (любая страница сайта). Вырубаю плагин - все работает, весь сайт (ну кроме этого функционала, конечно).

$e = & $modx->Event;
switch($e->name) {
	case 'OnLoadDocumentObject':
	if ($modx->documentIdentifier == '10') {
		$modx->logEvent('1', '1', $modx->documentIdentifier, 'ok1');
		$out = $documentObject;
		$modx->logEvent('1', '1', $out['template'], 'ok2');
		$out['template'] = '3';
		$modx->logEvent('1', '1', $out['template'], 'ok3');
		$modx->event->_output = $out;
	}
	break;
	
	default:
	break;
}

@Pathologic
Copy link
Contributor

Стандартный возврат через output() только со строками возможен. C моей правкой работает твой плагин.

@webber12
Copy link
Contributor Author

webber12 commented Mar 8, 2017

Странно, у меня на версии 1.2.1.9.1.0 не работает то, что я выше написал..
п.с. да и на 7.1.6 аналогично.

@Pathologic
Copy link
Contributor

https://github.com/modxcms/evolution/blob/develop/manager/includes/document.parser.class.inc.php#L1977-L1979 - вот это поменяй на:

$out = $this->invokeEvent('OnLoadDocumentObject', compact('method', 'identifier', 'documentObject'));
if(is_array($out) && is_array($out[0])){
    $documentObject = $out[0];
}

Тогда и будет работать.

@webber12
Copy link
Contributor Author

webber12 commented Mar 8, 2017

Да, так то оно работает.

Вопрос в том, зачем тогда эта свистопляска - если события не возвращают массивы, то надо напрямую с $modx->documentObject и оперировать, а не передавать его в $documentObject и обратно, который потом разваливается.

@Dmi3yy
Copy link
Collaborator

Dmi3yy commented Mar 8, 2017 via email

@Pathologic
Copy link
Contributor

Вопрос в том, зачем тогда эта свистопляска - если события не возвращают массивы, то надо напрямую с $modx->documentObject и оперировать, а не передавать его в $documentObject и обратно, который потом разваливается.

Наверное, сложилось исторически так 😄

@Dmi3yy
Copy link
Collaborator

Dmi3yy commented Mar 8, 2017 via email

@Grinyaha
Copy link

Grinyaha commented Mar 13, 2017

Нет ребята, не исторически так сложилось. В старых версиях все работало нормально. Потом зачем-то поменяли на вот то что имеем сейчас с белым экраном. Я тоже у себя на сайтах где использую это событие возвращаю так как было раньше, чтобы работало.

@Dmi3yy
Copy link
Collaborator

Dmi3yy commented Mar 13, 2017 via email

@webber12
Copy link
Contributor Author

Раньше это событие просто ничего не возвращало, да и внутрь ничего не передавалось.

$this->invokeEvent('OnLoadDocumentObject');
if ($documentObject['template']) {...}

Т.е. по идее можно было просто через global $documentObject; получить доступ, сделать что надо и все работало.

А теперь пытается вернуть массив, а из плагина вернуть можно только строку.

$out = $this->invokeEvent('OnLoadDocumentObject', compact('method', 'identifier', 'documentObject'));
if(is_array($out)){
    $documentObject = $out;
}
if ($documentObject['template']) {....}

@Grinyaha
Copy link

Я у себя вот так делаю, может не кошерно, но работает:

if($isPrepareResponse==='prepareResponse') $this->documentObject = & $documentObject; $out = $this->invokeEvent('OnLoadDocumentObject', compact('method', 'identifier', 'documentObject')); /*if(is_array($out)){ $documentObject = $out; }*/

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

4 participants