Вот так можно переопределить с помощью системного плагина.
Суть метода: исходный класс считывается в переменную, переименовывается на лету и подключается при помощи функции eval().
Производный класс имеет то же имя и наследуется от переименованного.
При этом исходный класс остается в прежнем месте и может обновляться в случае обновления ядра.
<?php
// No direct access
defined('_JEXEC') or die;
$app = JFactory::getApplication();
if($app->isSite())
{
// Считываем базовый класс ContentModelArticles в переменную.
$ContentModelArticlesOld = implode('',file(JPATH_ROOT . '/components/com_content/models/articles.php'));
// переименовываем его
$ContentModelArticlesOld = str_replace (
' ContentModelArticles ',
' ContentModelArticles_Edit_contentmodelcategory ',
$ContentModelArticlesOld
);
// отрезаем <?php в начале
$ContentModelArticlesOld = substr($ContentModelArticlesOld,5);
// запускаем переименованный класс из переменной с помощью eval
eval($ContentModelArticlesOld);
// Вызываем новый класс ContentModelArticles на замену
include_once JPATH_ROOT . '/plugins/system/edit_contentmodelcategory/articles.php';
}
соответственно новый клас имеет такой вид
<?php
/**
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
jimport('joomla.application.component.modellist');
/**
* This models supports retrieving lists of articles.
*
* @package Joomla.Site
* @subpackage com_content
* @since 1.6
*/
class ContentModelArticles extends ContentModelArticles_Edit_contentmodelcategory
{
function getListQuery ()
{
$query = & parent::getListQuery();
$dispatcher = & JDispatcher::getInstance();
JPluginHelper::importPlugin( 'content' );
$dispatcher->trigger( 'onContentAfterGetListQuery',array( & $query));
return $query;
}
}
Этот плагин вставляет дополнительную точку прерывания.
Этот метод не работает для случаев, если класс подключается внутри Joomla не джумловскими методами, а с помощью include_once (например в модулях)
В этом случае решения нет, разве что с помощью библиотеки runkit. Но она не устанавливается в php по умолчанию и соответственно, возникают сложности с переносом сайта.
Если кто может подсказать другие варианты помимо runkit - то было бы интересно.