После обновления плагина редактора для материалов JCKEditor (JoomlaCK Editor), спустя некоторое время столкнулся с неприятной неожиданностью. Лента RSS Feed перестала отдаваться сайтом, вместо этого показывая белый экран.
Включение ошибок показало фатальную ошибку:
Call to undefined method JDocumentFeed::getHeadData() in /plugins/system/jcktypography/jcktypography.php on line 69
Открыв упомянутый файл по адресу /plugins/system/jcktypography/jcktypography.php обнаружил следующий код:
$data = $doc->getHeadData();
Для объективности расследования проблемы, предлагаю взглянуть не только на эту строку, а на весь код в целом:
$doc = JFactory::getDocument();
$data = $doc->getHeadData();
$stylesheet = array();
$url = JURI::base(true).'/plugins/editors/jckeditor/typography/typography2.php';
$stylesheet[$url]['mime'] = 'text/css';
$stylesheet[$url]['media'] = null;
$stylesheet[$url]['attribs'] = array();
$data['styleSheets'] = $stylesheet + $data['styleSheets'];
$doc->setHeadData($data);
Что мы видим: в переменную $doc передается ссылка на текущее представление объекта Document (и если бы это была обычная страница, то там бы у нас оказался объект DocumentHTML, у которого есть метод getHeadData(), но поскольку у нас там лента новостей, то Joomla работает с объектом DocumentFeed, который методы getHeadData() и setHeadData() не имеет.
Наиболее логичным решением в данном случае будет, заменить упомянутую в начале статьи строку на:
if (method_exists($doc, 'getHeadData')) $data = $doc->getHeadData();
Но тогда у нас проблема решится ровно наполовину, и что делать с последующим кодом, ведь метод setHeadData в данном случае тоже неизбежно выдаст ошибку?
Поэтому предлагаю заменить весь большой кусок на код:
$doc = JFactory::getDocument();
if (method_exists($doc, 'getHeadData')) {
$data = $doc->getHeadData();
$stylesheet = array();
$url = JURI::base(true).'/plugins/editors/jckeditor/typography/typography2.php';
$stylesheet[$url]['mime'] = 'text/css';
$stylesheet[$url]['media'] = null;
$stylesheet[$url]['attribs'] = array();
$data['styleSheets'] = $stylesheet + $data['styleSheets'];
$doc->setHeadData($data);
}
Успехов!