Как переопределить основные классы?


20

Иногда возникает необходимость переопределить базовые классы, чтобы получить больше функциональности или заставить некоторые основные функции работать по-другому. Есть ли способ, как переопределить основные классы? Если это возможно, то с какими проблемами я могу столкнуться, переопределив их?


1
Было бы здорово, если бы вы могли уточнить свой вопрос, чтобы сделать его более конкретным или описать ясную проблему.
Валентин Деспа

Для пользователей Joomla 3 - проверьте это. Это поможет вам. joomla.stackexchange.com/questions/5449/… Плагин - github.com/ghazal/plg_mvcoverride Спасибо joomla.stackexchange.com/users/270/ghazal
cha

Ответы:


16

Да, это возможно.

Вы можете использовать системный плагин для переопределения классов, пожалуйста, прочитайте эту ссылку, и это, и это

Две проблемы, с которыми вы столкнетесь:

  1. вам нужно переопределить весь класс (а не только его части)

  2. если ядро ​​обновлено, а класс также обновлен / изменен, вам необходимо обновить переопределение (при необходимости).


4
Было бы полезно, если бы вы могли вставить соответствующие шаги из предоставленных ссылок или хотя бы дать описание ссылок, в случае их перемещения или изменения.
codinghands

10

Некоторое время назад я создал плагин, который позволяет вам переопределять базовые классы, но он все еще остается жертвой проблем, которые @jackJoe указал в своем ответе. Тем не менее, это позволяет вам делать переопределения чисто.

https://gist.github.com/dongilbert/3237387


7
Просто хочу сказать, что это решение прекрасно работает, и что Дон - это настоящий родственный дух Open Source - снимаю шляпу перед ним и его работой !!!
ВВП

Существенная проблема с вашим простым сценарием в том, что он не загружает компоненты заранее. Таким образом, если вы переопределяете компоненты, они действительно не работают для большинства из них (например, для компонента com_content). Он работает хорошо, но он должен предварительно загружать компонент, чтобы он мог их переопределить (вы не можете переопределить то, что еще не было объявлено). О, и вы должны использовать onAfterRoute вместо того, чтобы делать все это в конструкторе. Если вы хотите узнать, что я имею в виду под этим комментарием, попробуйте переопределить components/com_content/models/articles.php.
итопопус


4

Я был над этим очень долго и пообещал Дону, что, как только я закончу, я расскажу об этом подробнее.

Мне нужно было переопределить Joomla MVC для компонентов и попросить Joomla искать переопределения и в папке html моего плагина, а не только внутри папки html шаблона.

Что мне никогда не нравилось, так это то, что разработчики на самом деле беру класс Joomla по умолчанию и связываются с ним, так что я лучше расширю этот класс, если смогу, вместо того, чтобы что-то тормозить.

Мой процесс делает следующее.

  1. Получить класс, который мне нужно переопределить
  2. Прочитайте его, замените имя класса, создайте новый файл в моей папке временных классов
  3. Загрузить мою версию класса
  4. Загрузить класс Joomla
  5. Зарегистрируйте мой метод extends, который расширяет функцию loadTemplate для поиска переопределения в моем плагине, чем шаблон joomla и последний компонент joomla

вот изображение скорее http://prntscr.com/3d9syq

Первая часть в фрагменте ниже проверяет, где находится пользователь, собирается ли он обновить Joomla. Я удаляю файлы временного класса, которые были созданы, чтобы быть уверенными, что мы получим свежие файлы, когда обновление завершится, а затем позаботится о числе JackJoe. 2.

if (($this->Input('option') == 'com_joomlaupdate' && $this->Input('task') == 'update.install') || ($this->Input('option') == 'com_joomlaupdate' && $this->Input('layout') == 'complete')) {

    JFolder::delete(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    JFolder::create(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    $indexContent = '';
    JFile::write(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/index.html', $indexContent);
}

$YjsgJViewDefaultRead         = JPATH_LIBRARIES . '/legacy/view/legacy.php';
$YjsgJViewDefaultFile         = YJSGEXTEND . "classes" . YJDS . "Yjsg" . $isView . "Default" . $IsJversion . ".php";



    //extend JView library class

    if (!JFile::exists($YjsgJViewDefaultFile)) {
        $YjsgJViewDefault = JFile::read($YjsgJViewDefaultRead);
        $YjsgJViewDefault = str_replace('class ' . $isView, 'class Yjsg' . $isView . 'Default', $YjsgJViewDefault);
        JFile::write($YjsgJViewDefaultFile, $YjsgJViewDefault);
    }

    require_once($YjsgJViewDefaultFile);
    jimport('joomla.application.component.view');
    JLoader::register($isView, YJSGEXTEND . $IsJversion . '/component/view.php', true);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.