M
M
modxyou2019-06-14 15:55:29
MODX
modxyou, 2019-06-14 15:55:29

How to fix Fatal error: Uncaught Error: Call to a member function __toString() on null?

Good afternoon!
PHP7 version
Installed caseChanger plugin
This plugin has always been run, now when installing on a new site, it began to give errors:
Fatal error: Uncaught Error: Call to a member function __toString() on null in /var/www/sites/data/www/site.ru/core/cache/includes/elements/modsnippet/87.include.cache.php: 56 Stack trace: #0 /var/www/sites/data/www/site.ru/core/model/modx/modscript.class.php(76): include() #1 /var/www/sites/data/ www/site.ru/core/model/modx/modx.class.php(1859): modScript->process(NULL) #2 /var/www/sites/data/www/site.ru/core/model/modx /filters/modoutputfilter.class.php(676): modX->runSnippet('caseChanger', Array) #3 /var/www/sites/data/www/site.ru/core/model/modx/modparser.class. php(942): modOutputFilter->filter(Object(pdoTag)) #4 /var/www/sites/data/www/site.ru/core/components/pdotools/model/pdotools/pdoparser.class.php(305) : modTag->filterOutput() #5 /var/www/sites/data/www/site.ru/core/components/pdotools/model/pdotools/pdoparser.class.php(261): pdoTag->process() #6 /var/www/sites/data/www/site.ru/core/model/modx/modparser.class.php(251): pdoParser->processTag(Object( pdoTag), fals in /var/www/sites/data/www/site.ru/core/cache/includes/elements/modsnippet/87.include.cache.php on line 56

<?php
/*
* $input / $w - входное слово в режиме фильтра / сниппета
* $p - падеж ['']
* $m - множественное (false)
* $debug - режим отладки (false)
*/
$encoding = end(explode('.', $modx->getOption('encoding', $scriptProperties, "ru_RU.UTF-8")));

$padej = [
    'Р'=>'Р', 'Д' =>'Д', 'В'=>'В', 'Т'=>'Т', 'П'=>'П', 'П-о'=>'П-о', // Русскими буквами
    'R'=>'Р', 'D' =>'Д', 'V'=>'В', 'T'=>'Т', 'P'=>'П', 'Po'=>'П-о', // Латиницей
    1=>'Р', 2 =>'Д', 3=>'В', 4=>'Т', 5=>'П', 6=>'П-о',              // Цифрами
];
$out = ''; // default

// Проверяем данные на входе
if(!$input && empty($w)) return $out;

// Если в режиме фильтра переданы опции
if(!empty($options)){
    parse_str($options);
}

//Задана ли отладка
$debug = empty($debug)? false : true;

//Слово - в URL строку
$w = rawurlencode($input? $input : $w);

//Берем падеж
$p = !empty($p)? $p : 0;

//Форматируем
$p = (int)$p? (int)$p : mb_strtoupper($p, $encoding);

//Если падежа нет или он левый
if(!$p || empty($padej[$p])){
   return $debug? 'Неверно задан падеж' : $out;
} else { 
   $p = $padej[$p];
}

//Множественное число
$m = empty($m)? false : 'множественное';

//Подключаем/отключаем отлов ошибок libXML
libxml_use_internal_errors($debug);

//Получаем объект от Морфера
$xml = simplexml_load_file('http://ws3.morpher.ru/russian/declension?s=' . $w);

//По условиям вытаскиваем из объекта нужное
if($m) { //Если множественное
    //Если передано сразу во множественном - вложенного объекта не будет
    $out .= isset($xml->$m)? $xml->$m->$p->__toString() : $xml->$p->__toString();
}else{ // Если ед.ч.
    $out .= !empty($xml->$p)? $xml->$p->__toString() : '';
}

//Если включен вывод ошибок
if($debug){
    $errors = [];
    foreach (libxml_get_errors() as $error) {
        $errors[] = $error;
    }
    $out .= "\r\n". implode("\r\n", $errors);
}

//Вырубаем буфер ошибок
libxml_clear_errors();

//Отдаем результат
return $out;

Please tell me how to overcome this?
Thanks

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question