Як перекрити основні класи?


20

Іноді виникає необхідність переосмислити основні класи, щоб отримати більше функціональних можливостей або змусити деякі основні функції працювати іншим чином. Чи є спосіб перемогти основні класи? Якщо це можливо, то з якими проблемами я можу зіткнутися, відмінивши їх?


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

Для користувачів Joomla 3 - перевірте це. Це допоможе тобі. joomla.stackexchange.com/questions/5449 / ... Plugin - github.com/ghazal/plg_mvcoverride Завдяки joomla.stackexchange.com/users/270/ghazal
Ча

Відповіді:


16

Так, це можливо.

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

Дві проблеми, з якими ви зіткнетеся:

  1. вам потрібно перекрити весь клас (а не лише його частини)

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


4
Було б корисно, якщо ви зможете вставити відповідні кроки з наданих посилань або принаймні дати опис посилань у разі їх переміщення чи зміни.
кодування руками

10

Нещодавно я створив плагін, який дозволяє переосмислити основні класи, але він все ще стає здобиччю проблем, на які @jackJoe вказав у своїй відповіді. Однак це дозволяє робити переоцінки чисто.

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


7
Просто хочу сказати, що це рішення прекрасно працює, і що Дон - це справжній споріднений дух з відкритим кодом - шапки на нього та його роботи !!!
ВВП

Існує істотна проблема з вашим простим сценарієм, полягає в тому, що він не попередньо завантажує компоненти. Отже, якщо ви переосмислюєте компоненти, це дійсно не працює для більшості з них (наприклад, компонент com_content). Він працює добре, але він повинен попередньо завантажити компонент, щоб він міг їх переосмислити (ви не можете перекрити те, що ще не було оголошено). О, і ви повинні використовувати onAfterRoute, а не робити все це в конструкторі. Якщо ви хочете знати, що я маю на увазі під цим коментарем, спробуйте переосмислити components/com_content/models/articles.php.
іктоктоп


4

Я був на цьому дуже довго і пообіцяв Дону, що як тільки я закінчу, дам більше деталей про це.

Мені потрібно було замінити Joomla MVC на компоненти і сказати Joomla шукати заміни в моїй html-папці плагіна, не тільки всередині теки html-папки.

Що мені ніколи не подобалося, коли розробники насправді беруть клас Joomla за замовчуванням і возиться з ним, тому я швидше розширюю цей клас, якщо можу, замість чогось гальмувати.

Мій процес робить наступне.

  1. Отримайте клас, який мені потрібно перекрити
  2. Прочитайте його, замініть ім’я класу, створіть новий файл у моїй папці temp class
  3. Завантажте мою версію класу
  4. Завантажте клас Joomla
  5. Зареєструйте мій метод розширення, який розширює функцію loadTemplate, щоб шукати заміни в моєму плагіні, ніж шаблон Joomla та останній компонент Joomla

ось зображення, а не http://prntscr.com/3d9syq

Перші частини фрагмента нижче - це перевірка, де знаходиться користувач, якщо він збирається оновити Joomla, я видаляю файли класу temp, які були створені, щоб переконатися, що ми отримаємо свіжі, коли оновлення завершено, а чим піклується про номер 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.